@websec007
2020-06-10T02:01:43.000000Z
字数 3378
阅读 1195
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 = Falseself.moving_left = False
def update(self):if self.moving_right:self.rect.centerx += 1if 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 = Trueif event.key == pygame.K_LEFT:ship.moving_left = True
# 通过监控键盘释放事件,实现飞船左右移动标志位属性变更elif event.type = pygame.KEYUP:if event.key == pygame.K_RIGHT:ship.moving_right = Falseif event.key == pygame.K_lEFT:ship.moving_left = False
# alien_invasion.py...while True:...# update gamegf.update_screenship.update()
有关整个游戏内容的更新方法都已经封装到“gf.update_screen”中(update_screen()),故我们应该将飞船移动更新的方法也迁移合并到“game_function.py”中的“update_screen” 方法中;
# Update gamedef update_screen(screen, bg_color, ship):screen.fill(bg_color)# 添加飞船移动控制方法;ship.update()# 绘制飞船surface 到主屏幕surface中ship.blitme()
# settings.pyclass Settings():def __init__(self):....self.ship_speed_factor = 1.5
def update(self):if self.moving_right:# self.rect.centerx += 1self.rect.centerx = float(self.rect.centerx) + self.game_settings.ship_speed_factorif self.moving_left:# self.rect.centerx -= 1self.rect.centerx = float(self.rect.centerx) - self.game_settings.ship_speed_factorprint(self.rect.centerx)
ship.update() 中添加2个条件: 飞船的左右坐标值必须再主屏幕左右坐标值的大小的范围内容;
if self.moving_right:if self.rect.right < self.screen_rect.rightpassif self.moving_left:if self.rect.left > 0pass
if self.moving_right and self.rect_right < self.screen_rect.right:passif self.moving_left and self.rect_left > 0:pass
将“键盘按键”事件与“键盘释放”事件进行独立函数封装,然后再使用check_events()进行2个事件的调用。
import pygame, sysdef check_keydown_events(event, ship):# 响应键盘按键事件if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif 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 = Falseif event.key == pygame.K_LEFT:ship.moving_left = Falsedef 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)