发布时间:2023-11-27 15:07:10 浏览量:93次
今天小编就来教你如何用 Python 制作飞机大战的游戏项目 !
项目开发代码免费获取【见文末】
请相信我是一个单纯的孩子 ,也相信大家明白我说的打飞机是指啥意思 ,对吧 ? 嗯 ,没毛病 。就是 用 pygame 实现一个飞机大战的游戏 ,优秀的我啊 !
我们知道 pygame 框架可以用于管理图形 、动画声音等 ,能够利用它来轻松地开发复杂的游戏 ,可以让我们更加专注于面向对象编程 。此项目是基于 pygame 框架搭建的一个小游戏 ,在此文中将实现此项目的 50% ,后续会有跟进 ,源代码已经放在我的 GitHub 中 ,并在进行中将会不断对代码结构进行优化 ,对样式进行优化 。在本例中将会接触简单的面向对象编程和继承 。面向对象编程是提取项目中某种事物的关键属性进行抽象 ,抽象模型中包括数据和行为 ,类是对象的抽象 ,对象是类的实例 。
项目开发代码免费获取【见文末】
先送上一波效果图(被压缩的时间略短)
效果图
游戏简介 :在游戏《外星人入侵》中 ,玩家控制着一艘最初出现在屏幕底部中央的飞船 。玩家可以使用箭头键左右移动飞船 ,还可使用空格键进行射击 。游戏开始时 ,一群外星人出现在天空中 ,他们在屏幕中向下移动 。玩家的任务是射杀这些外星人 。玩家将所有外星人都消灭干净后 ,将出现一群新的外星人 ,他们移动的速度更快 。只要有外星人撞到了玩家的飞船或到达了屏幕底部 ,玩家就损失一艘飞船 。玩家损失三艘飞船后 ,游戏结束 。
游戏用例图(第一次画用例图,不是很准确……)
例图
析该项目 ,飞船 、子弹 、外星人可以分别划分为具有共同属性的一类 ,类中定义各自的属性 ,包括图像 、形状 、位置 、更新位置 、绘制图像等 ;在主函数中将对象实例化 ,对对象中的成员变量和函数进行调用实现移动 、击杀等操作 ;本节实现飞船和子弹类和基本功能 。
在构建子弹类时 ,用到了继承的概念 ,当在参与大型项目开发设计时 ,继承是一个非常关键的概念 。继承是对已有类的一种复用 ,子类继承父类 ,可以对父类中的方法和数据进行重写 ,也可以新定义只属于子类的成员变量 。当项目中有许多类具有相同的基本属性时 ,可以考虑将这些基本属性抽象为一个父类 ,子类通过继承父类而拥有父类中的数据和方法 ,这会提高代码的可读性 ,也省去很多重复的代码 。
新建以下几个文件 :
其目录结构如下 :
方法 1——
方法2——
代码
alien-invasion.py
import pygame from settings import Settings from ship import Ship import game_functions as gf from pygame.sprite import Group def run_game(): pygame.init() # 获取配置 game_settings = Settings() # 绘制屏幕 screen = pygame.display.set_mode((game_settings.screen_width,game_settings.screen_height)) backgound_color = (220,230,230) pygame.display.set_caption("Alien Invasion") # 飞船实例化 ship = Ship(game_settings,screen) # 子弹编组,管理屏幕中所有的子弹,保存继承Sprite类的Bullet实例 bullets = Group() while True: # 检测飞船事件:左移右移发射子弹 gf.check_events(ship,game_settings,screen,bullets) # 修改飞船移动标志 ship.update() # 根据飞船移动标志重新计算飞船中心位置 # 更新所有子弹位置 gf.update_bullets(bullets) # 绘制飞船子弹 gf.update_screen(game_settings,screen,ship,bullets) run_ame()
ship.py类
import pygame class Ship(object): """docstring for Ship""" def __init__(self, game_settings,screen): super(Ship, self).__init__() self.game_settings = game_settings self.screen = screen # screen游戏界面 self.image = pygame.image.load('images/外星飞船.png').convert_alpha() # 加载飞船图像 # 修改图像大小 self.width,self.height = self.image.get_size() self.image = pygame.transform.smoothscale(self.image,(self.width//2,self.height//2)) self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() # 获取游戏界面的中心x坐标和底部位置便可确定飞船位置 self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom - game_settings.screen_height / 5 self.center = float(self.rect.centerx) # centerx中只能表示整数 # 移动标志 self.moving_right = False self.moving_left = False ef update(self): """ 根据移动标志调整飞船位置 更改为根据self.center更新位置 """ if self.moving_right and self.rect.right < self.screen_rect.right: # self.rect.centerx += 1 self.center += self.game_settings.ship_speed_factor if self.moving_left and self.rect.left > 0: # self.rect.centerx -= 1 self.center -= self.game_settings.ship_speed_factor # 更新centerx,因为绘制图形是根据self.rect() # self.rect()定位需要根据centerx,bottom self.rect.centerx = self.center de blitme(self): """在self.rect位置绘制图像""" self.screen.blit(self.image,self.rect)
bullet.py
在子弹类中尤为需要说明的是该类继承了Sprite精灵类 ,继承精灵类中的方法 。
import pygame from pygame.sprite import Sprite # 继承Spite类,完善自己的代码 class Bullet(Sprite): """docstring for Bullet""" def __init__(self, game_settings,screen,ship): super(Bullet, self).__init__() self.screen = screen # # 在0,0位置创建bullet,并设置宽高 # self.rect = pygame.Rect(0,0,game_settings.bullet_width,game_settings.bullet_height) # # 调整子弹位置到飞船所在位置,调整top相同,中心x坐标相同 # self.rect.centerx = ship.rect.centerx # self.rect.top = ship.rect.top # # 将y坐标存储为小数值,以便能够微调子弹的速度 # self.y = float(self.rect.y) # self.color = game_settings.bullet_color # self.speed_factor = game_settings.bullet_speed_factor # 把子弹换成一个好玩的图片,把图片转换成位图 self.image = pygame.image.load('images/生气.png').convert_alpha() # 修改图像大小 self.width,self.height = self.image.get_size() self.image = pygame.transform.smoothscale(self.image,(self.width//10,self.height//10)) self.rect = self.image.get_rect() # 调整子弹位置到飞船所在位置,调整top相同,中心x坐标相同 self.rect.centerx = ship.rect.centerx self.rect.top = ship.rect.top # 将y坐标存储为小数值,以便能够微调子弹的速度 self.y = float(self.rect.y) self.speed_factor = game_settings.bullet_speed_factor def udate(self): """向上移动子弹""" # 更新一次坐标y向上移动speed_factor个像素 self.y -= self.speed_factor # 更新子弹的rect位置 self.rect.y = self.y def daw_bullet(self): # """ # API:rect(Surface,color,Rect,width=0)->Rect # draw a rectangular shape on the Surgace # The width argument is the thickness to draw the outer edge. # If width is zero then the rectangle will be filled. # """ # pygame.draw.rect(self.screen,self.color,self.rect) """在self.rect位置绘制图像""" self.screen.blit(self.image,self.rect)
game_functions.py
import pygame import sys from bullet import Bullet def check_eydown_events(event,ship,game_settings,screen,bullets): """ 按下键盘事件:右移,左移,发射子弹 """ if event.key == pygame.K_RIGHT: ship.moving_right = True elif event.key == pygame.K_LEFT: ship.moving_left = True elif event.key == pygame.K_SPACE: fire_bullet(game_settings,screen,ship,bullets) def fire_bulet(game_settings,screen,ship,bullets): """ 如果没有超过当前屏幕显示的最多子弹数,实例化子弹,添加到子弹编组中 """ if(len(bullets) < game_settings.bullet_allowed): bullet = Bullet(game_settings,screen,ship) bullets.add(bullet) def check_keyp_events(event,ship): """ 抬起键,抬起空格不发生任何事 """ if event.key == pygame.K_RIGHT: ship.moving_right = False elif event.key == pygame.K_LEFT: ship.moving_left = False def check_evets(ship,game_settings,screen,bullets): for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: check_keydown_events(event,ship,game_settings,screen,bullets) elif evnt.type == pygame.KEYUP: check_keyup_events(event,ship) def update_scren(game_settings,screen,ship,bullets): screen.fill(game_settings.background_color) ship.blitme() """ API:pygame.sprite.Group.sprites sprites() -> sprite_list bullet迭代器 """ for bullet in bullets.sprites(): bullet.draw_bullet() pygame.display.flip() def update_bulletbullets): bullets.update() # 超出屏幕边界移除子弹 # 子弹编组副本 for bullet in bullets.copy(): if bullet.rect.bottom <= 0: bullets.remove(bullet) # 注释掉,调试用,耗时 # print(len(bullets))
settings.py配置文件
将常量变量继承在配置文件中 ,当需要修改常量提高游戏体验时 ,直接修改该文件即可
class Settings(object): """docstring for Settings""" def __init__(self): super(Settings, self).__init__() self.screen_width = 1200 self.screen_height = 800 self.background_color = (230,230,230) self.ship_speed_factor = 1.5 # 飞船一个while循环走1.5像素 # 子弹配置 self.bullet_width = 3 self.bullet_height = 15 self.bullet_color = (120,120,120) self.bullet_speed_factor = 3 self.bullet_allowed = 5 # 最大子弹数
pygame接口文档总结
1. 转发文章+关注小编
2. 私信回复“ Python ”获取本套游戏源码+视频学习资料
热门资讯
探讨游戏引擎的文章,介绍了10款游戏引擎及其代表作品,涵盖了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戏设计领域和数字艺术教育的重要性,欢迎点击咨询报名。
游戏中玩家将面临武侠人生的挣扎抉择,战或降?杀或放?每个抉定都将触发更多爱恨纠葛的精彩奇遇。《天命奇御》具有多线剧情多结局,不限主线发展,高自由...
3. B站视频剪辑软件「必剪」:免费、炫酷特效,小白必备工具
B站视频剪辑软件「必剪」,完全免费、一键制作炫酷特效,适合新手小白。快来试试!
4. 手机游戏如何开发(如何制作传奇手游,都需要准备些什么?)
如何制作传奇手游,都需要准备些什么?提到传奇手游相信大家都不陌生,他是许多80、90后的回忆;从起初的端游到现在的手游,说明时代在进步游戏在更新,更趋于方便化移动化。而如果我们想要制作一款传奇手游的
5. 3D动画软件你知道几个?3ds Max、Blender、Maya、Houdini大比拼
当提到3D动画软件或动画工具时,指的是数字内容创建工具。它是用于造型、建模以及绘制3D美术动画的软件程序。但是,在3D动画软件中还包含了其他类型的...
三昧动漫对于著名ARPG游戏《巫师》系列,最近CD Projekt 的高层回应并不会推出《巫师4》。因为《巫师》系列在策划的时候一直定位在“三部曲”的故事框架,所以在游戏的出品上不可能出现《巫师4》
一、声音优化在绝地求生游戏中能够提前听到脚步声往往能提前取得战机,主要有两种方法:1、利用SoundLock软件,软件的功能主要是限制最大音量。百度搜索...
众所周知,虚幻引擎5(下面简称UE5)特别占用存储空间,仅一个版本安装好的文件就有60G,这还不包括我们在使用时保存的工程文件和随之产生的缓存文件。而...
UI设计师、动画设计师、特效设计师每一个职位的功能和负责的方面都不同。所以,3D美术这方面需要大量的人才。但是要成为一个3D游戏建模师,也不是那么...
想让你的3D打印模型更坚固?不妨尝试一下Cura参数设置和设计技巧,让你轻松掌握!
最新文章