2013-11-28 4 views
1

옵션이있는 방사형 메뉴를 만드는 방법에 대한 조언을 누군가에게 줄 수 있는지 궁금합니다. 'Attack', 게임 내에서 오브젝트를 클릭하면 'Talk'가 자동으로 팝업됩니다 ... 많은 전략/RPG 게임 등에 사용되는 방사형 메뉴와 비슷합니다.파이 게임에서 팝업 방사형 메뉴를 만드는 방법?

저는 Python/파이 게임 그래서 가능한 한 충분히 설명하십시오. 사전에

감사합니다, Ilmiont

+1

는 GUI를 만들기 위해 어떤 기능과 당신이 할 수 있도록 모든 메뉴가 없다 할 자신의 모든 것 - 등을 마우스 클릭을 잡기 그리기 메뉴에서 [PGU] (HTTP와 같은 어쩌면 일부 외부 라이브러리 ://code.google.com/p/pgu/) 도움이 될 수 있지만 잘 모르겠습니다. – furas

답변

1

는 사실은 내가 프로그래밍하고 내 게임 중 하나에 아주 최근에 사용했습니다. 그래서 일반적으로해야 할 일은 스프라이트/오브젝트 클릭을 확인하는 것입니다.

#example 
def make_popup(self): 
    popupSurf = pygame.Surface(width, height) 
    options = ['Attack', 
       'Talk'] 
    for i in range(len(options)): 
     textSurf = BASICFONT.render(options[i], 1, BLUE) 
     textRect = textSurf.get_rect() 
     textRect.top = self.top 
     textRect.left = self.left 
     self.top += pygame.font.Font.get_linesize(BASICFONT) 
     popupSurf.blit(textSurf, textRect) 
    popupRect = popupSurf.get_rect() 
    popupRect.centerx = SCREENWIDTH/2 
    popupRect.centery = SCREENHEIGHT/2 
    DISPLAYSURFACE.blit(popupSurf, popupRect) 
    pygame.display.update() 

이렇게 이제는 어떻게 작동하는지 알 수 있습니다.

popupSurf = pygame.Surface가있는 행은 popupSurf를 사물을 그릴 표면으로 만듭니다.

옵션은 매우 자명합니다. 그런 다음 우리는 모든 옵션을 취하여 각각을 개별적으로 표시하는 for 루프를 갖습니다. 다음은 textSurf = BASICFONT입니다. BASICFONT는 py2exe와 함께 사용하기 쉽기 때문에 내가 제일 좋아하는 처음에 만드는 글꼴입니다. 개인적으로 SysFont를 사용하는 것입니다.

그렇다면 textRect입니다. 텍스트를 화면에 표시 할 때 사용할 rect를 만듭니다. 그런 다음 상단 좌표를 현재 상단 좌표로 변경합니다. 그런 다음 왼쪽에서 똑같이하십시오. 그러나 다음 줄 'self.top + = ...'는 이전에 화면에 블릿 된 텍스트를 조정하여 텍스트 위에 텍스트 위에 텍스트가 오지 않도록 조정하는 것입니다. 그 다음에 당신은 그것을 팝업으로 blit합니다 .Surf.

모든 옵션이 popupSurf에 blitted 된 후에 popupSurf를 프로그램의 시작 부분에 'pygame.display.set_mode'를 사용하여 만든 메인 서피스로 blit해야합니다. 당신이 준 모든 정보에서 팝업이 화면 중앙에 나타나길 원했을 때 나는 centerx와 centery를 가져 와서 화면 중앙에 놓았습니다. 그런 다음 화면에 blit하고 디스플레이를 업데이트하는 것입니다. 당신이 충분히 이해하지 못했다면 의견을주십시오.

+0

고마워요.하지만 팝업을 닫을 때, 즉 창에서 다른 곳을 클릭 할 때를 어떻게 감지합니까? – Ilmiont

0

이렇게하려면 while 루프가 마우스가있는 위치를 항상 확인한 다음 클릭 할 마우스를 확인하십시오. 마우스를 클릭하면 어떤 옵션이 선택되어 있는지 확인하고, 옵션이 None이면 팝업 메뉴에서 빠져 나옵니다.

파이 게임에서
#example 
def doPopup(self): 
    #popup loop 
    while True: 
     #draw the popup 
     make_popup(self) 
     #check for keyboard or mouse events 
     for event in pygame.event.get(): 
      if event.type == QUIT: 
       pygame.quit() 
       sys.exit() 
      elif event.type == MOUSEMOTION: 
       #update mouse position 
       self.mousex, self.mousey = event.pos 
      #check for left click 
      elif event.type == MOUSEBUTTONDOWN and event.button == 1: 
       OPTION = option_selected(self) 
       if OPTION != None: 
        return OPTION' 
       else: 
        return None 
     FPSCLOCK.tick(FPS) 

def option_selected(self): 
    popupSurf = pygame.Surface(width, height) 
    options = ['Attack', 
       'Talk'] 
    #draw up the surf, but don't blit it to the screen 
    for i in range(len(options)): 
     textSurf = BASICFONT.render(options[i], 1, BLUE) 
     textRect = textSurf.get_rect() 
     textRect.top = self.top 
     textRect.left = self.left 
     self.top += pygame.font.Font.get_linesize(BASICFONT) 
     popupSurf.blit(textSurf, textRect) 
     if textSurf.collidepoint(self.mousex, self.mousey): 
      return options[i] 
    popupRect = popupSurf.get_rect() 
    popupRect.centerx = SCREENWIDTH/2 
    popupRect.centery = SCREENHEIGHT/2