---恢复内容开始---
一、Pygame是是一组功能强大而有趣的模块, 可用于管理图形、 动画乃至声音, 让你能够更轻松地开发复杂的游戏。 通过使用Pygame来处理在屏幕上绘制图像等任务
二、飞船大战外星人游戏项目,在开发之前,要明确项目涉及的方面,做好规划比立马就写更重要:
在游戏《外星人入侵》 中, 玩家控制着一艘最初出现在屏幕底部中央的飞船。 玩家可以使用箭头键左右移动飞船, 还可使用空格键进行射击。 游戏开始时, 一群外星人出现在天空中, 他们在屏幕中向下移动。 玩家的任务是射杀这些外星人。 玩家将所有外星人都消灭干净后, 将出现一群新的外星人, 他们移动的速度更快。 只要有外星人撞到了玩家的飞船或到达了屏幕底部, 玩家就损失一艘飞船。 玩家损失三艘飞船后, 游戏结束。
三、首先创建一个主文件夹alien_invasions,项目相关的文件都放在这里,项目主文件未alien_invasion.py,它可以调用其他模块,从而简化主文件
1 # -*- coding:utf-8 -*- 2 3 import sys 4 import pygame 5 from settings import Settings 6 from ship import Ship 7 import game_functions as gf # 将函数文件导入 8 from pygame.sprite import Group 9 from game_stats import GameStats10 from button import Button11 from scoreboard import ScoreBoard12 13 14 def run_game():15 '''初始化游戏,设置并创建一个屏幕对象'''16 pygame.init()17 ai_settings = Settings()18 screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))19 pygame.display.set_caption('Alien Invasion')20 21 '''创建一个用于统计游戏信息的实例'''22 stats = GameStats(ai_settings)23 24 '''创建游戏记分牌'''25 sb = ScoreBoard(screen, ai_settings, stats)26 27 '''创建一艘飞船, 一个子弹编组和一个外星人编组'''28 ship = Ship(ai_settings, screen)29 30 '''创建用于储存子弹和外星人的编组'''31 bullets = Group()32 aliens = Group()33 34 '''创建外星人群'''35 gf.create_fleet(ai_settings, screen, ship, aliens)36 37 '''创建play按钮'''38 play_button = Button(ai_settings, screen, 'Play')39 40 '''开始游戏的主循环'''41 while True:42 43 '''监视键盘鼠标事件'''44 gf.check_events(ai_settings, screen, ship, bullets, stats, play_button, aliens, sb)45 46 if stats.game_active:47 ship.update()48 49 '''更新子弹位置并删除已经消失的子弹'''50 gf.update_bullets(ai_settings, screen, ship, bullets, aliens, stats, sb)51 52 '''更新外星人位置'''53 gf.update_aliens(ai_settings, stats, aliens, ship, screen, bullets, sb)54 55 '''每次循环时重绘背景'''56 gf.update_screen(ai_settings, stats, screen, ship, aliens, bullets, play_button, sb)57 58 59 run_game()
四、创建游戏所有相关设置模块setting.py,这里包含了屏幕的长宽,子弹的设置等
1 # -*- coding:utf-8 -*- 2 3 class Settings(): 4 '''存储《外星人入侵》的所有设置的类''' 5 6 def __init__(self): 7 '''初始化游戏的设置''' 8 '''飞船和屏幕设置''' 9 self.screen_width = 120010 self.screen_height = 80011 self.bg_color = (255, 255, 255)12 self.ship_limit = 313 14 '''子弹设置'''15 self.bullet_width = 316 self.bullet_height = 1517 self.bullet_color = 60, 60, 6018 self.bullet_allowed = 3 # 屏幕可容纳的子弹数目19 20 '''外星人设置'''21 self.fleet_drop_speed = 1022 23 '''以什么速度加快游戏节奏'''24 self.speedup_scale = 1.125 26 self.initialize_dynamic_settings()27 28 def initialize_dynamic_settings(self):29 30 '''初始化随游戏变化的设置'''31 self.ship_speed_factor = 1.532 self.bullet_speed_factor = 333 self.alien_speed_factor = 0.534 35 '''记分'''36 self.alien_points = 5037 38 39 '''fleet_direction为1表示右移,-1表示左移'''40 self.fleet_direction = 141 42 def increase_speed(self):43 self.ship_speed_factor *= self.speedup_scale44 self.alien_speed_factor *= self.speedup_scale45 self.bullet_speed_factor *= self.speedup_scale46 self.alien_points = int(self.alien_points * self.speedup_scale)
五、创建好屏幕后,绘制飞船
1 # -*- coding:utf-8 -*- 2 3 import pygame 4 from pygame.sprite import Sprite 5 6 class Ship(Sprite): 7 8 def __init__(self, ai_settings, screen): 9 '''初始化飞船并设置其初始位置'''10 super(Ship, self).__init__()11 self.screen = screen12 self.ai_settings = ai_settings13 14 '''加载飞船图像并获取其外接矩形'''15 self.image = pygame.image.load('images/ship.bmp')16 '''原图图像过大,按比例缩小至适合大小'''17 width, height = self.image.get_size()18 self.image = pygame.transform.smoothscale(self.image, (width // 27, height // 27))19 self.rect = self.image.get_rect()20 self.screen_rect = screen.get_rect() # 存储表示屏幕的矩形21 22 '''将每艘飞船置于屏幕底部中央'''23 self.rect.centerx = self.screen_rect.centerx24 self.rect.bottom = self.screen_rect.bottom25 26 '''在飞船的属性center中储存小数值,因为rect只支持'''27 self.center = float(self.rect.centerx)28 self.center_up = float(self.rect.centery)29 30 '''移动标志,用于持续移动判断'''31 self.moving_right = False32 self.moving_left = False33 self.moving_up = False34 self.moving_down = False35 36 def update(self):37 '''根据移动标志调整飞船位置'''38 '''更新飞船的center以及center_up值,而非rect'''39 if self.moving_right and self.rect.right < self.screen_rect.right:40 self.center += self.ai_settings.ship_speed_factor41 if self.moving_left and self.rect.left > 0:42 self.center -= self.ai_settings.ship_speed_factor43 if self.moving_up and self.rect.top > 0:44 self.center_up -= self.ai_settings.ship_speed_factor45 if self.moving_down and self.rect.bottom < self.screen_rect.bottom:46 self.center_up += self.ai_settings.ship_speed_factor47 48 '''更新self.center对象更新rect'''49 self.rect.centerx = self.center50 self.rect.centery = self.center_up51 52 def blitme(self):53 '''在指定位置绘制飞机'''54 self.screen.blit(self.image, self.rect)55 56 def center_ship(self):57 '''将飞船重置在屏幕底部中间'''58 self.center = self.screen_rect.centerx59 self.center_up = self.screen_rect.bottom60 self.rect.centerx = self.center61 self.rect.centery = self.center_up
六、创建子弹编组
1 # -*- coding:utf-8 -*- 2 3 import pygame 4 from pygame.sprite import Sprite 5 6 '''子弹精灵''' 7 class Bullet(Sprite): 8 '''一个对飞船发射子弹进行管理的类''' 9 10 def __init__(self, ai_settings, screen, ship):11 '''在飞船所处的位置创建子弹对象'''12 super(Bullet, self).__init__()13 self.screen = screen14 15 '''在(0, 0)处创建子弹对象,并将其移到飞船位置'''16 self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)17 self.rect.centerx = ship.rect.centerx18 self.rect.top = ship.rect.top19 20 '''存储用小数表示的子弹位置'''21 self.y = float(self.rect.y)22 23 self.color = ai_settings.bullet_color24 self.speed__factor = ai_settings.bullet_speed_factor25 26 def update(self):27 '''向上移动子弹'''28 '''更新表示子弹移动的y值'''29 self.y -= self.speed__factor30 '''更新rect,y'''31 self.rect.y = self.y32 33 def draw_bullet(self):34 '''在屏幕上绘制子弹'''35 pygame.draw.rect(self.screen, self.color, self.rect)
七、绘制外星人
1 # -*- coding:utf-8 -*- 2 import pygame 3 from pygame.sprite import Sprite 4 5 6 class Alien(Sprite): 7 '''表示单个外星人的类''' 8 9 def __init__(self, ai_settings, screen):10 '''初始化外星人并设置其起始位置'''11 super(Alien, self).__init__()12 self.ai_settings = ai_settings13 self.screen = screen14 15 '''加载外星人图像,并设置其rect属性'''16 self.image = pygame.image.load('images/alien.bmp')17 width, height = self.image.get_size()18 self.image = pygame.transform.smoothscale(self.image, (width//15, height//15))19 self.rect = self.image.get_rect()20 21 '''每个外星人最初都在屏幕左上角附近'''22 self.rect.x = self.rect.width + 523 self.rect.y = self.rect.height24 25 '''存储外星人的准确位置'''26 self.x = float(self.rect.x)27 28 def blitme(self):29 '''在指定位置绘制外星人'''30 self.screen.blit(self.image, self.rect)31 32 def check_edges(self):33 '''检查外星人是否撞到边缘'''34 screen_rect = self.screen.get_rect()35 if self.rect.right >= screen_rect.right:36 return True37 elif self.rect.left <= 0:38 return True39 40 def update(self):41 '''向右移动外星人'''42 self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)43 self.rect.x = self.x