2017-04-23 9 views
0

私は自分のゲームにある種のメニューナビゲーションシステムを作成しました。 「再生」と「終了」と「コントロール」ボタンは正常に機能しますが、コントロール画面からメニューを押すと何も起こりません。コントロール画面では、最初のメニュー画面をかすかに見ることができます。それは問題かもしれません。メニューボタンへのリターンは前のコントロールのページボタンの上にあるので、何とか前からコントロールボタンを押していると思います。私のコードのボタンとメニューセグメントがここに貼り付けられ、すべてがペーストビンに貼り付けられます。ゲームのボタンが動作しない

def text_to_button(msg,color,buttonx,buttony,buttonwidth,buttonheight,size = "small"): 
textSurf, textRect = text_objects(msg,color,size) 
textRect.center = ((buttonx + buttonwidth/2)), buttony+(buttonheight/2) 
gameDisplay.blit(textSurf, textRect) 

def button(text,x,y,width,height,inactive_color,active_color,size = "small",action = None): 
cur = pygame.mouse.get_pos() 
click = pygame.mouse.get_pressed() 
#print(click) 
if x + width > cur[0] > x and y + height > cur[1] > y: 
    pygame.draw.rect(gameDisplay, active_color,(x,y,width,height)) 
    if click[0] == 1 and action != None: 
     if action == "quit": 
      pygame.quit() 
      quit() 
     if action == "controls": 
      game_controls() 

     if action == "play": 
      gameLoop() 
     if action == "main": 
      game_intro() 

else: 
    pygame.draw.rect(gameDisplay, inactive_color,(x,y,width,height)) 
text_to_button(text,black,x,y,width,height,size) 

def game_controls(): 
gcont = True 
while gcont: 
    gameDisplay.blit(cont,(0,0)) 

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


    button("Play",150,500,100,50,white,gray,"small",action = "play") 
    button("Main Menu",320,500,150,50,white,gray,"tiny", action = "main") 
    button("Quit",550,500,100,50,white,gray,"small", action = "quit") 


    pygame.display.update() 
    clock.tick(15) 

def game_intro(): 
intro = True 
while intro: 

    gameDisplay.blit(imggg,(0,0)) 

    button("Play",150,500,100,50,white,gray,"small",action = "play") 
    button("ControLs",320,500,150,50,white,gray,"tiny", action = "controls") 
    button("Quit",550,500,100,50,white,gray,"small", action = "quit") 







    pygame.display.update() 
    clock.tick(15) 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 
    if event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_p: 
      intro = False 

全コード:https://pastebin.com/jrd82gkJ

答えて

1

あなたは1つの単純な理由のために必要な動作を実現するために、あなたのコードをデバッグするのに非常に苦労しています。

スイッチに使用ロジックさまざまな機能を提供する異なる画面間で大きな問題が発生している場合は、ゲームを実行するかどうかを直接確認することはできません。

あなたはこう思っています:「ああ...ボタンが機能しないのはどうしたら、ボタンに問題があるはずか」

独自のwhileループを持つ関数を使用すると、あるビューから別のビューに切り替えるたびに再帰呼び出しが深くなり、再帰呼び出しが深くなり深刻になるという事実に気づいていないかもしれません。pygameがプログラムされる方法ではありません。

いくつかのprint()コマンドをコードに追加して、コンソール出力で、コードが実際には動作しないと思っても、最初の一見で問題なく動作していることを確認することをお勧めします。あなたは

ONEメインwhile notGameExit:ループ

を持っており、ヘルパー関数でループ以外を使用しないように

は、その後、私はあなたの全体のコードを書き換える示唆しています。あなたのヘルパー関数でループを使用するには、ヘルパー関数から他の関数​​を独自のループで呼び出すのではなく、反復を避けるために明示的にreturnのRETURN関数を呼び出す必要があります。メインループに戻り、関数を呼び出すと、メインループが実行を継続し、いくつかのスイッチに応じて、画面上にさまざまなものを表示して、ユーザーの動作とは異なる反応をすることができます。

ループを使わずに「アクション」を表示する最小の作業用ファイトスクリプトを見ると、より良い理解と、パイゲームの仕組みに関する深い「啓蒙」を得ることができます。次に、このような別のアプローチを使用して、現在のコードで使用していたもの?さらに質問があれば、あなたが達成したことを元に戻ってください。しかし、コードがもっと簡単になるならば、自分でデバッグするほうがずっと簡単なので、おそらく何も持っていません。

は:)

import pygame 

pygame.init() # start PyGame (necessary because 'import pygame' doesn't start PyGame) 
winDisplay = pygame.display.set_mode((1024, 768)) # set PyGame window size to 1024x768 pixel 

pygame.display.set_caption("Minimal PyGame Test Script") 
# Time in pygame is measured in milliseconds (1/1000 seconds) (defined by TIMER_RESOLUTION constant): 
pygame.TIMER_RESOLUTION = 1000 # assure 1000 explicit, don't relay on default value 

colorWhite = (255, 255, 255) # RGB color in Pygame format (valueRed=255, valueGreen=255, valueBlue=255) 
colorRed = (255, 0, 0) 
colorGreen = ( 0, 255, 0) 
colorBlue = ( 0, 0, 255) 

winDisplay.fill(colorWhite) 
pygame.display.update() 
pygame.time.wait(3000) # show the Pygame window for 3 seconds 
winDisplay.fill(colorRed) 
pygame.display.update() 
pygame.time.wait(3000) # show the Pygame window for 3 seconds 
winDisplay.fill(colorGreen) 
pygame.display.update() 
pygame.time.wait(3000) # show the Pygame window for 3 seconds 
winDisplay.fill(colorBlue) 
pygame.display.update() 
pygame.time.wait(3000) # show the Pygame window for 3 seconds 
winDisplay.fill(colorWhite) 
pygame.display.update() 
pygame.time.wait(3000) # show the Pygame window for 3 seconds 
+0

をコーディングする楽しみを持ってありがとうございました。私はまだ2ヶ月前からコーディングを始めたばかりです。なぜ私はそれが働いていないのかを知りました。私はそれが働くようになっているが、時にはボタンを2〜3回押す必要がある。私は今すぐコードをデバッグしようとしています – PikachuPopcorn

+0

あなたは大歓迎です。奇妙な振る舞いは、ボタンの押下で発生する再帰呼び出しのランダムなタイミングに由来します(したがって、時には2,3回、ランダムのみ)。それは適切に動作するように見えますが、十分に頻繁にビューを切り替えると、「再帰深度を超過しています」というエラーが発生します(実際には起こりません - 前にビューを切り替えるのが疲れます)。 – Claudio

関連する問題