第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

慕慕森 2023-06-13 16:47:25
嗨,我是一個(gè) python 菜鳥,我正在嘗試自己用 pygame 制作一個(gè)劊子手游戲,同時(shí)盡可能避免來自 YouTube 教程的幫助。我的問題是:當(dāng)我將鼠標(biāo)懸停在按鈕上時(shí),按鈕會(huì)改變顏色(這很好),但即使我仍在按鈕上懸停,它也會(huì)變回原來的顏色。此外,將鼠標(biāo)懸停在多個(gè)按鈕上時(shí),按鈕的響應(yīng)速度非常差。當(dāng)我單擊一個(gè)按鈕時(shí),程序認(rèn)為我多次單擊該按鈕。print('clicked!')因?yàn)樗啻螆?zhí)行該行。最后,當(dāng)我點(diǎn)擊一個(gè)按鈕來 blit 一個(gè)精靈時(shí),它只會(huì)短暫地 blit 精靈,然后它會(huì)自動(dòng)取消 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,因?yàn)槲蚁雵L試自己做,這樣我可以學(xué)到更多)。我也從 Tech With Tim 的視頻中獲得了按鈕類的代碼。
查看完整描述

2 回答

?
心有法竹

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊

首先在應(yīng)用程序循環(huán)之前對(duì)按鈕進(jìn)行初始化,而不是在循環(huán)中連續(xù)進(jìn)行


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:

        # [...]

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


class Button:


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

        # [...]


        self.visible = True

        self.clicked = False

設(shè)置屬性,點(diǎn)擊按鈕時(shí):


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

現(xiàn)在您可以根據(jù)clicked按鈕的狀態(tài)繪制對(duì)象:


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()

        # [...]        

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


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


        # [...]


查看完整回答
反對(duì) 回復(fù) 2023-06-13
?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊

好的,讓我們從第一個(gè)開始,我懷疑這里的一些變化也可能有助于解決其他問題。nonice,您正在“while run”循環(huán)中創(chuàng)建“初始彩色按鈕”,這意味著它會(huì)一次又一次地發(fā)生,但是您在事件循環(huán)中對(duì)按鈕進(jìn)行了重新染色,這僅在出現(xiàn)新事件時(shí)才會(huì)發(fā)生。你看到問題了嗎?懸停事件發(fā)生后的下一分鐘,程序?qū)⒗L制一個(gè)常規(guī)按鈕!我會(huì)說這條線

  letter.color = (0, 255, 0)

在 OOP 中被認(rèn)為是一個(gè)壞習(xí)慣,因?yàn)槟幌朐陬愔飧膶?duì)象屬性。相反,讓我們構(gòu)建一個(gè)“set_color”方法

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

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

在游戲開始之前,在 while 運(yùn)行循環(huán)之外

在 while 循環(huán)中你可以只添加一個(gè)循環(huán)來繪制它們。

 for letrer in letters:
       letter.draw()


查看完整回答
反對(duì) 回復(fù) 2023-06-13
  • 2 回答
  • 0 關(guān)注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)