옵션이있는 방사형 메뉴를 만드는 방법에 대한 조언을 누군가에게 줄 수 있는지 궁금합니다. 'Attack', 게임 내에서 오브젝트를 클릭하면 'Talk'가 자동으로 팝업됩니다 ... 많은 전략/RPG 게임 등에 사용되는 방사형 메뉴와 비슷합니다.파이 게임에서 팝업 방사형 메뉴를 만드는 방법?
저는 Python/파이 게임 그래서 가능한 한 충분히 설명하십시오. 사전에
감사합니다, Ilmiont
옵션이있는 방사형 메뉴를 만드는 방법에 대한 조언을 누군가에게 줄 수 있는지 궁금합니다. 'Attack', 게임 내에서 오브젝트를 클릭하면 'Talk'가 자동으로 팝업됩니다 ... 많은 전략/RPG 게임 등에 사용되는 방사형 메뉴와 비슷합니다.파이 게임에서 팝업 방사형 메뉴를 만드는 방법?
저는 Python/파이 게임 그래서 가능한 한 충분히 설명하십시오. 사전에
감사합니다, Ilmiont
는 사실은 내가 프로그래밍하고 내 게임 중 하나에 아주 최근에 사용했습니다. 그래서 일반적으로해야 할 일은 스프라이트/오브젝트 클릭을 확인하는 것입니다.
#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하고 디스플레이를 업데이트하는 것입니다. 당신이 충분히 이해하지 못했다면 의견을주십시오.
고마워요.하지만 팝업을 닫을 때, 즉 창에서 다른 곳을 클릭 할 때를 어떻게 감지합니까? – Ilmiont
이렇게하려면 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
는 GUI를 만들기 위해 어떤 기능과 당신이 할 수 있도록 모든 메뉴가 없다 할 자신의 모든 것 - 등을 마우스 클릭을 잡기 그리기 메뉴에서 [PGU] (HTTP와 같은 어쩌면 일부 외부 라이브러리 ://code.google.com/p/pgu/) 도움이 될 수 있지만 잘 모르겠습니다. – furas