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

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

盡管我引用了賦值前引用的變量事件

盡管我引用了賦值前引用的變量事件

手掌心 2023-03-08 15:42:42
我試圖將我所有的游戲關卡都放在一個程序中。在此之前,所有代碼都運行良好。但是,當我將所有程序放入其函數中并嘗試運行第一級時,出現錯誤: if event.type == pygame.KEYDOWN and event.key == pygame.K_UP and igralec.y > 10:UnboundLocalError: local variable 'event' referenced before assignment我在網上搜索了這個錯誤并做了應該做的修復;我將這些代碼行放在事件循環下,但這使游戲無法玩;我不得不按一個鍵(按住它不起作用)。然后我嘗試將if更改為while,這也沒有用。這是代碼: while run:    for event in pygame.event.get():        if event.type == pygame.QUIT or event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:            run = False        elif event.type == pygame.KEYDOWN:            if event.key == pygame.K_SPACE and igralec.ziv > 0:                print(igralec.fire_rate)                igralec.fire_rate += 1                if igralec.fire_rate == 4:                    igralec.fire_rate = 1                 if igralec.fire_rate % 2 == 1 or igralec.fire_rate == 1:                    strel.play()                       if igralec.levo:                        smer = -1                    else:                        smer = 1                    if len(metki) < 5:                        metki.append(torpedo(igralec.x, igralec.y + 40, smer))    for metek in metki:        if metek.x < 1024 and metek.x > 0:            metek.x +=  metek.v            if metek.x > podmornca.okvir[0] and metek.x < podmornca.okvir[0] + podmornca.okvir[2]:                if metek.y > podmornca.okvir[1] and metek.y < podmornca.okvir[1] + podmornca.okvir[3]:                    zadetek.play()        else:            metki.pop(metki.index(metek))    if event.type == pygame.KEYDOWN and event.key == pygame.K_UP and igralec.y > 10:        igralec.y -= 5    if event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN and igralec.y < 600:        igralec.y += 5    if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:        igralec.levo = True        igralec.desno = False        eksploziv.x += igralec.v        kamenx += igralec.v        podmornca.zac += igralec.v        podmornca.konc += igralec.v        podmornca.x += igralec.v
查看完整描述

2 回答

?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

您確實需要用于檢查事件循環中的鍵的代碼。

你說當你修復游戲變得無法玩,因為你不得不反復敲擊鍵,因為按住鍵沒有任何作用。按鍵被按下是一個事件,它只在按鍵被按下時發生。當一個鍵被釋放時,你也會得到一個事件,但是當它被按住時沒有生成任何事件。但是,有一些方法可以解決這個問題。

以下是解決該問題的一些方法:

我喜歡重復鍵的方法,這就是我將首先介紹它的原因。

你可以告訴 pygame 你希望它在按鍵被按下時重復給你按鍵事件。這類似于許多系統在按下某個鍵時所做的事情。您可以通過告訴 pygame 您希望它在按住鍵時定期為您提供 KEYDOWN 事件來獲得它。您使用命令pygame.key.set_repeat(delay, interval)此處為文檔)?;旧希琾ygame 會在按下某個鍵時為您偽造 KEYDOWN 事件。是delay在發送第一個重復鍵事件之前需要按住一個鍵的時間,以及interval您希望在初始延遲后重復該事件的頻率。

你也可以用另一種方式來做。您無需在按鍵被按下時做出反應,而是跟蹤您希望游戲做出反應的按鍵狀態。當您獲得KEYDOWN這些鍵之一的事件時,您會設置一個狀態變量,指示該鍵已被按下。當您獲得該鍵的相應KEYUP事件時,您將清除該變量。然后在事件循環之外,只要按住鍵并設置狀態,您就可以對這些鍵狀態變量做出反應以使事情發生。

還有一種方法,您可以使用 詢問 pygame 當前按下的鍵是什么pygame.key.get_pressed()。然后從返回中解析出當前按下的鍵。請在此處查看文檔。

如果您使用,get_pressed()您仍然需要一個事件循環來處理事件,否則 pygame 將不會處理事件并且您的游戲將無響應。您也可以使用它pygame.event.pump()來防止這種停頓。


查看完整回答
反對 回復 2023-03-08
?
POPMUISE

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

event對于第一個 for 循環是局部的。循環結束后將event超出范圍。  if event.type == pygame.KEYDOWN and event.key == pygame.K_UP and igralec.y > 10: igralec.y -= 5在 for 循環之外,這是此錯誤的原因。



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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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