如何解决Pygame 按钮问题;单击按钮时不会显示下一阶段 主循环简化:
构建一个简单的 Pygame,点击开始按钮并进入第 1 级;一扇门出现,通过点击门,它会调用包含游戏第 2 级代码的函数。但是当点击门按钮时,该功能会被调用一小会儿,然后它会返回到第 1 级。我该如何解决这个问题?只包含相关代码:(游戏循环、关卡函数和按钮类。
main_menu = True
class Button():
def __init__(self,x,y,image):
self.image = image
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.clicked = False
def draw(self):
action = False
#get mouse position
pos = pygame.mouse.get_pos()
if self.rect.collidepoint(pos):
if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
action = True
self.clicked = True
if pygame.mouse.get_pressed()[0] == 0:
self.clicked = False
#draw Button
screen.blit(self.image,self.rect)
return action
#create buttons
start_button = Button(screen_width // 2 -350,screen_height // 2,start_img)
cancel_button = Button(screen_width // 2 + 150,cancel_img)
closed_door_button = Button(370,closedDoor)
def level1():
draw_bg()
player.draw()
draw_oMG()
if player.rect.x >= 440 and player.rect.x <= 460 and player.rect.y >= 30 and player.rect.y <=80:
draw_oMGM1()
def level2():
draw_house()
player.draw()
running = True
while running:
if main_menu == True:
if start_button.draw():
main_menu = False
if cancel_button.draw():
running = False
else:
level1()
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player.rect.x>5:
player.face = "left"
player.facing()
player.rect.x -= 5
if keys[pygame.K_RIGHT] and player.rect.x<790:
player.face = "right"
player.facing()
player.rect.x += 5
if keys[pygame.K_UP] and player.rect.y>10:
player.face = "up"
player.facing()
player.rect.y -= 5
if keys[pygame.K_DOWN]and player.rect.y<395:
player.face = "down"
player.facing()
player.rect.y += 5
if closed_door_button.draw():
level2()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.display.update()
pygame.quit()
解决方法
主循环简化:
while running:
if main_menu == True:
main_menu()
else:
level1()
if closed_door_button.draw():
level2()
...
因此,如果您不在主菜单中,则您一直在绘制第一级。
如果您点击门,在这个确切的框架,第二级将绘制在第一级之上。下一帧,事件不再发生,单独绘制第一层。
为避免该问题,请创建一个变量 level
来存储当前级别。然后简单地根据变量绘制相应的级别:
level = 1
while running:
if main_menu: # you can remove "== True"
main_menu()
else:
if level == 1: # first level
level1()
elif level == 2: # second level
level2()
if closed_door_button.draw():
level += 1
此外,您可以通过使用 pygame.event.get()
返回的列表来简化代码以获取点击门的时间:
class Button():
def draw(self,event_list):
screen.blit(self.image,self.rect)
for event in event_list:
if event.type == MOUSEBUTTONDOWN and self.rect.collidepoint(event.pos):
return True
return False
...
while running:
# use the same event list so that both can catch the same events
event_list = pygame.event.get():
for event in event_list:
if event.type == QUIT:
running = False
...
if closed_door_button(event_list):
level += 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。