python - Pygame:多次调用 event.get() 时遇到问题
问题描述
我目前正在 Pygame 中制作飞机射击游戏。我已经创建了平面类,现在开始创建子弹类。但是,我遇到了一个我无法解决的问题:我真的需要在类内部和 while 循环(游戏的主 while 循环)中使用 pygame.event.get() 循环。因此,当我使用 2 个这样的循环时,游戏控件变得如此怪异和混乱,在我搜索这个问题后,我发现通常它必须只有 pygame.event.get() 上的一个循环。我不知道该怎么做,因为如果我将两个循环组合到位于 while 循环中的主要循环中,那么我将无法引用项目符号对象,因为它将在类之外。这是我的代码:
class Singlebullet(object):
def __init__(self):
self.img = pygame.image.load(r'C:\Users\me\Documents\MyGame\bullet.png')
self.x = planeX + 71
self.y = planeY
self.state = 'ready'
self.speed = 0
self.firerate = 1000
def shoot(self):
if current_bullet_type == 'single':
if self.state == 'ready':
MyScrollingScreen.blit(self.img, (self.x, self.y))
if self.state == 'fire':
self.speed = -8
self.y += bullet_speed
MyScrollingScreen.blit(self.img, (self.x, self.y))
if self.y < -20:
self.state = 'ready'
for e in pygame.event.get():
if e.type == pygame.KEYDOWN or e.type == pygame.KEYUP:
if e.key == pygame.K_SPACE:
self.state = 'fire'
pygame.time.set_timer(pygame.USEREVENT+1, self.firerate)
if e.type == pygame.USEREVENT+1:
self.state = 'ready'
s1 = Singlebullet()
while running:
#[...]
for event in pygame.event.get():
#[...]
解决方案
pygame.event.get()
从队列中移除事件(参见pygame 文档)。
所以,有些事件是在主循环中获取的,而其他事件是在类中获取的,并且您不知道特定事件是从哪里获取的 py pygame。所以你错过了一些事件。
为避免这种情况,请pygame.event.get()
每帧调用一次,并对主循环和 使用相同的列表SingleBullet
:
class Singlebullet(object):
def shoot(self):
...
for e in events: # same events as in main loop
while running:
events = pygame.event.get()
for event in events:
...
[]
如果您在调用后获得事件,请不要忘记将列表设置为第一帧Singlebullet.shoot()
(该类将要求提供一个不存在的列表)。
推荐阅读
- javascript - 将 JSON 响应中的值存储到 AsyncStorage React Native
- php - 为图书馆学校制作一个 fwrite 联系人 PHP
- javascript - 为什么 Object.keys(this).map(key => (this as any)[key])?
- c# - NLog 跟踪目标仅适用于跟踪和调试级别,不适用于信息、警告、错误或致命
- powershell - 将管道作为参数发送到 Powershell 中的外部程序?
- android - 如何避免离开屏幕?
- java - 如何在 RinSim 的出租车示例中缩小或放大地图视图?
- java - 如何确定扩展抽象类的对象的类
- git - 可以从外部 git 创建 git 存储库吗
- c - 什么字符'!' C中数组赋值的平均值