Home > database >  Change background after a certain number of collisions in pygame
Change background after a certain number of collisions in pygame

Time:09-30

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
  • Related