1

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)`
Haadi Khan
  • 21
  • 1

2 Answers2

2

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())
Mike67
  • 11,175
  • 2
  • 7
  • 15
  • thank you alot. This is my first stack overflow question and how u guys helped me so quick makes me want to use stack overflow more. thanks – Haadi Khan Jul 29 '20 at 14:27
  • Please accept an answer so this post is removed from the "No Answer" list. Thanks. – Mike67 Sep 01 '20 at 17:43
2

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.

Kingsley
  • 14,398
  • 5
  • 31
  • 53