我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Pygame库200行代码实现简易飞机大战的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Pygame库200行代码实现简易飞机大战的示例分析

这篇文章将为大家详细讲解有关Pygame库200行代码实现简易飞机大战的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

写在开头,因为这个小游戏的实验主要是帮助我熟悉pygame库的使用,所以游戏的一些地方可能存在不完善处,还望包涵。

Pygame库200行代码实现简易飞机大战的示例分析

安装使用库

pygame简介

pygame是跨平台python模块,专为电子游戏设计,包括图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言束缚, 开发者可以把精力放在游戏的架构上。

pgame中主要模块介绍

(1) pygame

pygame模块会自动导入其它的pygame相关模块。

pygame模块包括surface函数, 可以返回一个新的surface 对象。 init()函数是pygame游戏的核心,必须在进入游戏的主循环之前调用。init()会自动初始化其它所有模块。

(2) pygame.locals

包括在你自己的模块作用域内使用的名字(变量)。包括事件类型、键和视频模式等的名字。

(3) pygame.display

包括处理pygame显示方式的函数。包括普通窗口和全屏模式。 pygame.display中一些常用的方法如下:

  • flip:更新显示。

  • update:更新一部分时候使用update。

  • set_mode:设定显示的类型和尺寸。

  • set_caption:设定pygame程序的标题。

  • get_surface:调用flip和blit前返回一个可用于画图的surface对象。

(4) pygame.font

包括font函数,用于表现不同的字体。

(5) pygame.sprite

游戏精灵,Group用做sprite对象的容器。调用group对象的update对象,会自动调用所有sprite对象的update方法。

(6) pygame.mouse

隐藏鼠标光标,获取鼠标位置。

(7) pygame.event

追踪鼠标单击、按键按下和释放等事件。

(8) pygame.image

用于处理保存在GIF、PNG或者JPEG文件内的图像。

注:程序中除了local模块和font模块没有使用,其他模块均有涉及。

pygame的安装

你可以选择使用pycharm中工具栏下方的python packages搜索pygame进行安装,当然也可以使用cmd命令符中常用的pip install pygame 的方法。

安装超时网速慢,直接超时,可以指定国内源镜像。

pip install -i 国内镜像地址 包名

例如: pip install -i https://mirrors.aliyun.com/pypi/simple/ numpy

国内常用源镜像地址:

清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学:  https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣:http://pypi.douban.com/simple/

验证安装

验证pygame是否安装成功,在cmd命令符中使用 pip list 语句,如果安装成功,我们可以在下方结果中找到。

Pygame库200行代码实现简易飞机大战的示例分析

程序原理

首先创建游戏的主窗体,主窗体的大小就是你背景图片的大小。

import pygame#游戏初始化pygame.init()#创建游戏主窗口screen = pygame.display.set_mode((480,700))#绘制背景图香#1 加载图像数据background = pygame.image.load('./image/background.png')#2 blit绘制图像#从左上角绘制screen.blit(background,(0,0))pygame.display.update()#卸载所有的模块pygame.quit()

绘制图像时的方向,后面我们主机、敌机、背景、子弹的方向都需要注意这一点。

Pygame库200行代码实现简易飞机大战的示例分析

背景图像绘制完之后就是我们主机、敌机的绘制,我们可以在所有的绘制工作完成后再统一调用update方法

#绘制飞机图片hero = pygame.image.load('./image/hero2.png')screen.blit(hero,(150,300))pygame.display.update()

其实飞机大战的原理和动画片的原理一致,我们需要对一个个按下的指令进行反应,从而形成一个连贯的画面,这里我们就需要使用到pygame库中的time模块

#创造时钟对象  屏幕绘制速率clock = pygame.time.Clock()#游戏循环while True:#指定循环体内部代码的执行频率   每秒重复60次clock.tick(60)#将移动前飞机进行遮挡 达到动画效果screen.blit(background, (0, 0))screen.blit(hero,hero_rect)

如果你想停止程序,发现点击窗体右上角的关闭并无反应,因为你还未在循环体内进行事件监听,然后对时间进行判断

event_list = pygame.event.get()for event in event_list:#判断是否为退出事件if event.type == pygame.QUIT:print("退出游戏...")#卸载所有模块pygame.quit()exit()

关于敌机的生成我们需要使用到sprite精灵和精灵组模块,创建两个一样的敌机,但是敌机的飞行速度不一样,然后将敌机精灵添加至敌机精灵组中,然后在循环体中我们不断将敌机精灵组进行绘制即可

enemy = GameSprite("./image/enemy0.png")enemy1 = GameSprite("./image/enemy0.png",2)enemy_group = pygame.sprite.Group(enemy,enemy1)#精灵组调用方法enemy_group.update()enemy_group.draw(screen)

对上述部分代码进行整理简化,最后我们可以得到这样的效果图,主机和敌机都可以移动

import pygamefrom plane_sprites import *#游戏初始化pygame.init()#创建游戏主窗口screen = pygame.display.set_mode((480,700))#绘制背景图香#1 加载图像数据background = pygame.image.load('./image/background.png')#2 blit绘制图像#从左上角绘制screen.blit(background,(0,0))#3 update更新屏幕显示# pygame.display.update()#绘制飞机图片hero = pygame.image.load('./image/hero2.png')screen.blit(hero,(150,300))#可以在所有绘制工作完成后,统一调用update方法pygame.display.update()#创造时钟对象  屏幕绘制速率clock = pygame.time.Clock()#定义飞机初始位置hero_rect = pygame.Rect(150,300,100,122)#敌机精灵创建enemy = GameSprite("./image/enemy0.png")enemy1 = GameSprite("./image/enemy0.png",2)enemy_group = pygame.sprite.Group(enemy,enemy1)#游戏循环while True:#指定循环体内部代码的执行频率   每秒重复60次clock.tick(60)#监听时间event_list = pygame.event.get()# if len(event_list)>0:# print(event_list)for event in event_list:#判断是否为退出事件if event.type == pygame.QUIT:print("退出游戏...")#卸载所有模块pygame.quit()exit()hero_rect.y -= 1if hero_rect.y <=0:hero_rect.y = 700#将移动前飞机进行遮挡 达到动画效果screen.blit(background, (0, 0))screen.blit(hero,hero_rect)#精灵组调用方法enemy_group.update()enemy_group.draw(screen)pygame.display.update()passpygame.quit()

Pygame库200行代码实现简易飞机大战的示例分析

程序升级

设置飞机大战的精灵类和常量

这里的update方法主要是在为了后面背景类、敌机类和子弹类中达到可以垂直飞行的效果

#屏幕大小SCREEN_RECT = pygame.Rect(0,0,480,700)#刷新帧率SCREEN_PER_SEC = 60#创建敌机的定时器常量CREATE_ENEMY_EVENT = pygame.USEREVENT#英雄发射子弹事件HERO_FIRE_EVENT = pygame.USEREVENT + 1class GameSprite(pygame.sprite.Sprite):def __init__(self,image_name,speed=1):#调用父类初始化方法super().__init__()#定义对象属性self.image = pygame.image.load(image_name)self.rect = self.image.get_rect()self.speed = speed#更新显示def update(self):self.rect.y += self.speed

背景类和敌机类

因为想要背景会随着移动,所以在背景类中的init设置了is_alt参数,用来添加背景到原图像的上方,这样就可以达到背景滚动的效果。
在敌机类中对敌机的位置进行判断,如果敌机超过我们预设屏幕y的方位就会使用kill()方法从精灵组中删除,敌机生成的位置和速度采用了random随机数的randint()方法

class Background(GameSprite):#游戏背景滚动def __init__(self,is_alt=False):#调用父类中精灵中的创建 image/rect/speedsuper().__init__("./image/background.png")if is_alt:self.rect.y = -self.rect.heightdef update(self):super().update()#如果移出屏幕,将图像移到屏幕上访if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.heightclass Enemy(GameSprite):#敌机精灵def __init__(self):#1 调用父类方法  创建敌机精灵super().__init__("./image/enemy0.png")#2 指定敌机初始随机速度self.speed = random.randint(1,2)#3 指定敌机初始随机位置self.rect.bottom = 0max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0,max_x)def update(self):#!调用父类方法  垂直方向飞行super().update()#2 判断是否飞出屏幕 如果是,需要从精灵组中删除if self.rect.y >= SCREEN_RECT.height:print("飞出屏幕,需要从精灵组中删除...")#kill方法可以将精灵从精灵族中移出,精灵自动销毁self.kill()def __del__(self):print("敌机死亡 %s" % self.rect)

主机类和子弹类

SCREEN_RECT.centerx是用来保证一开始主机初始在屏幕中央部分,关于主机的y因为在一开始画了一张绘制示意图所以这里应该为屏幕的SCREEN_RECT.bottom减去部分距离。

子弹类中和敌机类同理需要判断是否飞出屏幕范围,如果超过使用kill()方法从精灵组中删除,子弹的初始位置应该是主机的上方,既子弹的x等于主机的x

Pygame库200行代码实现简易飞机大战的示例分析

#主角飞机class Hero(GameSprite):def __init__(self):# 调用父类 设置英雄图像和速度super().__init__("./image/hero2.png",0)# 设置主机位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 50# 子弹精灵组self.bullet_group = pygame.sprite.Group()def update(self):#水平方向移动self.rect.x += self.speed#控制英雄不能为0if self.rect.x < 0:self.rect.x =0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.right#子弹发射def fire(self):print("发射子弹...")#创建子弹精灵bullet = Bullet()#设置子弹位置bullet.rect.bottom = self.rect.y-20bullet.rect.centerx = self.rect.centerx#添加到子弹精灵组中self.bullet_group.add(bullet)#子弹类class Bullet(GameSprite):def __init__(self):#调用父类方法 设置子弹图片速度super().__init__("./image/bullet1.png",-2)def update(self):#调用父类方法 让子弹垂直飞行super().update()#判断子弹是否飞出if self.rect.bottom < 0:self.kill()def __del__(self):print("子弹被销毁")

主游戏类

在主类中进行精灵组的创建,背景精灵组的创建是为了达到背景滚动的效果

#精灵组的创建def __create_sprites(self):#创建背景精灵和精灵1组bg1 = Background()bg2 = Background(True)self.back_group = pygame.sprite.Group(bg1,bg2)#创建敌机精灵和精灵组self.enemy_group = pygame.sprite.Group(#创建英雄精灵和精灵组self.hero = Hero()self.hero_group = pygame.sprite.Group(self.hero)

游戏的初始化

def __init__(self):print("游戏初始化")#创建游戏窗口self.screen = pygame.display.set_mode(SCREEN_RECT.size)#创建游戏时钟self.clock = pygame.time.Clock()self.__create_sprites()#敌机生成和主机开火的定时器pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)#单位是mspygame.time.set_timer(HERO_FIRE_EVENT,500)

事件监听方法

关于事件的监听过程中,需要对敌机生成和子弹飞行、主机移动指令做出对应反应

def __event_handler(self):for event in pygame.event.get():if event.type == pygame.QUIT:PlaneGame.__game_over()elif event.type == CREATE_ENEMY_EVENT:print("敌机生成...")#创建敌机精灵enemy = Enemy()#敌机精灵加入精灵组self.enemy_group.add(enemy)elif event.type == HERO_FIRE_EVENT:print("发射子弹...")self.hero.fire()#飞机移动keyss_pressed = pygame.key.get_pressed()if keyss_pressed[pygame.K_RIGHT]:print("向右移动")self.hero.speed = 2elif keyss_pressed[pygame.K_LEFT]:print("向左移动")self.hero.speed = -2else:self.hero.speed = 0

碰撞检测

对于子弹碰撞敌机和敌机碰撞主机的情况进行判定

#碰撞检测def __check_collide(self):#子弹摧毁敌机pygame.sprite.groupcollide(self.hero.bullet_group,self.enemy_group,True,True)#敌机撞毁英雄enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)if len(enemies) > 0:self.hero.kill()PlaneGame.__game_over()

精灵组更新显示

#精灵更新显示def __update_sprites(self):#背景精灵组self.back_group.update()self.back_group.draw(self.screen)#敌机精灵组self.enemy_group.update()self.enemy_group.draw(self.screen)#主机精灵组self.hero_group.update()self.hero_group.draw(self.screen)#子弹精灵组self.hero.bullet_group.update()self.hero.bullet_group.draw(self.screen)

游戏的开始与结束

def start_game(self):print("游戏开始...")while True:#1 设置刷新帧率self.clock.tick(SCREEN_PER_SEC)#2 时间监听self.__event_handler()#3 碰撞检测self.__check_collide()#4 更新敌机self.__update_sprites()#5 更新显示pygame.display.update()@staticmethoddef __game_over():print("游戏结束")pygame.quit()exit()

关于Pygame库200行代码实现简易飞机大战的示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Pygame库200行代码实现简易飞机大战的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Pygame库200行代码实现简易飞机大战的示例分析

这篇文章将为大家详细讲解有关Pygame库200行代码实现简易飞机大战的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。写在开头,因为这个小游戏的实验主要是帮助我熟悉pygame库的使
2023-06-22

JS实现飞机大战小游戏的示例代码

小编给大家分享一下JS实现飞机大战小游戏的示例代码,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!先制作好要做好的几步以及背景样式var canvas = document.getElementById("canvas");
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录