博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pygame外星人
阅读量:5066 次
发布时间:2019-06-12

本文共 7988 字,大约阅读时间需要 26 分钟。

---恢复内容开始---

一、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

 

转载于:https://www.cnblogs.com/czmiracle/p/11426497.html

你可能感兴趣的文章
POJ 2135 Farm Tour (费用流)
查看>>
使用JavaScript实现一个俄罗斯方块
查看>>
Python爬虫框架Scrapy安装使用步骤
查看>>
Anaconda 下libsvm的安装
查看>>
列表生成式
查看>>
SSM整合项目中使用百度Ueditor遇到的问题。
查看>>
复制文件
查看>>
作业调度模拟程序
查看>>
C++ inline
查看>>
SpringMVC中JSP取不到ModelAndView的数据原因
查看>>
cenos 安装 phpredis 扩展
查看>>
Yii2 的 redis 应用
查看>>
sqlplus登陆
查看>>
[翻译svg教程]svg中的circle元素
查看>>
HDU 1201 Fibonacci Again
查看>>
ASP.NET MVC视图和控制器之间的传值总结(一)
查看>>
敏捷与 DevOps:是敌是友?
查看>>
bzoj1588营业额统计
查看>>
概率与数学期望
查看>>
MySQL 5.1完全卸载
查看>>