Tallik
Tallik

Reputation: 11

Pygame program stopping/crashing without any error logged

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.

Upvotes: 1

Views: 148

Answers (1)

Rabbid76
Rabbid76

Reputation: 210878

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)

Upvotes: 1

Related Questions