<p>问题是意大利面代码就是意大利面。:-)</p>
<p>我自己也搞不清你到底想要什么——如果所有的子弹头函数都创建了相同的子弹头,或者它们实际上是不同的,等等。在</p>
<p>但是,有两个问题导致了你的主要问题——它们可以被修复,保持代码的格式不变,但是我建议对其进行一些重改写,朝着一种更为gnocchi的方法(而不是意大利面)。在</p>
<p>问题的主要来源是注册一个事件在500毫秒后被激发,然后对它做出反应并调用您的<code>delay</code>函数。但是,这个函数同时调用<code>BossPower</code>函数来发射其他子弹,而不会有任何延迟。在</p>
<p>当然,你不能在调用函数发射其他子弹之前,在延迟内调用<code>time.sleep</code>或{<cd4>},因为那样会暂停整个游戏。在</p>
<p>因此,一种方法是调用delay来注册其他自定义事件以触发下一个项目,然后从函数返回。然后主循环会在找到这些事件后发射下一颗子弹。在</p>
<p>这给我们带来了这段代码中的第二个大问题:在每一帧中获取所有可用的事件,但是对于所有这些事件,您唯一要做的就是检查<code>pygame.QUIT</code>。巧合的是,在每个帧中获取的最后一个事件被<code>event</code>变量引用,并且在您检查自定义事件(<code>if event.type == event_500ms:</code>)的行中可用。到达同一帧的其他事件被简单地丢弃awa。这也意味着您的自定义事件可能会被丢弃。在</p>
<p>因此,重要的是,只有在代码的某一点上获取每个帧的所有事件,并且任何与事件相关的操作或比较都是在同一点进行的。在</p>
<p>现在,Pygame允许使用最少数量的用户定义事件(默认构建中只有8个,因为他们建议只使用两个之间可用的事件)pygame.USEREVENT). 如果你想对每个子弹类使用一个事件类型,那么在你的游戏有3个关卡之前,你已经用完了事件编号。在</p>
<p>因此,由于激发项目符号的代码是完全相同的,并且您只需更改bullet类,就可以创建一系列要激发的项目符号类,并使用<code>itertools.cycle</code>来获取下一个项目符号类型:</p>
<pre><code>...
import itertools
fire_bullet_event = pygame.USEREVENT + 1
...
bullets = itertools.cycle([Bullet2, Bullet3, Bullet4)
def fire_bullet():
bullet_type = next(bullets)
bullet2 = bullet_type()
# Set the bullet so it is where the player is
bullet2.rect.x = alien2.rect.x + 47
bullet2.rect.y = alien2.rect.y + 57
# Add the bullet to the lists
all_sprites_list.add(bullet2)
bullet2_list.add(bullet2)
delay = 500
# Schedule to call this function again in 500ms.
# use an "if" to change the 500 to another number like:
# if bullet_type == Bullet4:
# delay = 2000
pygame.time.set_timer(fire_bullet_event, delay)
...
# Schedule the first bullet close to entering the loop -
# it is easier to see than putting it with the game setup code:
pygame.time.set_timer(fire_bullet_event, 500)
while not done:
# - Event Processing
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
# all code dealing with events must be inside this `for` loop.
if event.type == fire_bullet_event:
fire_bullet()
if level % 2 == 0:
all_sprites_list.add(alien2)
alien2_list.add(alien2)
for block in block_list:
block_list.remove(block)
all_sprites_list.remove(block)
</code></pre>