I am attempting to switch the background only if a certain number of collisions (or hits on the balloons) is detected. The collisions are between a gun and 7 balloons blitted on the screen.
Note: The collision works perfectly fine.
Currently, 7 balloons show up and each time I hit a balloon it switches backgrounds. What should happen is when you hit 1 balloon out of 7 on the first background, it changes to the second background where you hit 1 balloon again out of the 7 displayed. When you hit a balloon on the second background, it changes back to the first. Then (back on the first background) you hit 2 balloons (out of 7), where it then changes to the second background where you hit 2 balloons again, and so on. So the number of hits should be like 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7; (out of 7 total displayed balloons) where the first number in each pair is the number of hits in the first background and the second is the new background.
This is what changes the background:
for balloon_list_index in num_balloon_list:
balloon_list_index = 1
bg_bool = not bg_bool
And this is the list of the number of hits needed:
num_balloon_list = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7]
Here is my full code:
import pygame as pg
import random as r
import sys
pg.init()
bg = pg.image.load('bg.jpg') # Background Image #
bg = pg.transform.scale(bg, (688, 387))
new_bg = pg.image.load('new_bg.jpg')
new_bg = pg.transform.scale(new_bg, (688, 387))
radius = 30
diameter = 2 * radius
num_balloons = 7
bullets_colors_ls = []
iterator = -1
num_balloon_list = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7]
balloon_list_index = 0
def create_balloons():
global balloon_list
global colors
for i in range(num_balloons):
while True:
candidate = r.randint(0, 500)
if all(abs(candidate - x) >= diameter for x in balloon_list):
break
balloon_list.append(candidate)
def draw_balloons(y):
for i in range(num_balloons):
screen.blit(colors[i], (balloon_list[i], y - 50))
def check_collisions(x, y):
global hit_var
global hit
global score
global scoretext
global bg_bool
global num_balloon_list, balloon_list_index
for i in range(num_balloons):
gun_rect = gun.get_rect(topleft=(x, y))
gun_mask = pg.mask.from_surface(gun)
balloon_rect = colors[i].get_rect(topleft=(balloon_list[i], y - 100))
balloon_mask = pg.mask.from_surface(colors[i])
offset = (balloon_rect.x - gun_rect.x), (balloon_rect.y - gun_rect.y)
if gun_mask.overlap(balloon_mask, offset):
hit = True
for balloon_list_index in num_balloon_list:
balloon_list_index = 1
bg_bool = not bg_bool
hit_var = i
score = 2
scoretext = myfont.render("SCORE: " str(score), 1, (0, 0, 0))
print(f'hit balloon: {i}')
break
# Vars #
x = 0
y = 250
velocity = 5
score = 0
hit = False
bg_bool = False
testvar1 = True
clock = pg.time.Clock()
screen = pg.display.set_mode((688, 387)) # Size of the screen #
caption = pg.display.set_caption("Remember") # Title of the window #
balloon_list = []
b1 = pg.image.load('balloons/1.png').convert_alpha()
b1 = pg.transform.scale(b1, (63, 131))
b2 = pg.image.load('balloons/2.png').convert_alpha()
b2 = pg.transform.scale(b2, (63, 131))
b3 = pg.image.load('balloons/3.png').convert_alpha()
b3 = pg.transform.scale(b3, (63, 131))
b4 = pg.image.load('balloons/4.png').convert_alpha()
b4 = pg.transform.scale(b4, (63, 131))
b5 = pg.image.load('balloons/5.png').convert_alpha()
b5 = pg.transform.scale(b5, (63, 131))
b6 = pg.image.load('balloons/6.png').convert_alpha()
b6 = pg.transform.scale(b6, (63, 131))
b7 = pg.image.load('balloons/7.png').convert_alpha()
b7 = pg.transform.scale(b7, (63, 131))
colors = [b1, b2, b3, b4, b5, b6, b7]
gun = pg.image.load('game-gun.png').convert_alpha()
gun = pg.transform.scale(gun, (150, 150))
create_balloons()
pg.display.flip() # Updating #
running = True # Game loop bool #
while running: # Game loop #
clock.tick(60)
if bg_bool == False:
screen.blit(bg, (0, 0))
elif bg_bool == True:
screen.blit(new_bg, (0, 0))
screen.blit(scoretext, (5, 10))
if hit == True:
r.shuffle(balloon_list)
hit = False
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
sys.exit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
running = False
if event.key == pg.K_SPACE:
check_collisions(x, y)
draw_balloons(y)
keys = pg.key.get_pressed()
x = keys[pg.K_RIGHT] - keys[pg.K_LEFT] * velocity
x -= keys[pg.K_LEFT] - keys[pg.K_RIGHT] * velocity
screen.blit(gun, (x, y))
pg.display.update()
You can download all of the images here: Download images on Replit
balloons/
1.png
2.png
3.png
4.png
5.png
6.png
7.png
bg.jpg
game-gun.png
new_bg.jpg
How can I change the background after a certain number of collisions (hits on the balloons)?
P.S. I have asked a question that is a similar concept with a great answer, but I failed to implement it into this scenario.
CodePudding user response:
First, you need a global variable to track the number of hits.
num_balloons = 7
num_hits = 0 # Add this
When hit, update the number of balloons and the number of hits.
Then, compare the number of hits needed, and if the game has not ended:
- restore the number of balloons,
- reset the number of hits,
- increment the balloon list index to get the next number of hits needed, and