Haadi Khan
Haadi Khan

Reputation: 21

pipes spawning too fast in flappy bird pygame

Im working on this flappy bird pygame tutorial and when I tested the code the pipes spawned in too fast. I'm using a tutorial since I'm fairly new to python and would appreciate any help. Thanks. Here is the link to the tutorial website: https://github.com/clear-code- projects/FlappyBird_Python/blob/master/flappy.py

Here is the code I have so far.

import pygame
import sys
import os
from random import randint


def draw_floor():
    screen.blit(floor_surface,(floor_x_pos,750))
    screen.blit(floor_surface,(floor_x_pos + 576,750))


def create_pipe():
    new_pipe = pipe_surface.get_rect(midtop = (288,375))
    return new_pipe

def move_pipes(pipes):
    for pipe in pipes:
        pipe.centerx -= 5
    return pipes

def draw_pipes(pipes):
    for pipe in pipes:
        if pipe.bottom >= 750:
            screen.blit(pipe_surface,pipe)

pygame.init()
screen = pygame.display.set_mode((576,855))
clock = pygame.time.Clock()

# Game variables
gravity = 0.25
bird_movement = 0

bg_surface = pygame.transform.scale2x(pygame.image.load(os.path.join('imgs','bg.png')).convert_alpha())

floor_surface = pygame.transform.scale2x(pygame.image.load(os.path.join('imgs','base.png')).convert_alpha())
floor_x_pos = 0

bird_surface = pygame.transform.scale2x(pygame.image.load(os.path.join('imgs','bird2.png')).convert_alpha())
bird_rect = bird_surface.get_rect(center = (100,427))


pipe_surface = pygame.transform.scale2x(pygame.image.load(os.path.join('imgs','pipe.png')))
pipe_list = []
SPAWNPIPE = pygame.USEREVENT
pygame.time.set_timer(SPAWNPIPE,5000)
pipe_height = [300,500,700]

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                bird_movement = 0
                bird_movement -= 12

    if event.type == SPAWNPIPE:
        pipe_list.extend(create_pipe())
        
            
    # bird
    screen.blit(bg_surface,(0,0))

    bird_movement += gravity
    bird_rect.centery += int(bird_movement)
    screen.blit(bird_surface,bird_rect)

    # pipes
    pipe_list = move_pipes(pipe_list)
    draw_pipes(pipe_list)

    
    floor_x_pos -= 1
    draw_floor()
    if floor_x_pos <= -576:
        floor_x_pos = 0


    pygame.display.update()
    clock.tick(120)`

Upvotes: 1

Views: 291

Answers (2)

Kingsley
Kingsley

Reputation: 14916

The issue is that once you get the first SPAWNPIPE event, the event.type condition for adding a new pipe becomes True.

However, due to improper indentation, that condition is repeatedly checked every frame until the next event is received. This means the code is continually spawning pipes every frame during this time.

Fix the indentation, to bring the pipe-event check back inside the event for-loop:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                bird_movement = 0
                bird_movement -= 12

        if event.type == SPAWNPIPE:                        # <<-- HERE  
            pipe_list.extend(create_pipe())                # <<-- AND HERE

Which makes the SPAWNPIPE check be performed only when the event is actually received.

Upvotes: 2

Mike67
Mike67

Reputation: 11342

Indent the SPAWNPIPE check:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                bird_movement = 0
                bird_movement -= 12

        if event.type == SPAWNPIPE:    # indent this
             pipe_list.extend(create_pipe())

Upvotes: 2

Related Questions