@websec007
2020-06-19T04:04:47.000000Z
字数 7317
阅读 1298
2020.Python从入门到实践
# 创建一个外星人的实例# 创建一个外星人的实例import pygamefrom pygame.sprite import Spriteclass Alien(Sprite):def __init__(self, game_settings, screen):"""初始化外星人并设置其起始位置"""super().__init__()self.screen = screenself.game_settings = game_settings# 加载外星人图像,并设置其rect属性self.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()# 每个外星人最初都在屏幕左上角附近self.rect.x = self.rect.widthself.rect.y = self.rect.height# 存储外星人的准确位置self.x = float(self.rect.x)def blitme(self):# 在指定位置绘制外星人self.screen.blit(self.image, self.rect)
# 引入外星人类from alien import Alien...# 创建外星人实例alien = Alien(screen, game_settings)
++++++++++++++++++++gf.update_screen()创建+++++++++++++++++++++++
def update_screen(screen, bg_color, ship, bullets, alien):# Update Gamescreen.fill(bg_color)# 飞船移动更新ship.update()# 绘制子弹for bullet in bullets.sprites():bullet.draw_bullet()# 绘制飞船ship.blitme()# 绘制外星人alien.blitme()
+++++++++++++++++gf.update_screen()调用+++++++++++++++++++
while True:# (1) process Inputgf.check_events(ship, screen, game_settings, bullets)# (2) Update Gamegf.update_screen(screen, bg_color, ship, bullets, alien)bullets.update()# (3) renderpygame.display.update()
...# (1)创建一存放群外星人的空编组aliens = Group()# (2)创建一群外星人(一行)gf.create_fleet(..., aliens)# 3. Game loopwhile True:# (1) process Inputgf.check_events(ship, screen, game_settings, bullets)# (2) Update Gamebullets.update()gf.update_screen(screen, bg_color, ship, bullets, aliens)# (3) renderpygame.display.update()
++++++++++++++++++++++++gf.create_fleet()++++++++++++++++++++
def create_fleet(game_settings, screen, aliens):"""创建外星人群"""# 创建一个外星人,并计算一行可容纳多少个外星人# 外星人间距为外星人宽度alien = Alien(game_settings, screen)alien_width = alien.rect.widthavailable_space_x = game_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))# 创建第一行外星人for alien_number in range(number_aliens_x):# 创建一个外星人并将其加入当前行alien = Alien(game_settings, screen)alien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xaliens.add(alien)
++++++++++++++++++++++gf.update_screen()+++++++++++++++++++++
def update_screen(screen, bg_color, ship, bullets, aliens):# Update Gamescreen.fill(bg_color)# 飞船移动更新ship.update()# 绘制子弹for bullet in bullets.sprites():bullet.draw_bullet()# 绘制飞船ship.blitme()# 绘制一群外星人(一行)aliens.draw(screen)
def get_number_aliens_x(game_settings, alien_width):"""计算每行可容纳多少个外星人"""available_space_x = game_settings.width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_xdef create_alien(game_settings, screen, aliens, alien_number):"""创建一个外星人并将其放在当前行"""alien = Alien(game_settings, screen)alien_width = alien.rect.widthalien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xaliens.add(alien)def create_fleet(game_settings, screen, aliens):"""创建外星人群"""# 创建一个外星人,并计算每行可容纳多少个外星人alien = Alien(game_settings, screen)number_aliens_x = get_number_aliens_x(game_settings, alien.rect.width)# 创建第一行外星人for alien_number in range(number_aliens_x):create_alien(game_settings, screen, aliens, alien_number)
def get_number_aliens_x(screen, game_settings,):"""计算一行可以存放多少外星人"""# 创建一个外星人alien = Alien(game_settings, screen)# 计算一行可以空间大小available_space_x = game_settings.width - 2*alien.rect.width# 计算一行可以存放多少外星人number_aliens_x = available_space_x / (2*alien.rect.width)return number_aliens_xdef create_alien(game_settings, screen, alien_number, aliens):# 创建一外星人对象,然后获取逐个间隔摆放alien的位置坐标alien = Alien(game_settings, screen)alien.x = alien.rect.width + alien.rect.width * 2 * alien_numberalien.rect.x = alien.x# 将创建的外星人对象逐个加入编组aliens.add(alien)def create_fleet(screen, game_settings, aliens):# 计算一行可以容纳多少外星人number_aliens_x = get_number_aliens_x(screen, game_settings)# 创建第一行的 “number_alien_number” 个外星人for alien_number in range(int(number_aliens_x)):# 逐个间隔摆放外星人create_alien(game_settings, screen, alien_number, aliens)
#(1)********************************************************def get_number_rows(game_settings, screen, ship):"""计算屏幕可容纳多少行外星人"""# 创建一个外星人alien = Alien(game_settings, screen)# 计算可容纳多少行外星人available_space_y = (game_settings.height - (3 * alien.rect.height) - ship.rect.height)number_rows = int(available_space_y / (2 * alien.rect.height))return number_rows#********************************************************def get_number_aliens_x(screen, game_settings,):"""计算一行可以存放多少外星人"""# 创建一个外星人alien = Alien(game_settings, screen)# 计算一行可以空间大小available_space_x = game_settings.width - 2*alien.rect.width# 计算一行可以存放多少外星人number_aliens_x = int(available_space_x / (2*alien.rect.width))return number_aliens_x#(2)********************************************************def create_alien(game_settings, screen, alien_number, row_number, aliens):# 创建一外星人对象,然后获取逐个间隔摆放alien的位置坐标alien = Alien(game_settings, screen)alien.x = alien.rect.width + alien.rect.width * 2 * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number# 将创建的外星人对象逐个加入编组aliens.add(alien)#********************************************************#(3)********************************************************def create_fleet(screen, game_settings, ship, aliens):# 计算一行可以容纳多少外星人number_aliens_x = get_number_aliens_x(screen, game_settings)# 计算可以容纳多少行外星人numbers_row = get_number_rows(game_settings, screen, ship)# 创建外星人舰队(多行)for row_number in range(numbers_row):# 创建第一行的 “number_alien_number” 外星人for alien_number in range(number_aliens_x):# 逐个间隔摆放外星人create_alien(game_settings, screen, alien_number, row_number, aliens)#********************************************************
为了实现外星人舰队的移动控制实现,对原Alien类进行新的“属性”和“方法”的添加。
++++++++++++++++++++++settings.py+++++++++++++++++++++++++
# 添加外星人屬性# 舰队移动方向控制属性self.fleet_direction = 1# 舰队下移速度控制属性self.fleet_drop_speed = 10# 外星人移动影响因子self.alien_speed_factor = 1
++++++++++++++++++++++Alien.py+++++++++++++++++++++++++
class Alien(Sprite):...def update(self):"""外星人左右移动更新方法创建"""self.x += self.game_settings.alien_speed_factor*self.game_settings.fleet_directionself.rect.x = self.xdef check_edges(self):if self.rect.right >= self.screen.get_rect().right:return Trueelif self.rect.left <= 0:return True
前面已经全部完成了,这就不在重复贴内容了,具体内容请见13.4章节内容。
(@ check_fleet_edges());(@aliens.update());++++++++++++++++++++gf.check_fleet_edges++++++++++++++++++++++
def change_fleet_direction(aliens, game_settings):"""改变舰队移动方向前,先下移整个舰队"""for alien in aliens.sprites():alien.rect.y += game_settings.fleet_drop_speed"""舰队整体下移后,随即改变舰队移动方向"""game_settings.fleet_direction *= -1def check_fleet_edges(aliens, game_settings):"""外星人舰队所有成员碰壁检查,只要有一个碰壁事件发生,即刻调整舰队移动方向"""for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(aliens, game_settings)break
++++++++++++++++++++++gf.update_aliens++++++++++++++++++++++++
def update_aliens(aliens, game_settings):"""外星人碰壁检查,并更新外星人位置"""check_fleet_edges(aliens, game_settings)aliens.update()
+++++++++++++++++++++gf.update_screen()+++++++++++++++++++++++
def update_screen(screen, bg_color, ship, bullets, aliens, game_settings):# Update Gamescreen.fill(bg_color)# 飞船移动更新ship.update()# 绘制飞船图像ship.blitme()# 子弹组移动更新update_bullets(bullets)# 绘制编组中的每一个子弹矩形图形draw_bullets(bullets)# 外星人移动更新 ?update_aliens(aliens, game_settings)# 绘制外星人aliens.draw(screen)