有关event.key与event.type的问题
pygame吧
全部回复
仅看楼主
level 4
Heldnepos 楼主
被下面的代码弄的困惑了:
def check_events(ai_settings, screen, ship, bullets):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.K_q:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, ship, bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
本应该是很清楚的逻辑,按理说在elif event.type == pygame.K_q:这行,这里应该用的是event.key==pygame.K_q,可event.key就会报错,event.type就可以正常运行。
请问这是event.type的特殊用法吗?
pycharm, python 3.6
2018年03月09日 07点03分 1
level 9
?不是很明白是什么意思?[汗]
我说下我的理解:
type 的意思是类型
key 的意思是按键
如果是 if event.type is pygame.QUIT 或是 if event.type is pygame.KEYDOWN,都好理解。
意思是:从pygame事件列表中遍历所有事件,如果触发事件的类型 为 pygame的预定事件(如:QUIT),那么执行XXX。
把 event输出后,可以看到结果
event是按照触发类型 分别的。不止是只有按键类型,鼠标和其他监听器也会触发事件。
而相对应的,在KeyDown这个事件中,有key这个变量,所以先写 event.type is pygame.KEYDOWN 再写 event.key不会报错
而在Mouse 这个事件中,并没有key这个选项,相对应的变量是buttons,来监听 鼠标的左中右三键,很好理解为什么不用 event.key 因为他并没有key这个变量,而buttons应该会读取出来(没做实践,理论上是可以的)。
而且你看到 输出的 <Event(2-KeyDown {...) ,event(后面是有个 2 的,你追溯下这个2 ,你就会发现这个2代表是什么,如图
他其实就代表这 他是个KEYDOWN事件
其实要是你不问我根本不会想这些东西,或者用实践证明,因为根本没必要。官方已经给出比较标准的用法。好像也并没有什么特殊的用法,照着写就好了。
2018年03月09日 15点03分 2
太感谢你的回答了啊啊啊啊,特地注册账号感谢你[勉强]
2022年01月19日 14点01分
level 4
Heldnepos 楼主
在我的理解力,K_q是一个按键,所以检测一个按键是否被触发应该用event.key。
但出现了这样的报错,请问,如果想实现按q键就可以退出游戏,这一块到底错在哪里呢?
@三_七分 :P 不好意思还得打搅你一次。
2018年03月10日 06点03分 3
level 9
2018年03月11日 09点03分 4
啊!!!!我懂了,需要先keydown的事件,才有哪一个key的问题! 非常感谢
2018年03月11日 12点03分
level 9
给你发个简单的架构吧,你也可以自己想个
2018年03月11日 10点03分 5
level 6
像这种问题,建议统一,将按键处理分为三个if(不管需不需要),第一个if判断if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):即退出,第二个if判断elif event.type == MOUSEBUTTONDOWN:或者elif event.type == MOUSEBUTTONUP:即鼠标动作,第三个if判断elif event.type == KEYDOWN:或者elif event.type == KEYUP:即键盘动作,然后就可以把执行的东西往里塞,什么key有没有的问题也不会出现了。强烈建议每个程序都这样子,也方便维护,不需要的功能pass占位就行了
2022年01月22日 11点01分 6
level 9
离开这个吧的时候我记得我把所有发过的信息都删了~
这里居然还有一个没删掉的~
既然还给后来的人有过一些帮助~我也是挺开心的
回答这个问题的时候是好几年前了,看到几年前写的东西其实还是挺怀念的~
既然那么想知道这里应该怎么写,那我就写一串我现在的写法,希望能帮到大家吧~
说了挺多废话的,我直接上码了:
代码简陋,希望能帮到大家吧~
2022年02月18日 15点02分 8
大佬打扰一下。我是个纯入门小白。看书看下来的。也是到了外星人这边的例子。我有个困惑。self.settings = Settings() 和self.ship = Ship(self) 这俩有啥区别啊。为啥ship传过去 就是形参ai_game? 那为啥不是Ship(ai_game)? 学的有点懵。大佬有时间帮忙看一下。不是很理解这一块。代码我贴下面吧。
2022年03月28日 09点03分
level 1
2022年03月28日 09点03分 9
这是哪本书的教程?首先 self.ship = Ship(self) 这样写不是不行,但最好不要这么写,很容易造成新人的这种烦恼。就是容易遇到代码的“解耦”问题,所有东西都放在一起的话,特别容易乱,而且越到后面越乱。而且很容易遇到python的一些特性问题,造成一些不知名的bug。最好不要这么写。
2022年03月30日 02点03分
level 9

然后我回答一下你的问题。
首先:Settings() 和 Ship(self) 区别在哪?
首先他俩都是“类”,所以后面有个(),意思是把类实例化,实例化后就可以用类里面的东西了,否则 类 就只是一个“声明”。这里面的问题我一句话解释不清,多看看基础,什么语言的基础都行(最好是C++的),看完就会对 声明 和 实例化 就有了解了。
至于说里面的参...其实都是基础内容
为什么不是ai_game呢?
首先第5行 class Ship 的构造方法里规定了必须有两个参,一个参是 self,一个参是ai_game。
其中self 是object基类的参,可以省略。然后就是你必须提供一个参,这个参无论给的是什么,在 Ship内部,他就叫ai_game,你可以理解为 "孩子的小名"。就是无论在外面实例化Ship时给的是什么,在Ship内部,名字就叫ai_game。
然后是:为什么不是Ship(ai_game)?
首先AlienInvasion类中并没有声明 ai_game 这个变量啊,你怎么给Ship?你给ai_game 肯定给你报"找不到变量名"的错误啊。
然后是:为什么是Ship(self)?
没有为什么,Ship类里规定的 就是要给个参数,这个参数 是可以是 AlienInvasion 自己的。只不过你的教程这么写不太好。一般是先实例化AlienInvasion 然后在外面再把 Ship 实例化,然后再开另外一个环境,把两个实例化好的实例载入。
emmm怎么说呢...建议小哥哥多看看编码基础。还有教程这东西,其实并不是那么标准,很多地方有很多书写漏洞和编写结构方面的问题,会误导很多新人。多去看看源码或国外的教程,很多地方会触碰到语言的特性,一点一点来慢慢学,加油
2022年03月30日 03点03分 10
好的,谢谢啦。虽然还是感觉朦朦胧胧的。只能说我基础太差了。书名是《Python编程从入门到实践》,网上都说小白入门首选[乖]。有些细节都不解释,或许是我没看懂,很懵。随书视频就纯粹的照书念了一遍。感觉有点坑。。这里书上就一句话:“指向当前AlienInvasion实例的引用。”这句话我就死活绕不过来[狂汗]
2022年03月30日 06点03分
这里,Settings()类中只规定了默认参self,所以赋给属性self.settings时()里不用传递参。Ship()里面规定了默认self和ai_game,所以()里面必须要传递一个参,所以这个括号里这个self其实就是AlienInvasion的实例。传递给Ship类,结果赋给属性 self.ship。是这样理解么?@三_七分
2022年03月30日 06点03分
@悄然的夜 聪明的小哥哥~是这么回事。python这里和别的语言不一样 构造函数 __init__里面默认第一个参就是self 也就是 当前类的实例,也就是 实例化后的他自己,这是给object这个基类用的,所以可以省略,至于后面的参数,如果不设定默认值,那么就必须给一个值。你理解的没错
2022年03月30日 10点03分
@三_七分 好的 再次表示感谢。这个问题卡了一天多了[狂汗]
2022年03月30日 14点03分
1