1

As a beginner im trying to create flappy bird to learn the basics of python and pygame. But when i run this code and click the button that is created the code just stops and python becomes not responsive. Does any one know why?

import pygame
import math
import random
import pyautogui as pg

pygame.init()

screenWidth, screenHeight = pg.size()

gameDisplay = pygame.display.set_mode((screenWidth, screenHeight), pygame.FULLSCREEN)
pygame.display.set_caption("Flappy by Tallik")

time = pygame.time.Clock()
crashed = False


bg = (0, 0, 0)
textSize = 32
font = pygame.font.Font("freesansbold.ttf", textSize)
buttonClicked = [0, 0]
mainGame = False
titleScreen = True
settings = False
changeBird = False
dead = False
phase = 1
def buttonFunc(x, y, width, height, color1, color2, text, textColor, textColor2,  buttonNum, dissaperance):
    global buttonClicked
    mouseClick = pygame.mouse.get_pressed()
    mouseX, mouseY = pygame.mouse.get_pos()
    buttonText = font.render(str(text), True, textColor)
    buttonText2 = font.render(str(text), True, textColor2)
    textX = x + 10
    textY = y + (height//3)
    buttonClicked = [0, buttonNum]


if mouseX >= x and mouseX <= x + width and mouseY >= y and mouseY <= y + height:
    pygame.draw.rect(gameDisplay, (color2), (x, y, width, height))
    gameDisplay.blit(buttonText2, (textX, textY))
    if mouseClick[0] == True:
        buttonClicked[0] = 1
        if dissaperance == False:
            pygame.draw.rect(gameDisplay, (color2), (x, y, width, height))
            gameDisplay.blit(buttonText2, (textX, textY))
            buttonClicked[0] = 1
        else:
            gameDisplay.fill(bg)
else:
    pygame.draw.rect(gameDisplay, (color1), (x, y, width, height))
    gameDisplay.blit(buttonText, (textX, textY))




class bird(object):
    def __init__(self, birdVelMultiplier, skin, width, height):
        self.birdVelMultiplier = birdVelMultiplier
        self.skin = skin
        self.grav = -1
        self.height = height
        self.width = width
        self.y = screenHeight//2
        self.x = screenWidth//30
        self.vel = screenHeight//100
        self.jumps = 0
        self.minVel = -20
        self.maxVel = 20
    
    

def jump(self):

    if keys[pygame.K_SPACE] and self.jumps == 0:
        self.vel = -15
        self.jumps += 1

    if keys[pygame.K_UP] and self.jumps == 0:
        self.vel = -15
        self.jumps += 1


    if not keys[pygame.K_UP] and not keys[pygame.K_SPACE]:
        self.jumps = 0
  
    

def drawToGame(self, gameDisplay):
    
    if self.y + self.height <= screenHeight:
        if self.y >= 0:
            if self.vel < self.maxVel and self.vel > self.minVel:
                self.vel -= self.grav
                self.y += self.vel
            else: 
                if abs(self.vel)/self.vel == 1:
                    self.vel = self.maxVel
                    self.vel -= self.grav
                    self.y += self.vel
                else:
                    self.vel = self.minVel
                    self.vel -= self.grav
                    self.y += self.vel
        else:
            self.y = 0
            self.vel = 1
    else:
        self.y = screenHeight//2
        self.vel = 0
        

    pygame.draw.rect(gameDisplay, (0, 0, 255), (self.x, self.y, self.width, self.height))


class obstacle(object):
    def __init__(self, speedMultiplier, width):
        self.speedMultiplier = speedMultiplier
        self.width = width
        self.ranHeight = random.randrange(50, screenHeight - (screenHeight//16)*4)
        self.ranHeight2 = (screenHeight - self.ranHeight) - 150
    


def spawn(self):
    print(1)


def drawToSurface(self, gameDisplay):
    print(3)

    
    

bird1 = bird(1, 1, 60, 60)
pipe = obstacle(1, 130) 
sB = bird1
while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True
    gameDisplay.fill(bg)
    keys = pygame.key.get_pressed()
    if buttonClicked == [1, 1]:
        phase = 4   
    if phase == 1:
        buttonFunc(screenWidth//2, screenHeight//4, screenWidth//18, screenHeight//20, (115, 115, 115), (85, 85, 85), "Start!", (0, 0, 0), (0, 0, 0), 1, True)
    elif phase == 2:
        print("?")
    elif phase == 3:
        print("??")
    elif phase == 4:
        while dead == False:
            sB.jump()
            sB.drawToGame(gameDisplay)




    pygame.display.update()
    time.tick(30)
pygame.quit()
quit()

To specify: after i have pressed the button created by buttFunc and the phase variable gets to 4 the program just stops and no eroor message is recieved. Also when closing the program the IDLE shell says the program is still running. I posted all the code because i dont know what made it break.

3
  • Given that you're a beginner, this is a great time for you to learn the best way to ask a question. Are you familiar with a minimal complete example? It's also a great way of debugging your code. What's the smallest portion of code you can come up with that shows the same problem? It will a) be easier for one of us to help you with and b) increase the chances of you finding the bug on your own. Commented Aug 2, 2021 at 16:05
  • when you run while dead == False then it can't run other code so it doesn't run for event-loop and it can't response. And on some systems when you don't get events from system then system may think that program hangs and it may kill it. Commented Aug 2, 2021 at 16:57
  • Thank you! And i will think about using minimal complete example for debugging Commented Aug 2, 2021 at 17:28

1 Answer 1

1

The program does not "crash", you just have an infinite loop. You do not need a loop that controls the game in the application loop. The application loop is continuously executed. Remove while dead == False::

while not crashed and not dead:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True
    gameDisplay.fill(bg)
    keys = pygame.key.get_pressed()
    if buttonClicked == [1, 1]:
        phase = 4   
    if phase == 1:
        buttonFunc(screenWidth//2, screenHeight//4, screenWidth//18, screenHeight//20, (115, 115, 115), (85, 85, 85), "Start!", (0, 0, 0), (0, 0, 0), 1, True)
    elif phase == 2:
        print("?")
    elif phase == 3:
        print("??")
    elif phase == 4:
        sB.jump()
        sB.drawToGame(gameDisplay)

    pygame.display.update()
    time.tick(30)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.