@websec007
2020-06-10T10:01:43.000000Z
字数 3378
阅读 895
2020.Python从入门到实践
章节核心点
2.飞船持续的左右移动方法的实现
3.移动标志位实践总结
“飞船的左右移动”,通过关联“键盘事件属性(RIGHT/LEFT)”就可以控制实现;但是如果要实现“飞船的持续移动”,则需要在“飞船左右移动”与“键盘事件属性”之间加一个“移动标志位”(状态属性值:True/False)做状态中转;
一句话总结 --- Version 1.0
“飞船的移动方法”通过“移动标志位属性”来控制,“移动标志位属性”通过“键盘事件属性(right/left)”来控制;
一句话总结 --- Version 2.0
“飞船的移动方法”我们最直接想到的是通过“键盘事件属性(right/left)”的交互来控制,但是为支持“持续的移动”,我们需要在2这中间添加一个“移动标志位属性(True/False)”来实现;
---> “飞船持续移动”的实现,其核心就是这个“移动标志位属性(True/False)”来实现;
在ship 类中创建“移动标志位”与“飞船移动更新方法”,通过 “移动标志位”来实现“飞船位置不断移动的更新”控制;
self.moving_right = False
self.moving_left = False
def update(self):
if self.moving_right:
self.rect.centerx += 1
if self.moving_left:
self.rect.centerx -= 1
在 game_functions 模块中通过监控 “键盘事件” 实现对 “飞船移动标志位”属性的更新控制;
for event.type = pygame.event_get():
......
# 通过监控键盘按下事件,实现飞船左右移动标志位属性变更;
elif event.type = pygame.KEYDOWN:
if evnet.key == pygame.K_RIGHT:
ship.moving_right = True
if event.key == pygame.K_LEFT:
ship.moving_left = True
# 通过监控键盘释放事件,实现飞船左右移动标志位属性变更
elif event.type = pygame.KEYUP:
if event.key == pygame.K_RIGHT:
ship.moving_right = False
if event.key == pygame.K_lEFT:
ship.moving_left = False
# alien_invasion.py
...
while True:
...
# update game
gf.update_screen
ship.update()
有关整个游戏内容的更新方法都已经封装到“gf.update_screen”中(update_screen()),故我们应该将飞船移动更新的方法也迁移合并到“game_function.py”中的“update_screen” 方法中;
# Update game
def update_screen(screen, bg_color, ship):
screen.fill(bg_color)
# 添加飞船移动控制方法;
ship.update()
# 绘制飞船surface 到主屏幕surface中
ship.blitme()
# settings.py
class Settings():
def __init__(self):
....
self.ship_speed_factor = 1.5
def update(self):
if self.moving_right:
# self.rect.centerx += 1
self.rect.centerx = float(self.rect.centerx) + self.game_settings.ship_speed_factor
if self.moving_left:
# self.rect.centerx -= 1
self.rect.centerx = float(self.rect.centerx) - self.game_settings.ship_speed_factor
print(self.rect.centerx)
ship.update()
中添加2个条件: 飞船的左右坐标值
必须再主屏幕左右坐标值
的大小的范围内容;
if self.moving_right:
if self.rect.right < self.screen_rect.right
pass
if self.moving_left:
if self.rect.left > 0
pass
if self.moving_right and self.rect_right < self.screen_rect.right:
pass
if self.moving_left and self.rect_left > 0:
pass
将“键盘按键”事件与“键盘释放”事件进行独立函数封装,然后再使用check_events()进行2个事件的调用。
import pygame, sys
def check_keydown_events(event, ship):
# 响应键盘按键事件
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
# ESC 退出事件监控
elif event.key == pygame.K_ESCAPE:
sys.exit()
def check_keyup_events(event, ship):
# 响应键盘释放事件
if event.key == pygame.K_RIGHT:
ship.moving_right = False
if event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ship):
# 事件监控函数
for event in pygame.event.get():
# 系统退出事件监控
if event.type == pygame.QUIT:
sys.exit()
# 通过键盘左右键的“按下”和“释放”事件监控,来实现飞船移动标志位属性值的控制
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ship)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)