0

When I run this code, it enters a while loop and checks every turn whether or not on_title_screen==True. If it is true, the program will continue to check for input, but if it is false, the loop will refresh the screen and begin the game. However, when start is clicked, and on_title_screen=False, the game still captures mouse input, and does not display the bird that it should.

import random
import pygame
from pygame import *
import math
import sys
#Presets for window
size=width,height=500,500
Ag=-9.80665
clock = pygame.time.Clock()
white=(255,255,255)
blue=(0,0,255)
red=(255,0,0)
gray_bgColor=(190,193,212)
#Initialise pygame Surface as screen
pygame.init()
pygame.font.init()
screen=pygame.display.set_mode(size)
pygame.display.set_caption("Flappy Kid")
#Game Presets
vY=0
xPos,yPos=200,100
score=0

on_title_screen=True

def falling_loop():
    for event in pygame.event.get():
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_UP:
                vY=-10
    if yPos>height-50:
        yPos=100
    vY+=1
    yPos+=vY

class graphics():
    #Holds the methods for loading/displaying graphics
    def load_images(self):
        #Loads the background and sprite images
        self.background_image=pygame.image.load("flappy_background.png").convert()
        self.bird_image=pygame.image.load("flappy_sprite.jpg").convert()
        screen.set_colorkey(white)
        self.birdHitBox=self.bird_image.get_rect()
    def show_background(self):
        #blits the background
        screen.blit(self.background_image,[0,0])
    def refresh_display(self):
        #updates the display
        screen.blit(self.background_image,[xPos,yPos],self.birdHitBox)
        falling_loop()
        screen.blit(self.bird_image,[xPos,yPos])

class titleScreen():
    #Holds the methods for the title screen/menu
    def title(self):
        #Sets up the title
        titleText="Flappy Game"
        titlePos=(0,0)
        currentFont=pygame.font.SysFont("arialms",30,bold=True,italic=True)
        renderTitle=currentFont.render(titleText,1,blue,gray_bgColor)
        self.titlex,self.titley=currentFont.size(titleText)
        screen.blit(renderTitle,titlePos)
    def start(self):
        #Sets up the start Button
        startText="Start Game"
        self.startPos=(0,self.titley)
        currentFont=pygame.font.SysFont("arialms",25,bold=False,italic=False)
        renderStart=currentFont.render(startText,1,blue,gray_bgColor)
        self.startx,self.starty=currentFont.size(startText)
        self.start_rect = pygame.Rect(self.startPos[0],self.titley,self.startx,self.starty)
        screen.blit(renderStart,self.startPos)
    def quit(self):
        #Sets up the quit button
        quitText="Quit"
        self.quitPos=(0,self.starty+self.titley)
        currentFont=pygame.font.SysFont("arialms",25,bold=False,italic=False)
        renderQuit=currentFont.render(quitText,1,red,gray_bgColor)
        self.quitx,self.quity=currentFont.size(quitText)
        self.quit_rect = pygame.Rect(self.quitPos[0],self.titley+self.starty,self.quitx,self.quity)
        screen.blit(renderQuit,self.quitPos)
    def get_click(self):
        #Gets mouse click and processes outcomes
        for event in pygame.event.get():
            if event.type==pygame.MOUSEBUTTONDOWN:
                x,y=pygame.mouse.get_pos()
                #Tests for start:
                if self.start_rect.collidepoint(x,y):
                    print("start")
                    on_title_screen=False
                elif self.quit_rect.collidepoint(x,y):
                    print("quit")
                    sys.exit()

titleC=titleScreen()
graphicsC=graphics()
def setupTitle():
    #bundles all title_screen functions
    titleC.title()
    titleC.start()
    titleC.quit()

def main():
    graphicsC.load_images()
    graphicsC.show_background()
    setupTitle()
    while True:
        clock.tick(30)
        if on_title_screen==False:
            graphicsC.refresh_display()
        elif on_title_screen==True:
            titleC.get_click()
        pygame.display.flip()

main()
1
  • First guess: you've got a scoping error and you get two things both called on_title_screen, in two different places, with different values. Google Python Scoping, the 'globals' keyword, and instance variables... Commented Nov 25, 2014 at 1:55

1 Answer 1

2

I think @TessellatingHeckler is right, on_title_screen is a shadow variable, not the same.

In this code, there is nowhere that on_title_screen (global) could ever be set to False.

A more powerful answer though is to explain how to find the problem. I strongly recommend using pdb or ipdb. In this case, I would put one just inside of the while loop and make sure that the variables are what I think they should be.

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.