模拟“嫦娥五号”探月小游戏【附源码】

简介: 在实际的探月过程中,这些操作都是由程序精确测量和控制的。而在这个游戏里,则需要玩家手动完成 降落 和 上升对接 这两个操作。

零基础python入门教程:python666.cn


大家好,欢迎来到 Crossin的编程教室 !


神舟十四号载人飞船成功发射并与天和核心舱顺利对接,三名航天员现已进入核心舱。在此表示热烈祝贺!🎉🎉🎉


这里再分享一下之前写的一个小游戏。

1. 嫦娥五号


2020年12月17日的1点59分,嫦娥五号返回器携带月球表面的土壤样品安全返回着陆,这也标志着探月工程嫦娥五号任务顺利完成。这是我国航天史上的首次。我国也因此成为了地球上第三个从月球上成功采样的国家。


为了庆祝这一重大时刻呢,我做了一个模拟探月的小游戏。


2. 一个小游戏


这个小游戏模拟了嫦娥五号探测器在月球表面降落、采样、上升、对接这一系列过程。


在实际的探月过程中,这些操作都是由程序精确测量和控制的。而在这个游戏里,则需要玩家手动完成 降落 上升对接 这两个操作。



640.gif



点击屏幕中间的区域,可以控制发动机点火,从而在降落时制动减速,以及之后让上升舱起飞。点击屏幕两边的区域则可以调整探测器的姿态,从而实现左右位置的调整。这在最后与轨道舱对接时非常关键。


如果降落时和对接时速度过快,那我们的任务就失败了。所以,你需要通过你灵巧的手指,让探测器在保持一个平稳的状态。


看着是不是还挺简单的?不过已经试玩过的朋友里,我知道的还没有一个人可以第一次就对接成功的。


同样,当我们在新闻里看到嫦娥五号很轻松很顺利发射、入轨、降落、采样、上升、对接、返回,其背后是几代航天人艰苦卓绝的努力,难度之大远超一般人的想象。这里再次向他们致敬。


3. 开发环境


这个小游戏是用 cocos creator 进行的开发,使用的语言是 JavaScript。



我的一位小伙伴提供了游戏的画面素材。


640.png


获取游戏的源码,请在公众号“Crossin的编程教室”里回复:嫦娥


4. 开发思路


这里我从技术层面简单介绍一下这个游戏的核心开发思路,也是用 cocos 开发游戏的基本套路。


首先,是3个重要的概念:层、动作、状态机


可以这么说,弄清楚这三个概念,90% 以上的小游戏你都可以搞定了。


4.1 层


虽然现在的 Cocos Creator 已不需你去手动创建层(CCLayer),但层级的概念始终是存在的。各种节点通过层级添加,构成了游戏的场景。



直观的理解,就好比现实中这样一个玩具的效果:



表示大陆的节点添加在整个背景板上,其他节点又加在大陆节点上。


层级结构既决定了游戏元素的显示先后,也决定了它们所处的坐标位置。


在这个游戏中,层级比较简单。唯一复杂的点在于:上升器原本被添加在着陆器之上,这样它可以随着着陆器位移和旋转;而在上升阶段,我又将它从原本父节点上移除,添加到了背景上,这样方便后续的坐标计算。



4.2 动作


动作系统是 cocos 的一大特色,不过本文不详细展开讲了。游戏中,主要的控制部分并没有借助动作系统,也没有使用物理引擎,而是直接通过数学计算位移实现。动作系统主要用在月壤采集阶段的动画效果上。钻探、采集是用了缩放动作 cc.ScaleTo;升旗是用了旋转动作 cc.rotateTo;然后再配合上延迟动作 cc.delayTime 和函数回调 cc.callFunc。


参考代码:


flag1 () {
    this.flag.opacity = 255;
    var a1 = cc.rotateTo(1, 360);
    var a2 = cc.callFunc(this.flag2, this);
    this.flag.runAction(cc.sequence(a1, a2));
},


4.3 状态机


游戏的本质就是一个主循环加上各种状态的切换。在循环中,游戏要处理游戏逻辑、用户输入、画面渲染、数据更新、电脑角色AI等事务(本游戏主要是前三个,核心逻辑都在 update 函数里)。为什么配置低的电脑玩游戏会“卡”,原因就是每一次循环需要的时间更长,以至于无法让游戏的“帧数”达到人无法感知的程度。


只有主循环,游戏仍然是“死”的。只有加上各种“状态”,游戏才能推进、胜利或者失败。(可留意代码中 phase 变量的作用)


状态机示意图(非本游戏):



4.4 数学


有人常问,数学对于学编程到底重不重要?我觉得吧,不要担心,大多数情况你在开发中是用不到数学的。但如果你是一个游戏程序员,那至少你得对初中程度的数学和物理滚瓜烂熟。


前面有提到,这个游戏的核心控制是用数学来计算的。其实可以理解为,用代码实现了一套牛顿三大定律的世界:


  1. 飞行器始终受到一个向下的重力G
  2. 当“点火”时,飞行器会收到一个向顶部方向(未必是向上)的推力F
  3. 根据飞行器当前的姿态角度,计算出这个推力F分别在x轴和y轴上的分量(要用到三角函数)
  4. 因为力和加速度成正比,所以最终计算出的轴向作用力就可以当做加速度来使用。这个加速度会在每一帧去改变飞行器在x轴和y轴上的速度,同时速度又会在每一帧去改变飞行器在x轴和y轴上的位移


参考代码:


var change = this.node;
this.speed_y += this.ctrl.G;
var f_x = Math.sin(-Math.PI / 180 * change.angle);
var f_y = Math.cos(Math.PI / 180 * change.angle);
this.speed_x *= 1.001;
this.speed_x += f_x * this.ctrl.F;
this.speed_y += f_y * this.ctrl.F;
change.x += this.speed_x * dt * 60;
change.y += this.speed_y * dt * 60;
change.angle += this.ctrl.R;


你可能猜不到,这个简单的小游戏里,最复杂的一段代码是哪里:



是的,就是这个落地后调整姿态的小动作。如果你看到代码里这一通复杂的计算操作一脸懵逼,就跳过它吧。


4.5 引擎


如果你的目标是写出好玩的游戏,那么选一个合适的引擎很重要。对我个人来说,这次的喷火效果是一个小彩蛋,用了 Cocos Creator 里的粒子系统。这是我第一次用它,花了十来分钟就搞定了,效果还不错。可以对比下我之前做的火箭回收小游戏,算是相当真实了!



假如你要阅读源码,或在基础上做进一步修改,可以重点对照以上几点进行阅读。


如果你对游戏编程感兴趣,或者还想看点其他类型游戏的话,可以在文章下留言,我会参考大家的意见。如果你喜欢我的内容,欢迎点赞和转发。

感谢转发点赞的各位~

相关文章
|
Web App开发 开发者
利用chrome控制台调试post请求
利用chrome控制台调试post请求
555 0
|
11月前
|
机器学习/深度学习 算法 数据处理
基于最小二乘法的太阳黑子活动模型参数辨识和预测matlab仿真
本项目基于最小二乘法,利用Matlab对太阳黑子活动进行模型参数辨识和预测。通过分析过去288年的观测数据,研究其11年周期规律,实现对太阳黑子活动周期性的准确建模与未来趋势预测。适用于MATLAB2022a版本。
|
机器学习/深度学习 自然语言处理 数据处理
通过深度学习识别情绪
通过深度学习识别情绪(Emotion Recognition using Deep Learning)是一项结合多模态数据的技术,旨在通过分析人类的面部表情、语音语调、文本内容等特征来自动识别情绪状态。情绪识别在人机交互、健康监测、教育、娱乐等领域具有广泛的应用。
1364 8
|
运维 监控 Devops
DevOps 文化建设:促进跨职能团队合作
【8月更文第30天】在当今快速变化的商业环境中,组织需要更快地交付高质量的产品和服务来满足客户需求。DevOps作为一种文化和实践,旨在通过改进开发(Dev)和运维(Ops)团队之间的协作来提高软件交付的速度和质量。本文将探讨如何构建一个积极的DevOps文化,并提供具体的策略和工具来加强团队间的沟通与协作。
644 2
|
机器学习/深度学习 搜索推荐 安全
云上机器学习平台:赋能智能时代的数据洞察与决策
集成化与一体化:随着云计算、大数据、人工智能等技术的不断融合和发展,云上机器学习平台将逐渐实现与其他云服务的集成化和一体化。用户可以在同一平台上完成数据处理、模型开发、应用部署等多个环节的工作,享受更加便捷和高效的服务体验。 定制化与个性化:针对不同行业和领域的需求特点,云上机器学习平台将提供更加定制化和个性化的服务。通过提供丰富的行业解决方案和定制化开发服务,满足不同用户对于机器学习应用的个性化需求。 安全与合规性:随着数据安全和隐私保护意识的不断提高,云上机器学习平台将更加注重安全和合规性的建设。通过加强数据加密、访问控制、隐私保护等方面的措施,确保用户数据的安全性和隐私性。同时,平台还将
231 1
|
消息中间件
RabbitMQ如何设置消息过期
RabbitMQ 是一个功能强大的消息中间件,用于在分布式系统中处理和传递消息。为了提高消息传递的灵活性和效率,RabbitMQ 提供了一种消息过期的机制,可以设置消息的过期时间,这样当消息在指定时间内未被消费者消费时,会自动地从队列中删除。
422 0
|
Android开发 Kotlin
kotlin开发安卓应用 如何修改app安装后的名称
在 Android 应用中,要修改安装后的显示名称,需更新 AndroidManifest.xml 文件中 application 标签的 android:label 属性。可直接在该属性内设置新名称,或在 res/values/strings.xml 文件中修改 app_name 并在 manifest 中引用。推荐使用 strings.xml 方式,以便支持多语言和集中管理。
|
SQL 分布式计算 Hadoop
最新大数据集群安装方法CentOS7.6__大数据环境安装和配置
最新大数据集群安装方法CentOS7.6__大数据环境安装和配置
425 0
|
前端开发
前端学习笔记202304学习笔记第八天-web前端架构学习笔记-2
前端学习笔记202304学习笔记第八天-web前端架构学习笔记-2
1164 0
|
算法 大数据 5G
m基于5G毫米波场景Salen-Valenzula信道建模与matlab仿真
m基于5G毫米波场景Salen-Valenzula信道建模与matlab仿真
458 0
m基于5G毫米波场景Salen-Valenzula信道建模与matlab仿真