12.6.3 左右移动
现在飞船能够持续向右移动了,添加向左移动的逻辑也很容易。我们将再次修改Ship 类和方法_check_events() 。下面显示了对Ship 类的方法__init__()和update() 所做的相关修改:
ship.py
def __init__(self, ai_game):
--snip--
# 移动标志
self.moving_right = False
self.moving_left = False
def update(self):
"""根据移动标志调整飞船的位置。"""
if self.moving_right:
self.rect.x += 1
if self.moving_left:
self.rect.x -= 1
在方法__init__() 中,添加标志self.moving_left 。在方法update() 中,添加一个if 代码块而不是elif 代码块,这样如果玩家同时按下了左右箭头 键,将先增加再减少飞船的rect.x 值,即飞船的位置保持不变。如果使用一个 elif 代码块来处理向左移动的情况,右箭头键将始终处于优先地位。从向左移动切换到向右移动时,玩家可能同时按住左右箭头键,此时前面的做法让移动更准 确。 还需对_check_events() 做两方面的调整:
alien_invasion.py
def _check_events(self):
"""响应按键和鼠标事件。"""
for event in pygame.event.get():
--snip--
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
elif event.key == pygame.K_LEFT:
self.ship.moving_left = False
如果因玩家按下K_LEFT 键而触发了KEYDOWN 事件,就将moving_left 设置为 True 。如果因玩家松开K_LEFT 而触发了KEYUP 事件,就将moving_left 设置 为False 。这里之所以可以使用elif 代码块,是因为每个事件都只与一个键相关 联。如果玩家同时按下左右箭头键,将检测到两个不同的事件。 如果此时运行alien_invasion.py,将能够持续左右移动飞船。如果同时按下左右箭 头键,飞船将纹丝不动。 下面来进一步优化飞船的移动方式:调整飞船的速度,以及限制飞船的移动距离, 以免其消失在屏幕之外。
12.6.4 调整飞船的速度
当前,每次执行while 循环时,飞船最多移动1像素,