雷霆战机

前言

  多年前,你我在一起"打飞机"。为了实现真正的打飞机,在下一年前踏足帝都学习了无所不能的Python,辣么接下来带你在俩个小时用200行代码学会打飞机。

  python中提供了一个pygame的模块能够让我们快速编写一个游戏。接下来,简要创建一个目录结构,存放代码(规范的目录结构可以让代码保持高度的灵活性及可读性),如下: 

复制代码
"""
PlayPlane/
|-- bin/
|   |-- main.py         程序运行主体程序
|-- config/
|   |-- settings.py     程序配置(例如: 游戏背景音乐的加载等)
|-- material            程序素材放置(打飞机游戏素材放置)|-- ...
|-- src/                程序主体模块存放
|   |-- __init__.py 
|   |-- bullet.py       我方飞机发射子弹实现代码存放
|   |-- enemy.py        敌方飞机实现代码存放
|   |-- plane.py        我方飞机实现代码存放
|-- manage.py           程序启动文件
|-- README.md           
""" 
复制代码

打飞机啦

一、首先在 config/settings.py 中进行以下功能的实现

游戏素材滑动到文章底部点击链接即可下载

  • 游戏初始化
  • 游戏混音器初始化
  • 背景音乐初始化
  • 我方飞机挂了音乐
  • 敌方飞机挂了音乐
  • 子弹发射音乐
 config/settings.py

二、小试牛刀

飞机和子弹都是可移动的,那么怎么实现让它们动起来呢(我方飞机可以玩家进行操控,敌机就是随机性的出现,子弹暂由我方飞机发射)。

在Pygame中,所有移动对象都可看做是一个精灵(sprite),精灵之间能够进行相互的交互通信,例如如何让碰撞检测更加精准等等。

那么先让我们先在屏幕上制作一个游戏板,根据 settings.py 配置,并让它有声音播放,首先我们在 bin/main.py 中这么写:

  我们可以直接运行它,那么我们会看到以下画面,并且还会有激情的声音吆!!!但是我们要将文件配置为绝对路径才可以运行,因为刚刚在settings中的加载的音乐文件为相对路径。

 DEMO

接下来呢,我们将要制作我方飞机,敌方飞机和子弹如何让它们展示在游戏画板上,继而让它们变得可移动起来,请看代码实现方案...

从游戏画板上添加飞机,首先我们应怎样在屏幕上输出飞机???

上述讲过,pygame中的 sprite(精灵)可使一张图片或者一个静态物体动起来,那么制作飞机需要考虑并做些什么呢?

  1. 飞机的初始位置
  2. 通过按键 上下左右 来调控飞机的位置移动
  3. 飞机只能呆在制作的游戏画板中
  4. 飞机的速度
  5. 飞机死亡的加载
  6. 设定一个状态标识飞机的存活
  7. 让飞机具有动态的喷气式效果

那么如何实现以上的功能呢?接下来结合上述的示例代码我们先将我方飞机绘制到画板上方,并且我们通过按键 J 判定我方飞机的存活状态为死亡,绘制飞机的死亡画面并重置飞机

复制代码
"""创建飞机在pygame中, 所有可移动的对象均叫可看作一个精灵(sprite)该类并实现了碰撞方法 spritecollide我方飞机和敌方飞机指定掩膜属性以及生存状态标志位 添加 self.mask 属性(可以实现更精准的碰撞效果)
"""# 倒入精灵模块, 使飞机可以动起来
import pygameclass OurPlane(pygame.sprite.Sprite):def __init__(self, bg_size):super(OurPlane, self).__init__()# 确定我方飞机背景图(有俩张,可以让它们不停的切换,形成动态效果)self.image_one = pygame.image.load("material/image/hero1.png")self.image_two = pygame.image.load("material/image/hero2.png")# 获取我方飞机的位置self.rect = self.image_one.get_rect()# 本地化背景图片的尺寸self.width, self.height = bg_size[0], bg_size[1]# 获取飞机图像的掩膜用以更加精确的碰撞检测self.mask = pygame.mask.from_surface(self.image_one)# 定义飞机初始化位置,底部预留60像素self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, (self.height - self.rect.height - 60)# 设置飞机移动速度self.speed = 10# 设置飞机存活状态(True为存活, False为死亡)self.active = True# 加载飞机损毁图片self.destroy_images = []self.destroy_images.extend([pygame.image.load("material/image/hero_blowup_n1.png"),pygame.image.load("material/image/hero_blowup_n2.png"),pygame.image.load("material/image/hero_blowup_n3.png"),pygame.image.load("material/image/hero_blowup_n4.png")])def move_up(self):"""飞机向上移动的操作函数,其余移动函数方法类似"""if self.rect.top > 0:  # 如果飞机尚未移动出背景区域self.rect.top -= self.speedelse:  # 若即将移动出背景区域,则及时纠正为背景边缘位置self.rect.top = 0def move_down(self):"""飞机向下移动"""if self.rect.bottom < self.height - 60:self.rect.top += self.speedelse:self.rect.bottom = self.height - 60def move_left(self):"""飞机向左移动"""if self.rect.left > 0:self.rect.left -= self.speedelse:self.rect.left = 0def move_right(self):"""飞机向右移动"""if self.rect.right < self.width:self.rect.right += self.speedelse:self.rect.right = self.widthdef reset(self):# 初始化飞机(飞机挂了, 初始化到初始位置)self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, (self.height - self.rect.height - 60)# 重置飞机的存活状态self.active = True
复制代码

上面的代码写了一个 我们的飞机 (OurPlane) 类,它初始化了一些属性以及 上下左右 移动的方法和重置方法,接下来将要运用它展示到游戏画板上面

由于飞机是一直存在的,接下我们主程序 main 下面的死循环中这样写

 1.在屏幕上绘制飞机
 2.让飞机上下左右动起来
 3.按键为 j 绘制飞机的死亡状态

那么上述的功能都已经实现了,接下来就开始真正的"打飞机"

三、接下来可以制作我方飞机,敌方战机,子弹等,这些功能均在 src/ 目录下实现

  • 我方飞机根据按键上下左右进行移动,初始化位置,喷气式图片加载切换及重置效果等
 src/plane.py
  • 敌方飞机随机移动出现及重置(制作出我方飞机之后,敌机和子弹其实都是大同小异的)
 src/enemy.py
  • 子弹按照我方飞机正中上方发射及频率调控,重置
 src/bullet.py

在上面的内容中,使用面向对象的形式制作了游戏中可移动的对象并继承 pygame.sprite.Sprite 

四、继而在 bin/main.py 中进行主体功能的实现

  • 初始化背景图及大小
  • 我方飞机移动及发射子弹
  • 敌方飞机移动
  • 我方飞机和敌方飞机碰撞检测
  • 键盘按键监测效果
  • 我方飞机和敌方飞机挂了效果绘制
 bin/main.py

五、畅汗淋漓,一气呵成打飞机

组合一下,running起来

from bin.main import mainif __name__ == '__main__':"""环境: python3 + pygamerunning 起来就可以打飞机了O(∩_∩)O~."""main()

原文来自:https://www.cnblogs.com/leguan1314/p/7927595.html

github下载:https://github.com/1352282824shy/-Lightning-Fighter-Game

 

转载于:https://www.cnblogs.com/shanghongyun/p/10541727.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FancyBox - 经典的 jQuery Lightbox 插件

FancyBox 是一款非常优秀的弹窗插件&#xff0c;能够为图片、HTML 内容和其它任务的多媒体内容提供优雅的弹出缩放效果。作为是最流行的 Lightbox 插件之一&#xff0c;可以通过 fitToView 实现自适应功能。主要特色&#xff1a; ✓ 能够显示图片、HTML 元素、SWF 影片、ifra…

php如何表格中的变为超链接,php中将网址转换为超链接的函数

php中将网址转换为超链接的函数复制代码 代码如下:function showtext($text){$search array(|(http://[^ ])|, |(https://[^ ])|, |(www.[^ ])|);$replace array($1, $1, $1);$text preg_replace($search, $replace, $text);return $text;}时间&#xff1a; 2011-08-311.根据…

Java面试参考指南–第1部分

JAVA面向对象的概念 Java基于面向对象的概念&#xff0c;它允许更高级别的抽象以实际方式解决任何问题。 面向对象的方法将实际对象中的问题解决方案概念化&#xff0c;从而更易于在整个应用程序中重用。 例如椅子&#xff0c;风扇&#xff0c;狗&#xff0c;电脑等。 在Java…

Odyssey.js – 使用现成模板在线创建互动的故事

Odyssey.js 是一个开源工具&#xff0c;它可以让你的地图&#xff0c;叙述和其他多媒体结合成一个美丽的故事。创建新的故事很简单&#xff0c;要求无非是一个现代的 Web 浏览器和一个好的想法。你可以使用现成的模板来控制和设计精美的布局&#xff0c;让你的故事的整体外观和…

100层楼扔两个鸡蛋的问题

转载自&#xff1a;http://blog.sina.com.cn/s/blog_6c813dbd0101bh98.html 两个软硬程度一样但未知的鸡蛋&#xff0c;它们有可能都在一楼就摔碎&#xff0c;也可能从一百层楼摔下来没事。 有座100层的建筑&#xff0c;要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置…

酷毙了!三种风格的全屏幻灯片效果【附源码下载】

今天&#xff0c;我们想向您展示如何创建平铺背景图像的幻灯片效果。其灵感来自于国外的一个工作室网站&#xff08;围观&#xff09;&#xff0c;这个网站充满了各种有趣和创意效果&#xff0c;一定记得去看看。 这个幻灯片效果是由四个区域的独立移动构成&#xff0c;通过画面…

西游之路——python全栈——CRM项目之表结构设计

一、表结构设计 1 from django.db import models2 from django.contrib.auth.models import User3 4 """自带验证"""5 class UserProFile(models.Model):6 """用户信息表"""7 user models.OneToOneField…

你见过吗?9款超炫的复选框(Checkbox)效果

复选框&#xff08;Checkbox&#xff09;在各个浏览器中的效果不一致&#xff0c;因此很多 Web 开发人员会自己重新设计一套界面和使用体验都更佳的复选框功能。下面就给大家分享9款超炫的复选框&#xff08;Checkbox&#xff09;效果&#xff0c;纯 CSS3 实现&#xff0c;未使…

实用技巧:使用 Google Analytics 跟踪 JS 错误

Google Analytics&#xff08;谷歌分析&#xff09;不仅仅是一个流量统计工具&#xff0c;你还可以用它来测量广告活动的有效性&#xff0c;跟踪用户多远到所需的页面流&#xff08;从点击广告到购物车到结账页面&#xff09;获取&#xff0c;并基于用户的信息设置浏览器和语言…

从Ubuntu 14.04 LTS版升级到Ubuntu 16.04 LTS

Ubuntu 16.04 (Xerial Xerus) Long Term Support版于最近发布了。要想了解它的新功能和新特性&#xff0c;就必须升级或安装这个新系统。 本文讲述怎样一步步从Ubuntu 14.04 LTS版升级到Ubuntu 16.04 LTS版。要注意在升级前做好重要数据的备份&#xff0c;以免造成数据损失。因…

HTML5 Dashboard – 那些让你激动的 Web 技术

HTML5 Dashboard 是一个 Mozilla 推出的项目&#xff0c;里面展示了最前沿的 HTML5&#xff0c;CSS3&#xff0c;JavaScript 技术。每一项技术都有简洁&#xff0c;在线演示以及详细的文档链接。这些技术将成为未来一段时间 Web 开发的顶尖技术&#xff0c;如果不想落伍的话就赶…

通过自动回复机器人学Mybatis---基础版

第1章 案例简介 介绍要实现的案例情况&#xff0c;后面会通过这个案例来学习 Mybatis第2章 实战第一部----黎明前的黑暗 在没有 Mybatis 的情况下&#xff0c;使用 Jsp Servlet Jdbc 实现案例中的一个模块开发流程1&#xff1a; 开发流程2&#xff1a; 开发流程3&#xff1a;…

Scroll Depth – 衡量页面滚动的 Google 分析插件

Scroll Depth 是一个小型的 Google Analytics&#xff08;谷歌分析&#xff09;插件&#xff0c;可以让你衡量用户在页面上滚动了多远。它可以监控 25%、50%、75% 和 100% 四个滚动点&#xff0c;并发送谷歌分析事件。 您还可以跟踪页面上的特定元素是否滚动到视图中。例如在博…

aws ec2时间_AWS中自动化的三大领域,以避免支付过多的云账单

AWS是全球最常用的云服务之一。 Gartner Magic Quadrant将AWS评为最大的IaaS提供商。每个可能的域都由企业使用AWS服务。 全球约有 1,000,000家公司正在使用AWS作为其IaaS提供商。从Netflix到Unilever再到Met Office&#xff0c;每个人都转移到AWS上的云基础架构。既然您正在阅…

Croppic – 免费开源的 jQuery 图片裁剪插件

Croppic 这款开源的 jQuery 图片裁剪插件能够满足网站开发人员各种不同的使用需要。只需要简单的上传图片&#xff0c;就可以实现你想要的图像缩放和裁剪功能。因为使用了 HTML5 FormData 对象&#xff0c;所以目前只支持 IE 10 、Chrome 和 Firefox 等现代浏览器。 您可能感兴…

应用面向方面的编程

1.引言 面向方面的编程的主要目标是将跨领域的关注点分离。 当我们谈论跨领域的关注时&#xff0c;我们指的是在我们的系统或应用程序中的多个地方使用的通用功能。 这些概念包括&#xff1a; 记录中 交易管理 错误处理 监控方式 安全 实现这种分离的方法是将这些概念模块…

ScrollReveal.js – 帮助你实现超炫的元素运动效果

ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果&#xff0c;帮助你的网站增加吸引力。只需要给元素增加 data-scrollreveal 属性&#xff0c;当元素进入可视区域的时候会自动被触发设置好的动画。 您可能感兴趣的相关文章2013年最受欢迎的10篇前端开发博文小伙伴…

JDBC布尔兼容性列表

有趣的是&#xff0c;布尔类型只是在SQL标准后期才引入&#xff0c;即SQL&#xff1a;1999 。 即使在今天&#xff0c;并非所有数据库本身都支持BOOLEAN或BIT类型。 最重要的是&#xff0c;我们仍然可以在Oracle中等待一段时间。 这是2002年以来关于该主题的“问汤姆”的观点&a…

GDI+与WPF中的颜色简析

GDI与WPF中的颜色简析 原文:GDI与WPF中的颜色简析--------------------------------------------------------------------------------引用或转载时请保留以下信息&#xff1a;大可山 [MSN:a3news(AT)hotmail.com] http://www.zpxp.com http://www.brawdraw.com萝卜鼠在线图形…

Panorama Viewer – jQuery 360度全景展示插件

jQuery Panorama Viewer 这款插件可以帮助你在网站中嵌入全景图片。要做到这一点&#xff0c;首先只需要在页面中引入最新的 jQuery 库&#xff0c;以及 jquery.panorama_viewer.js 和 panorama_viewer.css 到页面中&#xff0c;然后给图片添加 CSS 类“panorama”。现代浏览器…