Home > Back-end >  How to display the correct amount of images after each collision?
How to display the correct amount of images after each collision?

Time:09-27

I am trying to display the right amount of balloons (the images) each time a collision is detected. Note the collision works perfectly fine, but I am having trouble figuring out how to display the correct amount of balloons.

The collision is between 7 balloons and a gun. When the balloon is hit by the gun one less balloon is showed up. What should happen is when one of the 7 balloons is hit on the first background, one balloon should disappear, and a new background should show up with the same 7 balloons. Then, on the new background, if a balloon is being hit, the balloon should disappear and go back to the first background. Then on the first background again, should appear 6 balloons this time and when a balloon is hit, one should disappear and then the new background shows up also with 6 balloons. This should go on until all of the balloons are gone.

So the number of balloons should be like 7,7 6,6 5,5 4,4 3,3 2,2 1,1; where the first number in each pair is the first background and the second is the new background.

Here is my 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




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
    
    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):
            bg_bool = True
            hit_var = i
            print(f'hit balloon: {i}')
            colors[i].fill((0,0,0,0))
            screen.fill((0,0,0,0))

            


            


        


        
# Vars #
x = 0
y = 250
velocity = 5
score = 0

bg_bool = False

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)
    #Background switching code#
    if bg_bool == False:
        screen.blit(bg, (0, 0))
        
    elif bg_bool == True:
        screen.blit(new_bg, (0,0))


            
    
    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 REPL

How can I properly show the right amount of balloons each time the background is switched?

Appreciate any help, Thank you

CodePudding user response:

The answer is hidden in the question:

[...] the number of balloons should be like 7,7 6,6 5,5 4,4 3,3 2,2 1,1

Create a list with the number of balloons and a variable that states the current index in the list:

num_ballon_list = [7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0]
ballon_list_index = 0
num_balloons = num_ballon_list[ballon_list_index]

If a collision is detected, increment ballon_list_index and get the new number from the list:

def check_collisions(x, y):
    global hit_var
    global hit
    global score
    global scoretext
    global bg_bool
    global num_balloons, ballon_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):
            
            bg_bool = not bg_bool
            ballon_list_index  = 1
            if ballon_list_index < len(num_ballon_list):
                num_balloons = num_ballon_list[ballon_list_index]

            hit_var = i
            print(f'hit balloon: {i}')
            break

If num_balloons is 0, the game is over.

  • Related