>source

기본적으로 텍스트 기반 전략/격투 게임으로 실행되는 Pygame을위한 간단한 프로젝트를 만들고 있습니다. 파이썬을 사용하여 코딩했지만 이제는 Pygame을 사용하여 GUI를 구현하려고합니다 (그리고 결국 확장).

이 게임에서 플레이어는 현재 위치 (배열로 저장 됨)에 따라 사용 가능한 여러 이동을가집니다. 내가 원하는 것은 사용자가 선택할 수있는 각 동작에 대한 버튼을 만들고 표시하는 것입니다.

버튼을 만드는 방법을 알고 있지만 플레이어의 위치 변경에 따라 이동마다 버튼을 추가하고 지속적으로 업데이트하는 방법을 파악하는 데 어려움을 겪고 있습니다.

어떤 조언이나 조언도 좋을 것입니다!

  • 답변 # 1

    당신은 기본적으로 Button 그 클래스. 이렇게하면 버튼 개체를 만들고 목록에 넣고 쉽게 조작 할 수 있습니다. 다음은 버튼이 거의 짝수없는 예입니다. Button 요점을 이해하기 위해 수업. 4 개의 버튼이있는 목록을 만들었지 만 쉽게 할 수 있습니다. .append 프로그램의 필요에 따라 동적으로 생성 할 수 있습니다.

    import pygame
    from sys import exit as _exit 
    ##just pygame stuff here. You can ignore them and go
    ##to the interesting things below
    class PG_Widnow_UI:
        def __init__(self, width, height):
            pygame.init()
            self.widht = width
            self.height = height
            self.window = pygame.display.set_mode((width, height))
        def update(self):
            pygame.display.flip()
        def clear(self, r, g, b):
            self.window.fill((r, g, b))
        def close(self):
            pygame.quit()
            _exit()
            #handles events 
    def handleEvents(events):
        exitGame = False
        for event in events:
            if event.type == pygame.QUIT:
                pg_window.close()
    #Takes rectangle's size, position and a point. Returns true if that
    #point is inside the rectangle and false if it isnt.
    def pointInRectanlge(px, py, rw, rh, rx, ry):
        if px > rx and px < rx  + rw:
            if py > ry and py < ry + rh:
                return True
        return False
    
    ##=====================================================================##
    #This class will act as a bllueprint for all the buttons in the game
    class Button:
        def __init__(self, text:str, position:tuple
                     , size:tuple=(200, 50), outline:bool=True)->None:
            self.position = position
            self.size = size
            self.button = pygame.Surface(size).convert()
            self.button.fill((0, 0, 0))
            self.outline = outline
            #Text is about 70% the height of the button
            font = pygame.font.Font(pygame.font.get_default_font(), int((70/100)*self.size[1]))
            #First argument always requires a str, so f-string is used.
            self.textSurf = font.render(f"{text}", True, (255, 255, 255))
        def clicked(self, events)->None:
            mousePos = pygame.mouse.get_pos()
            if pointInRectanlge(mousePos[0], mousePos[1], self.size[0], self.size[1], self.position[0], self.position[1]):
                for event in events:
                    if event.type == pygame.MOUSEBUTTONDOWN:
                        return True
            return False
        #Renders the button and text. Text position is calculated depending on position of button.
        #Also draws outline if self.outline is true
        def render(self, display:pygame.display)->None:
            #calculation to centre the text in button
            textx = self.position[0] + (self.button.get_rect().width/2) - (self.textSurf.get_rect().width/2)
            texty = self.position[1] + (self.button.get_rect().height/2) - (self.textSurf.get_rect().height/2)
            #display button first then text
            display.blit(self.button, (self.position[0], self.position[1]))
            display.blit(self.textSurf, (textx, texty))
            
            #draw outline
            if self.outline:
                thickness = 5
                posx = self.position[0] - thickness
                posy = self.position[1] - thickness
                sizex = self.size[0] + thickness * 2
                sizey = self.size[1] + thickness * 2
                pygame.draw.rect(display, (255, 0, 0), (posx, posy, sizex, sizey), thickness)
    
    windowWidth = 1000
    windowHeight = 500
    pg_window = PG_Widnow_UI(windowWidth, windowHeight)
    ##LOOP TO ADD BUTTONS TO THE LIST 
    
    number_of_buttons = 4
    buttons = [Button(f"Button {i}", ((220 * (i%4) + 10), ((i % 4) * 70) + 10)) 
    for i in range(number_of_buttons)]
    while True:
        pg_window.clear(255, 255, 255)
        events = pygame.event.get()
        handleEvents(events)
        ##DRAWING THE BUTTONS 
        for button in buttons:
            button.render(pg_window.window)
            if button.clicked(events):
                print(f"button at position: {button.position} was  clicked") 
        
        pg_window.update()
    
    

관련 자료

  • 이전 python - 사용자가 시스템에 로그인 할 때 모든 로그인 정보를 추가하려고합니다
  • 다음 java - 값을 반환하지 않는 HashMap