微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame 按钮问题;单击按钮时不会显示下一阶段 主循环简化:

如何解决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] 举报,一经查实,本站将立刻删除。