2017-08-17 4 views
1

Je travaille sur un projet d'école au moment où vous répondez à des questions de difficulté variable pour gagner. J'utilise Pygame pour créer ceci aux côtés de Python et j'ai rencontré un problème avec lequel je ne vois pas le problème, je me demandais si quelqu'un pouvait faire la lumière!Problèmes de boucle de Pygame

Le problème est avec les boucles de jeu que je utilise. Lorsque le jeu est lancé un écran de titre se charge, avec de la musique et un ensemble de boutons à l'écran. Si ces boutons sont survolés ils changent de couleurs différentes pour signifier ceci. Actuellement, je joue avec le bouton de lecture, et je veux que cela vous amène à un nouvel écran. À l'heure actuelle, j'avais cette configuration afin de vous sortir de la boucle de l'écran de titre et de vous mettre sur un fond de Sarcelle avec rien d'autre pour le moment. Cependant, bien que le bouton est clairement enregistré comme cliqué, le jeu semble garder la boucle Intro intacte et ne change pas à la nouvelle boucle qui doit être satisfaite, « Play clicked »

Mon code est le suivant:

import pygame, sys 
from pygame.locals import * 
pygame.init() 

#Initialises the music mixer and then loads the music 
#file from the directory of the executable, sets the volume 
#and sets it to infinite loop 
pygame.mixer.init() 
pygame.mixer.music.load("Wepa.mp3") 
pygame.mixer.music.set_volume(0.4) 
pygame.mixer.music.play(-1,0.0) 
#-1 Causes an infinite loop. 
#The track starts at the beginning, 0.0. 

#Sets the cursor to be visible 
pygame.mouse.set_visible 

#Sets the FPS 
FPS = 60 
fpsClock = pygame.time.Clock() 

#Creates a display surface, the main window for the game, and sets a title. 
DISPLAYSURF = pygame.display.set_mode((800, 600)) 
#Resolution of 800x600. 
pygame.display.set_caption("Maths Mania") 

#Creates a background colour, I used teal simply to test if it's working 
#as the base colour of the window is black anyway. 
TEAL = (0, 128, 128) 

#Gets the title screen image from the same directory as the executable 
#and sets the coordinates of the top left corner, in this case, the top left 
#of DISPLAYSURF, therefore 0,0. 
TitleScreen = pygame.image.load('TitleScreenButtonless.png') 
Titlex=0 
Titley=0 

#Creates sprites for the individual buttons on the title screen and sets their top left 
#corner. 
PlayButton=pygame.image.load('PlayButton.png') 
PlayButtonx=284 
PlayButtony=235 

PlayButtonHovered=pygame.image.load('PlayButtonHovered.png') 
PlayButtonHoveredx=284 
PlayButtonHoveredy=235 

OptionsButton=pygame.image.load('OptionsButton.png') 
OptionsButtonx=284 
OptionsButtony=329 

OptionsButtonHovered=pygame.image.load('OptionsButtonHovered.png') 
OptionsButtonHoveredx=284 
OptionsButtonHoveredy=329 

QuitButton=pygame.image.load('QuitButton.png') 
QuitButtonx=284 
QuitButtony=425 

QuitButtonHovered=pygame.image.load('QuitButtonHovered.png') 
QuitButtonHoveredx=284 
QuitButtonHoveredy=425 

Intro=True 
PlayClicked=False 

def PlayButtonClicker(PlayButtonx,PlayButtony,width,height,action=None): 
    cursor=pygame.mouse.get_pos() 
    click=pygame.mouse.get_pressed() 
    if (PlayButtonx+width)>cursor[0]>PlayButtonx and (PlayButtony+height)>cursor[1]>PlayButtony: 
     DISPLAYSURF.blit(PlayButtonHovered, (PlayButtonx, PlayButtony)) 
     if click[0]==1 and action!=None: 
      if action=="quit": 
       pygame.quit() 
       quit() 

      elif action=="Playbutton": 
       print("1") 
       PlayClicked==True 
       Intro==False 

def OptionsButtonClicker(OptionsButtonx,OptionsButtony,width,height,action=None): 
    cursor=pygame.mouse.get_pos() 
    click=pygame.mouse.get_pressed() 
    if (OptionsButtonx+width)>cursor[0]>OptionsButtonx and (OptionsButtony+height)>cursor[1]>OptionsButtony: 
     DISPLAYSURF.blit(OptionsButtonHovered, (OptionsButtonx, OptionsButtony)) 
     if click[0]==1 and action!=None: 
      if action=="quit": 
       pygame.quit() 
       quit() 

def QuitButtonClicker(QuitButtonx,QuitButtony,width,height,action=None): 
    cursor=pygame.mouse.get_pos() 
    click=pygame.mouse.get_pressed() 
    if (QuitButtonx+width)>cursor[0]>QuitButtonx and (QuitButtony+height)>cursor[1]>QuitButtony: 
     DISPLAYSURF.blit(QuitButtonHovered, (QuitButtonx, QuitButtony)) 
     if click[0]==1 and action!=None: 
      if action=="quit": 
       pygame.quit() 
       quit() 

while Intro==True: #THIS IS THE MAIN GAME LOOP, EVERYTHING IN THIS LOOP IS THE GAME  

    DISPLAYSURF.fill(TEAL) 
    #Fills the display window with the background colour 
    DISPLAYSURF.blit(TitleScreen, (Titlex, Titley)) 
    #Fills the display window with the TitleScreen image and tells it 
    #where to place the top left corner of said image. 

    #Places the buttons on the title screen 
    DISPLAYSURF.blit(PlayButton, (PlayButtonx, PlayButtony)) 
    DISPLAYSURF.blit(OptionsButton, (OptionsButtonx, OptionsButtony)) 
    DISPLAYSURF.blit(QuitButton, (QuitButtonx, QuitButtony)) 

    PlayButtonClicker(284,235,231,64,action='Playbutton') 
    OptionsButtonClicker(284,329,231,64,action='Optionsbutton') 
    QuitButtonClicker(284,425,231,64,action='Quitbutton') 




#The following lines check each event that happens in the game. If any of those 
#events should be to quit, the game exits. 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 

#These couple lines update the display and the FPS clock. 
    pygame.display.update() 
    fpsClock.tick(FPS) 


while PlayClicked==True: 

    DISPLAYSURF.fill(TEAL) 
    Nonsense=pygame.image.load('Nonsense.png') 
    Nonsensex=0 
    Nonsensey=0 
    DISPLAYSURF.blit(Nonsene, (Nonsensex, Nonsensey)) 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 

    pygame.display.update() 
    fpsClock.tick(FPS) 
+0

S'il vous plaît réduire le code que vous publiez ici au [minimum] (https://stackoverflow.com/help/mcve) et remplacer les images par 'pygame.Surface's que vous remplissez avec un peu de couleur, par exemple 'image = pygame.Surface ((30, 50))' et ensuite 'image.fill ((30, 90, 150))'. – skrx

Répondre

1
 elif action=="Playbutton": 
      print("1") 
      PlayClicked==True 
      Intro==False 

Modifier cette façon que vous utilisez un seul signe = au lieu de == pour PlayClicked et Intro. On peut supposer que vous essayez de définir la valeur de ces variables au lieu de vérifier l'égalité: P

0

Vous devez déclarer la PlayClicked et Intro comme des variables globales, et faire ce que vous a dit Astrolab et changer la double ==-=.

Cependant, les variables globales devraient généralement être évités, car ils font souvent du code plus difficile à comprendre et plus d'erreurs, il serait donc préférable de restructurer le programme.

def PlayButtonClicker(PlayButtonx,PlayButtony,width,height,action=None): 
    global PlayClicked 
    global Intro 
    cursor=pygame.mouse.get_pos() 
    click=pygame.mouse.get_pressed() 
    if (PlayButtonx+width)>cursor[0]>PlayButtonx and (PlayButtony+height)>cursor[1]>PlayButtony: 
     DISPLAYSURF.blit(PlayButtonHovered, (PlayButtonx, PlayButtony)) 
     if click[0]==1 and action!=None: 
      if action=="quit": 
       pygame.quit() 
       sys.exit() 
      elif action=="Playbutton": 
       print("1") 
       PlayClicked = True 
       Intro = False 
+0

Si vous voulez obtenir des conseils de refactoring, postez votre code sur http://codereview.stackexchange.com/ mais assurez-vous qu'il est complet et fonctionne correctement. – skrx