[关闭]
@websec007 2020-06-10T02:01:43.000000Z 字数 3378 阅读 267

Alien Invasion - 12.6 驱动飞船

2020.Python从入门到实践


12.6 创建飞船

12.6.3 控制飞船移动


“飞船的移动方法”我们最直接想到的是通过“键盘事件属性(right/left)”的交互来控制,但是为支持“持续的移动”,我们需要在2这中间添加一个“移动标志位属性(True/False)”来实现;

---> “飞船持续移动”的实现,其核心就是这个“移动标志位属性(True/False)”来实现;


1. ship.py部分:通过移动标志位实现飞船左右移动控制

在ship 类中创建“移动标志位”与“飞船移动更新方法”,通过 “移动标志位”来实现“飞船位置不断移动的更新”控制;

  1. self.moving_right = False
  2. self.moving_left = False
  1. def update(self):
  2. if self.moving_right:
  3. self.rect.centerx += 1
  4. if self.moving_left:
  5. self.rect.centerx -= 1

2. game_functions.py 部分:通过“键盘事件监控”实现“飞船移动标志位属性”控制

在 game_functions 模块中通过监控 “键盘事件” 实现对 “飞船移动标志位”属性的更新控制;

  1. for event.type = pygame.event_get():
  2. ......
  3. # 通过监控键盘按下事件,实现飞船左右移动标志位属性变更;
  4. elif event.type = pygame.KEYDOWN:
  5. if evnet.key == pygame.K_RIGHT:
  6. ship.moving_right = True
  7. if event.key == pygame.K_LEFT:
  8. ship.moving_left = True
  1. # 通过监控键盘释放事件,实现飞船左右移动标志位属性变更
  2. elif event.type = pygame.KEYUP:
  3. if event.key == pygame.K_RIGHT:
  4. ship.moving_right = False
  5. if event.key == pygame.K_lEFT:
  6. ship.moving_left = False

3. 飞船移动方法的调用

  1. # alien_invasion.py
  2. ...
  3. while True:
  4. ...
  5. # update game
  6. gf.update_screen
  7. ship.update()

有关整个游戏内容的更新方法都已经封装到“gf.update_screen”中(update_screen()),故我们应该将飞船移动更新的方法也迁移合并到“game_function.py”中的“update_screen” 方法中;

  1. # Update game
  2. def update_screen(screen, bg_color, ship):
  3. screen.fill(bg_color)
  4. # 添加飞船移动控制方法;
  5. ship.update()
  6. # 绘制飞船surface 到主屏幕surface中
  7. ship.blitme()

12.6.4 控制飞船速度(浮点数支持)

  1. # settings.py
  2. class Settings():
  3. def __init__(self):
  4. ....
  5. self.ship_speed_factor = 1.5
  1. def update(self):
  2. if self.moving_right:
  3. # self.rect.centerx += 1
  4. self.rect.centerx = float(self.rect.centerx) + self.game_settings.ship_speed_factor
  5. if self.moving_left:
  6. # self.rect.centerx -= 1
  7. self.rect.centerx = float(self.rect.centerx) - self.game_settings.ship_speed_factor
  8. print(self.rect.centerx)

12.6.5 控制飞船范围

  1. if self.moving_right:
  2. if self.rect.right < self.screen_rect.right
  3. pass
  4. if self.moving_left:
  5. if self.rect.left > 0
  6. pass
  1. if self.moving_right and self.rect_right < self.screen_rect.right:
  2. pass
  3. if self.moving_left and self.rect_left > 0:
  4. pass

12.6.6 重构check_events()

将“键盘按键”事件与“键盘释放”事件进行独立函数封装,然后再使用check_events()进行2个事件的调用。

  1. import pygame, sys
  2. def check_keydown_events(event, ship):
  3. # 响应键盘按键事件
  4. if event.key == pygame.K_RIGHT:
  5. ship.moving_right = True
  6. elif event.key == pygame.K_LEFT:
  7. ship.moving_left = True
  8. # ESC 退出事件监控
  9. elif event.key == pygame.K_ESCAPE:
  10. sys.exit()
  11. def check_keyup_events(event, ship):
  12. # 响应键盘释放事件
  13. if event.key == pygame.K_RIGHT:
  14. ship.moving_right = False
  15. if event.key == pygame.K_LEFT:
  16. ship.moving_left = False
  17. def check_events(ship):
  18. # 事件监控函数
  19. for event in pygame.event.get():
  20. # 系统退出事件监控
  21. if event.type == pygame.QUIT:
  22. sys.exit()
  23. # 通过键盘左右键的“按下”和“释放”事件监控,来实现飞船移动标志位属性值的控制
  24. elif event.type == pygame.KEYDOWN:
  25. check_keydown_events(event, ship)
  26. elif event.type == pygame.KEYUP:
  27. check_keyup_events(event, ship)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注