@websec007
2020-06-19T12:04:47.000000Z
字数 7317
阅读 880
2020.Python从入门到实践
# 创建一个外星人的实例
# 创建一个外星人的实例
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
def __init__(self, game_settings, screen):
"""初始化外星人并设置其起始位置"""
super().__init__()
self.screen = screen
self.game_settings = game_settings
# 加载外星人图像,并设置其rect属性
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
# 每个外星人最初都在屏幕左上角附近
self.rect.x = self.rect.width
self.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 Game
screen.fill(bg_color)
# 飞船移动更新
ship.update()
# 绘制子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
# 绘制飞船
ship.blitme()
# 绘制外星人
alien.blitme()
+++++++++++++++++gf.update_screen()调用+++++++++++++++++++
while True:
# (1) process Input
gf.check_events(ship, screen, game_settings, bullets)
# (2) Update Game
gf.update_screen(screen, bg_color, ship, bullets, alien)
bullets.update()
# (3) render
pygame.display.update()
...
# (1)创建一存放群外星人的空编组
aliens = Group()
# (2)创建一群外星人(一行)
gf.create_fleet(..., aliens)
# 3. Game loop
while True:
# (1) process Input
gf.check_events(ship, screen, game_settings, bullets)
# (2) Update Game
bullets.update()
gf.update_screen(screen, bg_color, ship, bullets, aliens)
# (3) render
pygame.display.update()
++++++++++++++++++++++++gf.create_fleet()++++++++++++++++++++
def create_fleet(game_settings, screen, aliens):
"""创建外星人群"""
# 创建一个外星人,并计算一行可容纳多少个外星人
# 外星人间距为外星人宽度
alien = Alien(game_settings, screen)
alien_width = alien.rect.width
available_space_x = game_settings.screen_width - 2 * alien_width
number_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_number
alien.rect.x = alien.x
aliens.add(alien)
++++++++++++++++++++++gf.update_screen()+++++++++++++++++++++
def update_screen(screen, bg_color, ship, bullets, aliens):
# Update Game
screen.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_width
number_aliens_x = int(available_space_x / (2 * alien_width))
return number_aliens_x
def create_alien(game_settings, screen, aliens, alien_number):
"""创建一个外星人并将其放在当前行"""
alien = Alien(game_settings, screen)
alien_width = alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
aliens.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_x
def create_alien(game_settings, screen, alien_number, aliens):
# 创建一外星人对象,然后获取逐个间隔摆放alien的位置坐标
alien = Alien(game_settings, screen)
alien.x = alien.rect.width + alien.rect.width * 2 * alien_number
alien.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_number
alien.rect.x = alien.x
alien.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_direction
self.rect.x = self.x
def check_edges(self):
if self.rect.right >= self.screen.get_rect().right:
return True
elif 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 *= -1
def 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 Game
screen.fill(bg_color)
# 飞船移动更新
ship.update()
# 绘制飞船图像
ship.blitme()
# 子弹组移动更新
update_bullets(bullets)
# 绘制编组中的每一个子弹矩形图形
draw_bullets(bullets)
# 外星人移动更新 ?
update_aliens(aliens, game_settings)
# 绘制外星人
aliens.draw(screen)