【问题标题】:Pygame button issue; won't display next stage when button clickedPygame 按钮问题;单击按钮时不会显示下一个阶段
【发布时间】:2021-06-24 17:06:08
【问题描述】:

构建一个简单的 Pygame,在你点击开始按钮后进入关卡 1;一扇门出现,通过点击门它调用包含游戏第二级代码的函数。但是当点击门按钮时,该函数会被快速调用,然后它会返回到第 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, screen_height // 2, cancel_img)
closed_door_button = Button(370,0,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()  

【问题讨论】:

  • 如果我发布的答案有帮助,您可以考虑accepting。否则,发表评论,我会改变我的答案。

标签: python button pygame pygame-surface


【解决方案1】:

主循环简化:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多