我在游戏中创建了某种菜单导航系统。所有屏幕都是blitted。“播放”和“退出”和“控制”按钮工作正常,但当我尝试从控制屏幕按菜单时,没有任何反应。在控制屏幕上,您可以隐约看到之前的第一个菜单屏幕。这可能是问题所在。我认为,当返回菜单按钮超过之前的控制页面按钮时,它会以某种方式按下之前的控制按钮。我的代码的按钮和菜单段将粘贴在这里,完整的东西将粘贴在pastebin中。
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
答案 0 :(得分:1)
由于一个简单的原因,您将很难调试代码以实现所需的行为:
用于在提供不同功能的不同屏幕之间切换的逻辑导致很多麻烦,你不能直接看到你是否只运行游戏。
所以你想:“哦......按钮怎么不起作用,按钮一定有问题”。
你可能没有意识到使用具有自己的while循环的函数你会越来越深入地进行递归调用,每次从一个视图切换到另一个视图时递归深度递增 - 这不是pygame被认为是如何被编程的。
我建议你在你的代码中添加一些print()
命令,以便在控制台输出中看到代码并没有真正按照你的意愿行事,即使它乍一看似乎没问题,因为它有效。
然后我建议您重写整个代码,以便有一个主while notGameExit:
循环,并且不要在辅助函数中使用任何其他循环。如果你想在你的辅助函数中使用循环,至少不要从辅助函数调用另一个具有自己循环的函数(等等),但是使用显式return
从它们返回以避免递归。
如果你在主循环中调用函数返回,你的主循环将继续运行,并且根据某些开关,你可以在屏幕上显示不同的东西,并对用户操作做出不同的反应。
也许看一个最小的工作pygame脚本显示“动作”而不使用循环你将获得更好的理解和一些关于pygame如何工作的深刻“启示”,然后开始使用另一种方法完全重写你的游戏你在当前的代码中使用过吗?如果你还有其他问题,那就回过头来看看,但是你可能不会有任何问题,因为如果代码变得更加简单,那么自己调试会更容易。
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