Andrew Lalis
Andrew Lalis

Reputation: 974

python if statement fails to compute compound logic

Here is all the code in my program, but look at the get_click() method in the titleScreen() class. With testing, I concluded that the method does log my mouse clicks, but will not process the coordinates returned in the if statements to produce an outcome(in this case, just print which button was pressed). Why would it not work?

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

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])

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)
        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)
        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 (x>self.startPos[0] and x<self.startx) and (y>self.startPos[1] and y<self.starty):
                    #on_title_screen=False
                    print("start")
                #Tests for quit:
                elif (x>self.quitPos[0] and x<self.quitx) and (y>self.quitPos[1] and y<self.quity):
                    #sys.exit()
                    print("quit")

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 not on_title_screen:
            for event in pygame.event.get():
                if event.type==pygame.KEYDOWN:
                    if event.key==pygame.K_UP:
                        vY=-10
            if y>height-50:
                y=100
            vY+=1
            y+=vY
        elif on_title_screen:
            titleC.get_click()
        pygame.display.flip()

main()

Upvotes: 0

Views: 59

Answers (1)

f.rodrigues
f.rodrigues

Reputation: 3587

Your conditions don't meet to produce the output.

If I do this and click on the 'Start Game'

for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            x, y = pygame.mouse.get_pos()
            print x,y, self.startPos[0], self.startx, self.startPos[1], self.starty

I get '39 31 0 100 21 18'

x = 39
y = 31
self.startPos[0] = 0
self.startx = 100
self.startPos[1] = 21
self.starty = 18

The 'x' conditions is fine(as far as I can see). While the 'y' is messed

(x > self.startPos[0] and x < self.startx): 
( 39 > 0 and 39 < 100): 
(true and true) = True

(y > self.startPos[1] and y < self.starty): 
(31 > 21 and 31 < 18): 
(true and false) = False

'y'[31] can't be lesser than 18 AND greater than 21 so the condition is never met.

self.startPos1 should be 21 and self.starty should be 32.

You should be more carefull with your variables naming, they are misleading, also, pygame has a rectangle property that is ideal for this kind of behavior that you are aiming.

Upvotes: 1

Related Questions