[关闭]
@websec007 2020-06-19T12:04:47.000000Z 字数 7317 阅读 859

第13章:外星人章节回顾

2020.Python从入门到实践


1. 一个外星人

1.1 创建一个外星人

  1. # 创建一个外星人的实例
  2. # 创建一个外星人的实例
  3. import pygame
  4. from pygame.sprite import Sprite
  5. class Alien(Sprite):
  6. def __init__(self, game_settings, screen):
  7. """初始化外星人并设置其起始位置"""
  8. super().__init__()
  9. self.screen = screen
  10. self.game_settings = game_settings
  11. # 加载外星人图像,并设置其rect属性
  12. self.image = pygame.image.load('images/alien.bmp')
  13. self.rect = self.image.get_rect()
  14. # 每个外星人最初都在屏幕左上角附近
  15. self.rect.x = self.rect.width
  16. self.rect.y = self.rect.height
  17. # 存储外星人的准确位置
  18. self.x = float(self.rect.x)
  19. def blitme(self):
  20. # 在指定位置绘制外星人
  21. self.screen.blit(self.image, self.rect)
  1. # 引入外星人类
  2. from alien import Alien
  3. ...
  4. # 创建外星人实例
  5. alien = Alien(screen, game_settings)

++++++++++++++++++++gf.update_screen()创建+++++++++++++++++++++++

  1. def update_screen(screen, bg_color, ship, bullets, alien):
  2. # Update Game
  3. screen.fill(bg_color)
  4. # 飞船移动更新
  5. ship.update()
  6. # 绘制子弹
  7. for bullet in bullets.sprites():
  8. bullet.draw_bullet()
  9. # 绘制飞船
  10. ship.blitme()
  11. # 绘制外星人
  12. alien.blitme()

+++++++++++++++++gf.update_screen()调用+++++++++++++++++++

  1. while True:
  2. # (1) process Input
  3. gf.check_events(ship, screen, game_settings, bullets)
  4. # (2) Update Game
  5. gf.update_screen(screen, bg_color, ship, bullets, alien)
  6. bullets.update()
  7. # (3) render
  8. pygame.display.update()

2. 一群外星人

2.1 创建一群外星人(一行)

2.1.1 基本步骤

2.1.2 实际代码

  1. ...
  2. # (1)创建一存放群外星人的空编组
  3. aliens = Group()
  4. # (2)创建一群外星人(一行)
  5. gf.create_fleet(..., aliens)
  6. # 3. Game loop
  7. while True:
  8. # (1) process Input
  9. gf.check_events(ship, screen, game_settings, bullets)
  10. # (2) Update Game
  11. bullets.update()
  12. gf.update_screen(screen, bg_color, ship, bullets, aliens)
  13. # (3) render
  14. pygame.display.update()

++++++++++++++++++++++++gf.create_fleet()++++++++++++++++++++

  1. def create_fleet(game_settings, screen, aliens):
  2. """创建外星人群"""
  3. # 创建一个外星人,并计算一行可容纳多少个外星人
  4. # 外星人间距为外星人宽度
  5. alien = Alien(game_settings, screen)
  6. alien_width = alien.rect.width
  7. available_space_x = game_settings.screen_width - 2 * alien_width
  8. number_aliens_x = int(available_space_x / (2 * alien_width))
  9. # 创建第一行外星人
  10. for alien_number in range(number_aliens_x):
  11. # 创建一个外星人并将其加入当前行
  12. alien = Alien(game_settings, screen)
  13. alien.x = alien_width + 2 * alien_width * alien_number
  14. alien.rect.x = alien.x
  15. aliens.add(alien)

++++++++++++++++++++++gf.update_screen()+++++++++++++++++++++

  1. def update_screen(screen, bg_color, ship, bullets, aliens):
  2. # Update Game
  3. screen.fill(bg_color)
  4. # 飞船移动更新
  5. ship.update()
  6. # 绘制子弹
  7. for bullet in bullets.sprites():
  8. bullet.draw_bullet()
  9. # 绘制飞船
  10. ship.blitme()
  11. # 绘制一群外星人(一行)
  12. aliens.draw(screen)
  1. def get_number_aliens_x(game_settings, alien_width):
  2. """计算每行可容纳多少个外星人"""
  3. available_space_x = game_settings.width - 2 * alien_width
  4. number_aliens_x = int(available_space_x / (2 * alien_width))
  5. return number_aliens_x
  6. def create_alien(game_settings, screen, aliens, alien_number):
  7. """创建一个外星人并将其放在当前行"""
  8. alien = Alien(game_settings, screen)
  9. alien_width = alien.rect.width
  10. alien.x = alien_width + 2 * alien_width * alien_number
  11. alien.rect.x = alien.x
  12. aliens.add(alien)
  13. def create_fleet(game_settings, screen, aliens):
  14. """创建外星人群"""
  15. # 创建一个外星人,并计算每行可容纳多少个外星人
  16. alien = Alien(game_settings, screen)
  17. number_aliens_x = get_number_aliens_x(game_settings, alien.rect.width)
  18. # 创建第一行外星人
  19. for alien_number in range(number_aliens_x):
  20. create_alien(game_settings, screen, aliens, alien_number)
  1. def get_number_aliens_x(screen, game_settings,):
  2. """计算一行可以存放多少外星人"""
  3. # 创建一个外星人
  4. alien = Alien(game_settings, screen)
  5. # 计算一行可以空间大小
  6. available_space_x = game_settings.width - 2*alien.rect.width
  7. # 计算一行可以存放多少外星人
  8. number_aliens_x = available_space_x / (2*alien.rect.width)
  9. return number_aliens_x
  10. def create_alien(game_settings, screen, alien_number, aliens):
  11. # 创建一外星人对象,然后获取逐个间隔摆放alien的位置坐标
  12. alien = Alien(game_settings, screen)
  13. alien.x = alien.rect.width + alien.rect.width * 2 * alien_number
  14. alien.rect.x = alien.x
  15. # 将创建的外星人对象逐个加入编组
  16. aliens.add(alien)
  17. def create_fleet(screen, game_settings, aliens):
  18. # 计算一行可以容纳多少外星人
  19. number_aliens_x = get_number_aliens_x(screen, game_settings)
  20. # 创建第一行的 “number_alien_number” 个外星人
  21. for alien_number in range(int(number_aliens_x)):
  22. # 逐个间隔摆放外星人
  23. create_alien(game_settings, screen, alien_number, aliens)

2.2 创建一群外星人(多行)

2.2.1 基本步骤

2.2.2 实际代码

  1. #(1)********************************************************
  2. def get_number_rows(game_settings, screen, ship):
  3. """计算屏幕可容纳多少行外星人"""
  4. # 创建一个外星人
  5. alien = Alien(game_settings, screen)
  6. # 计算可容纳多少行外星人
  7. available_space_y = (game_settings.height - (3 * alien.rect.height) - ship.rect.height)
  8. number_rows = int(available_space_y / (2 * alien.rect.height))
  9. return number_rows
  10. #********************************************************
  11. def get_number_aliens_x(screen, game_settings,):
  12. """计算一行可以存放多少外星人"""
  13. # 创建一个外星人
  14. alien = Alien(game_settings, screen)
  15. # 计算一行可以空间大小
  16. available_space_x = game_settings.width - 2*alien.rect.width
  17. # 计算一行可以存放多少外星人
  18. number_aliens_x = int(available_space_x / (2*alien.rect.width))
  19. return number_aliens_x
  20. #(2)********************************************************
  21. def create_alien(game_settings, screen, alien_number, row_number, aliens):
  22. # 创建一外星人对象,然后获取逐个间隔摆放alien的位置坐标
  23. alien = Alien(game_settings, screen)
  24. alien.x = alien.rect.width + alien.rect.width * 2 * alien_number
  25. alien.rect.x = alien.x
  26. alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
  27. # 将创建的外星人对象逐个加入编组
  28. aliens.add(alien)
  29. #********************************************************
  30. #(3)********************************************************
  31. def create_fleet(screen, game_settings, ship, aliens):
  32. # 计算一行可以容纳多少外星人
  33. number_aliens_x = get_number_aliens_x(screen, game_settings)
  34. # 计算可以容纳多少行外星人
  35. numbers_row = get_number_rows(game_settings, screen, ship)
  36. # 创建外星人舰队(多行)
  37. for row_number in range(numbers_row):
  38. # 创建第一行的 “number_alien_number” 外星人
  39. for alien_number in range(number_aliens_x):
  40. # 逐个间隔摆放外星人
  41. create_alien(game_settings, screen, alien_number, row_number, aliens)
  42. #********************************************************

3. 外星人群移动实现

3.1 1个基础类

为了实现外星人舰队的移动控制实现,对原Alien类进行新的“属性”和“方法”的添加。

3.1.1 新属性添加(@settings.py)

++++++++++++++++++++++settings.py+++++++++++++++++++++++++

  1. # 添加外星人屬性
  2. # 舰队移动方向控制属性
  3. self.fleet_direction = 1
  4. # 舰队下移速度控制属性
  5. self.fleet_drop_speed = 10
  6. # 外星人移动影响因子
  7. self.alien_speed_factor = 1

3.1.2 新方法添加

++++++++++++++++++++++Alien.py+++++++++++++++++++++++++

  1. class Alien(Sprite):
  2. .
  3. .
  4. .
  5. def update(self):
  6. """外星人左右移动更新方法创建"""
  7. self.x += self.game_settings.alien_speed_factor*self.game_settings.fleet_direction
  8. self.rect.x = self.x
  9. def check_edges(self):
  10. if self.rect.right >= self.screen.get_rect().right:
  11. return True
  12. elif self.rect.left <= 0:
  13. return True

3.2 3个核心步骤

3.2.1 创建外星人舰队

前面已经全部完成了,这就不在重复贴内容了,具体内容请见13.4章节内容。


3.2.2 “更新”外星人舰队移动

++++++++++++++++++++gf.check_fleet_edges++++++++++++++++++++++

  1. def change_fleet_direction(aliens, game_settings):
  2. """改变舰队移动方向前,先下移整个舰队"""
  3. for alien in aliens.sprites():
  4. alien.rect.y += game_settings.fleet_drop_speed
  5. """舰队整体下移后,随即改变舰队移动方向"""
  6. game_settings.fleet_direction *= -1
  7. def check_fleet_edges(aliens, game_settings):
  8. """外星人舰队所有成员碰壁检查,只要有一个碰壁事件发生,即刻调整舰队移动方向"""
  9. for alien in aliens.sprites():
  10. if alien.check_edges():
  11. change_fleet_direction(aliens, game_settings)
  12. break

++++++++++++++++++++++gf.update_aliens++++++++++++++++++++++++

  1. def update_aliens(aliens, game_settings):
  2. """外星人碰壁检查,并更新外星人位置"""
  3. check_fleet_edges(aliens, game_settings)
  4. aliens.update()

3.2.3 “绘制”外星人舰队移动

+++++++++++++++++++++gf.update_screen()+++++++++++++++++++++++

  1. def update_screen(screen, bg_color, ship, bullets, aliens, game_settings):
  2. # Update Game
  3. screen.fill(bg_color)
  4. # 飞船移动更新
  5. ship.update()
  6. # 绘制飞船图像
  7. ship.blitme()
  8. # 子弹组移动更新
  9. update_bullets(bullets)
  10. # 绘制编组中的每一个子弹矩形图形
  11. draw_bullets(bullets)
  12. # 外星人移动更新 ?
  13. update_aliens(aliens, game_settings)
  14. # 绘制外星人
  15. aliens.draw(screen)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注