2 回答

TA貢獻1818條經(jīng)驗 獲得超8個贊
問題是由
screen.fill(0,0,0)
因為第二個參數(shù) topygame.Surface.fill()被假定為一個矩形(例如pygame.Rect),它將填充限制為特定區(qū)域。
第一個參數(shù)pygame.Surface.fill()必須是 RGB 序列、RGBA 序列或顏色索引。
所以它必須是
screen.fill( (0,0,0) )
或者
screen.fill(0)
按鈕仍然是它們,因為它們在每一幀中都是連續(xù)繪制的:
for text, rect, colour, button_id in buttons:
pygame.draw.rect(screen, colour, rect)
screen.blit(text, rect)
添加一個全局狀態(tài)變量 ( play),該變量在按下播放按鈕時設置。在函數(shù)中改變狀態(tài)on_button,使用global語句改變?nèi)肿兞康闹祊lay。根據(jù)狀態(tài)繪制場景:
play = False
def on_button(buttons):
global play
play = buttons[3] == 1
print(buttons[3], play)
def game_intro():
# [...]
if play:
screen.fill(0)
# [...]
else:
for text, rect, colour, button_id in buttons:
pygame.draw.rect(screen, colour, rect)
screen.blit(text, rect)
pygame.display.flip()
clock.tick(15)

TA貢獻1802條經(jīng)驗 獲得超5個贊
直接回答問題:
if button[1].collidepoint(event.pos):
on_button(button)
if button == buttons[0]:
screen.fill(0,0,0)
檢查你的縮進。對于每個按鈕,代碼進行.collidepoint檢查并可能調(diào)用on_button,然后它還會檢查正在檢查的按鈕 -無論.collidepoint結果如何。
if button[1].collidepoint(event.pos):
on_button(button)
if button == buttons[0]:
screen.fill(0,0,0)
現(xiàn)在screen.fill只有當兩個條件都為真時才會發(fā)生 - 即正在檢查的按鈕是buttons[0],并且event.pos(即用戶單擊的位置)在該按鈕內(nèi)。
但是為了解決這個問題——你真的應該使用更復雜的東西來代表你的按鈕?;旧希覀兿M鹢n_button代碼根據(jù)它是哪個按鈕來決定單擊按鈕時要執(zhí)行的操作。為了使這項工作順利進行,buttons信息需要包含一些說明on_button該做什么的內(nèi)容。
Python 允許我們在這里做一個巧妙的技巧:事物的名稱只是名稱,即使被命名的事物是一個函數(shù) - 這意味著,例如,我們可以將這些名稱放在一個列表中,然后將它們?nèi)〕霾⑹褂盟鼈儊碚{(diào)用函數(shù)。例如,如果我們有一個函數(shù)來解釋播放按鈕應該做什么:
def do_play():
# up to you ;)
然后設置按鈕來存儲該名稱,而不是按鈕 ID:
play_button = [text1, rect1, BACKGROUND, do_play]
現(xiàn)在我們可以讓 on_button 為我們解決這個問題:
def on_button(button):
button[3]()
當該.collidepoint按鈕的測試通過時,它會被傳遞給on_button,它會查找函數(shù)名稱do_play并調(diào)用該函數(shù)。簡單的 :)
(下一個復雜級別是使用類來表示 Button 信息而不是普通列表。)
添加回答
舉報