亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我怎樣才能使pygame中的按鈕正常工作?(劊子手游戲)

我怎樣才能使pygame中的按鈕正常工作?(劊子手游戲)

慕慕森 2023-06-13 16:47:25
嗨,我是一個 python 菜鳥,我正在嘗試自己用 pygame 制作一個劊子手游戲,同時盡可能避免來自 YouTube 教程的幫助。我的問題是:當我將鼠標懸停在按鈕上時,按鈕會改變顏色(這很好),但即使我仍在按鈕上懸停,它也會變回原來的顏色。此外,將鼠標懸停在多個按鈕上時,按鈕的響應速度非常差。當我單擊一個按鈕時,程序認為我多次單擊該按鈕。print('clicked!')因為它多次執行該行。最后,當我點擊一個按鈕來 blit 一個精靈時,它只會短暫地 blit 精靈,然后它會自動取消 blit 自己。這是我的代碼:import pygamepygame.init()# DISPLAYWIDTH, HEIGHT = 800, 500window = pygame.display.set_mode((WIDTH, HEIGHT))# TITLE BARTITLE = "Hangman"pygame.display.set_caption(TITLE)# HANGMAN SPRITESman = [pygame.image.load(f"hangman{frame}.png") for frame in range(0, 7)]class Button:    def __init__(self, color, x, y, radius, text=""):        self.radius = radius        self.color = color        self.x = x        self.y = y        self.width = 2        self.text = text        self.visible = True    def draw(self, window, outline=None):        if self.visible:            if outline:                # draws a bigger circle behind                pygame.draw.circle(window, outline, (self.x, self.y), self.radius + 2, 0)            pygame.draw.circle(window, self.color, (self.x, self.y), self.radius, 0)        if self.text != "":            if self.visible:                font = pygame.font.SysFont("courier", 30)                text = font.render(self.text, 1, (0, 0, 0))                window.blit(text, (self.x - text.get_width() / 2, self.y - text.get_height() / 2))    def hover(self, pos):        if self.y + self.radius > pos[1] > self.y - self.radius:            if self.x + self.radius > pos[0] > self.x - self.radius:                return True        return Falsedef main():    run = True    FPS = 60    clock = pygame.time.Clock()    large_font = pygame.font.SysFont("courier", 50)    letters = []    error = 0另外,我從 YouTube 上的 Tech With Tim Hangman 教程中獲得了 sprite(我只是在沒有看他編寫游戲代碼的情況下獲得了 sprite,因為我想嘗試自己做,這樣我可以學到更多)。我也從 Tech With Tim 的視頻中獲得了按鈕類的代碼。
查看完整描述

2 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

首先在應用程序循環之前對按鈕進行初始化,而不是在循環中連續進行


def main():


    # init buttons

    alphabet = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")

    letter_x1, letter_y1 = 40, 375

    letter_x2, letter_y2 = 40, 435

    for i in range(13):

        letter_1 = Button((255, 255, 255), letter_x1, letter_y1, 25, alphabet[i])

        letters.append(letter_1)

        letter_x1 += 60

    for i in range(13, 26):

        letter_2 = Button((255, 255, 255), letter_x2, letter_y2, 25, alphabet[i])

        letters.append(letter_2)

        letter_x2 += 60


    # application loop

    while run:

        # [...]

給按鈕添加一個屬性clicked,用來存儲按鈕(類似于visible屬性):


class Button:


    def __init__(self, color, x, y, radius, text=""):

        # [...]


        self.visible = True

        self.clicked = False

設置屬性,點擊按鈕時:


def main():

    # [...]


    while run:

        # [...]

        for event in pygame.event.get():

            # [...]

            elif event.type == pygame.MOUSEBUTTONDOWN:

                for letter in letters:

                    if letter.hover(pygame.mouse.get_pos()):

                        letter.clicked = True

現在您可以根據clicked按鈕的狀態繪制對象:


def main():

    # [...]


    def redraw_window():

        window.fill((255, 255, 255))

        

        window.blit(man[0], (20, 100))

        # DRAWS LETTER BUTTONS

        for letter in letters:

            letter.draw(window, (0, 0, 0))

             

            if letter.clicked:

                # [...]


        pygame.display.update()


    # [...]

    while run:

        redraw_window()

        # [...]        

或者或另外,您可以將單擊的最后一個按鈕存儲到變量 ( lastLetterClicked) 并根據變量繪制一些內容:


def main():

    # [...]


    def redraw_window():

        # [...]


        if lastLetterClicked:

            # [...]


        pygame.display.update()


    lastLetterClicked = None

    while run:

        redraw_window()

        # [...]


        for event in pygame.event.get():

            # [...]

            elif event.type == pygame.MOUSEBUTTONDOWN:

                for letter in letters:

                    if letter.hover(pygame.mouse.get_pos()):

                        # [...]

                        lastLetterClicked = letter


        # [...]


查看完整回答
反對 回復 2023-06-13
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

好的,讓我們從第一個開始,我懷疑這里的一些變化也可能有助于解決其他問題。nonice,您正在“while run”循環中創建“初始彩色按鈕”,這意味著它會一次又一次地發生,但是您在事件循環中對按鈕進行了重新染色,這僅在出現新事件時才會發生。你看到問題了嗎?懸停事件發生后的下一分鐘,程序將繪制一個常規按鈕!我會說這條線

  letter.color = (0, 255, 0)

在 OOP 中被認為是一個壞習慣,因為您不想在類之外更改對象屬性。相反,讓我們構建一個“set_color”方法

 def set_color(self , color):
     self.color = color

并啟動按鈕 letter_1 = Button((255, 255, 255), letter_x1, letter_y1, 25, alphabet[i])

在游戲開始之前,在 while 運行循環之外

在 while 循環中你可以只添加一個循環來繪制它們。

 for letrer in letters:
       letter.draw()


查看完整回答
反對 回復 2023-06-13
  • 2 回答
  • 0 關注
  • 259 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號