<p>问题出在哪里:</p>
<ul>
<li><p>没有任何东西在移动,因为<code>pygame.key.get_pressed()</code>在游戏循环之外,即只在启动时检查键的状态。</p></li>
<li><p>每次拍摄时必须创建一个新的<code>Projectile</code>实例,否则只能拍摄一次。</p></li>
<li><p>要使投射物正确地出现,你必须先闪动玩家精灵,然后闪动投射物,否则玩家精灵会覆盖它们。</p></li>
<li><p>若要在两次射击之间编写延迟代码,请将射击冷却时间存储在变量中(最好是<code>player</code>属性),您可以在每次射击时将其设置为某个正值,并在每个回合中递减。</p></li>
<li><p>您使用<code>sys.exit()</code>,但尚未导入<code>sys</code>,这会使您的游戏在退出时崩溃。或者,您可以<code>raise SystemExit</code>,这与系统出口(),不需要任何导入。</p></li>
</ul>
<p>下面是更正的代码:</p>
<pre><code>import pygame
pygame.init()
class Player():
def __init__(self):
self.originalImage = pygame.image.load("ship.png")
self.image = self.originalImage
self.xposition = 480
self.yposition = 450
self.speed = 1
self.attack_cooldown = 0 # variable to store shooting cooldown
class Projectile():
def __init__(self):
self.originalImage = pygame.image.load("shot.png")
self.image = self.originalImage
self.xposition = player.xposition
self.yposition = player.yposition
self.speed = 1
size = width, height = 960, 540
screen = pygame.display.set_mode(size)
background = 0, 0, 0
player = Player()
projectiles = []
while True:
screen.fill(background)
# decrement the current shooting cooldown
if player.attack_cooldown > 0:
player.attack_cooldown -= 1
for projectile in projectiles:
if projectile.yposition < height:
projectile.yposition -= projectile.speed
else:
projectiles.pop(projectiles.index(projectile))
for event in pygame.event.get():
if event.type == pygame.QUIT:
raise SystemExit # does the same thing as sys.exit() but you don't need to import sys
keys = pygame.key.get_pressed() # put this in the game loop
if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
player.xposition += player.speed
if keys[pygame.K_LEFT] or keys[pygame.K_a]:
player.xposition -= player.speed
if keys[pygame.K_SPACE] or keys[pygame.K_w] or keys[pygame.K_UP]:
if player.attack_cooldown == 0: # shoot only when not on cooldown
projectiles.append(Projectile()) # shoot a new projectile instead of the one you already shot
player.attack_cooldown = 100 # add shooting cooldown, the number can be any positive integer you want
# blit the player first
screen.blit(player.image, ((player.xposition, player.yposition)))
for projectile in projectiles:
screen.blit(projectile.image, (projectile.xposition, projectile.yposition))
pygame.display.flip()
</code></pre>