为了账号安全,请及时绑定邮箱和手机立即绑定

尽管我引用了赋值前引用的变量事件

尽管我引用了赋值前引用的变量事件

手掌心 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)此处为文档)。基本上,pygame 会在按下某个键时为您伪造 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 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信