---恢复内容开始---
一、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 GameStats 10 from button import Button 11 from scoreboard import ScoreBoard 12 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 = 1200 10 self.screen_height = 800 11 self.bg_color = (255, 255, 255) 12 self.ship_limit = 3 13 14 '''子弹设置''' 15 self.bullet_width = 3 16 self.bullet_height = 15 17 self.bullet_color = 60, 60, 60 18 self.bullet_allowed = 3 # 屏幕可容纳的子弹数目 19 20 '''外星人设置''' 21 self.fleet_drop_speed = 10 22 23 '''以什么速度加快游戏节奏''' 24 self.speedup_scale = 1.1 25 26 self.initialize_dynamic_settings() 27 28 def initialize_dynamic_settings(self): 29 30 '''初始化随游戏变化的设置''' 31 self.ship_speed_factor = 1.5 32 self.bullet_speed_factor = 3 33 self.alien_speed_factor = 0.5 34 35 '''记分''' 36 self.alien_points = 50 37 38 39 '''fleet_direction为1表示右移,-1表示左移''' 40 self.fleet_direction = 1 41 42 def increase_speed(self): 43 self.ship_speed_factor *= self.speedup_scale 44 self.alien_speed_factor *= self.speedup_scale 45 self.bullet_speed_factor *= self.speedup_scale 46 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 = screen 12 self.ai_settings = ai_settings 13 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.centerx 24 self.rect.bottom = self.screen_rect.bottom 25 26 '''在飞船的属性center中储存小数值,因为rect只支持''' 27 self.center = float(self.rect.centerx) 28 self.center_up = float(self.rect.centery) 29 30 '''移动标志,用于持续移动判断''' 31 self.moving_right = False 32 self.moving_left = False 33 self.moving_up = False 34 self.moving_down = False 35 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_factor 41 if self.moving_left and self.rect.left > 0: 42 self.center -= self.ai_settings.ship_speed_factor 43 if self.moving_up and self.rect.top > 0: 44 self.center_up -= self.ai_settings.ship_speed_factor 45 if self.moving_down and self.rect.bottom < self.screen_rect.bottom: 46 self.center_up += self.ai_settings.ship_speed_factor 47 48 '''更新self.center对象更新rect''' 49 self.rect.centerx = self.center 50 self.rect.centery = self.center_up 51 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.centerx 59 self.center_up = self.screen_rect.bottom 60 self.rect.centerx = self.center 61 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 = screen 14 15 '''在(0, 0)处创建子弹对象,并将其移到飞船位置''' 16 self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height) 17 self.rect.centerx = ship.rect.centerx 18 self.rect.top = ship.rect.top 19 20 '''存储用小数表示的子弹位置''' 21 self.y = float(self.rect.y) 22 23 self.color = ai_settings.bullet_color 24 self.speed__factor = ai_settings.bullet_speed_factor 25 26 def update(self): 27 '''向上移动子弹''' 28 '''更新表示子弹移动的y值''' 29 self.y -= self.speed__factor 30 '''更新rect,y''' 31 self.rect.y = self.y 32 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_settings 13 self.screen = screen 14 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 + 5 23 self.rect.y = self.rect.height 24 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 True 37 elif self.rect.left <= 0: 38 return True 39 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