如何实现游戏中的在线计时器和离线计时器

简介: 本文包含了游戏中两种计时器的实现原理和实现方法,皆在帮助你彻底的搞懂游戏开发中的计时器。

本文包含了游戏中两种计时器的实现原理和实现方法,皆在帮助你彻底的搞懂游戏开发中的计时器。

如果你没有任何的游戏开发经验,欢迎观看我的“人人都能做游戏”系列视频教程,它会手把手的教你做出自己的第一个小游戏。


在游戏中经常会有需要倒计时的需求,例如倒计时 10 分钟可以获得 1 点体力,倒计时 1 小时后可以开启一个宝箱,或者是根据游戏的计时获得奖励等等。


今天就分享一下如何使用微信小游戏制作工具来实现在线计时器和离线计时器的功能。


在线计时器


首先布置一下场景。


640.png


如图的场景中,只有一个背景,以及一个基础的文字,我们将会使用基础的文字来显示倒计时。


实现倒计时功能的一个关键点就是进行时间的换算,如何将一定的“秒数”,转换成多少分,多少秒,然后最终使用“分:秒”的形式进行显示。


我们使用“除法”运算来计算当前的分钟数,然后使用“取余”运算来计算当前的秒数。

假设当前剩余的时间为 158 秒。

分钟数 = 向下取整(158 / 60)= 向下取整(2.6333) = 2

秒数 = 158 % 60 = 38


最终就可以将分钟数和秒数拼接起来,就是“2:38”,通常分钟和秒数都会使用两位数来显示,所以需要为分钟数前方添加一个 0 ,即最终的显示时间为 "02:38" 。

下面,我们就来看一下具体的实现。


首先创建几个全局变量。


640.png


“剩余时间”记录的是倒计时的总时间(以秒计),“分钟”和“秒数”记录的是根据剩余时间计算得到的分钟数和秒数,“倒计时数字”记录的最终要显示的倒计时。


接着,为“基础文字”添加倒计时的积木逻辑。


640.png


积木逻辑并不复杂,设置了倒计时的总时间 158 秒,计算出对应的分钟数和秒数,使用拼接积木将分钟数和秒数拼接起来,最终显示在文本上。


运行一下场景。


640.png


可以看到,我们将 158 秒换算成了 “02:38” 的形式正确的显示了。


让时间动起来


接下来,我们就让倒计时动起来吧!


接着在上方的积木下增加如下的积木块,让计时器跑起来。


640.png


我们使用了一个“重复执行”积木来处理跑动的倒计时,然后使用了一个“等待 1 秒”积木块实现了每间隔 1 秒去进行一次处理。至于时间的换算和显示则跟上方一样,如果还有剩余时间,则每隔 1 秒,处理显示一次。如果没有剩余时间了,则倒计时结束,退出循环。


运行一下,看看最终的效果。


640.gif


计时器正常跑起来了。


使用函数来复用积木块


在计时器的积木块逻辑中,关于时间换算、拼接、显示部分的积木块,其实是使用了两次,对于这种情况,我们可以把这些会重复使用的积木块放到一个“函数”中。


我们创建一个“时间换算”的函数,然后把这部分可以复用的积木块放到函数中。


640.png


最终的倒计时的所有积木就变成了这样,看起来简洁了许多。


640.png

实现离线的计时器


通常我们在游戏中不光需要在线计时器,也需要离线的计时器。那么什么是离线的计时器呢?就是当玩家在退出游戏之后,计时器仍然能够计时。


举个例子,在“精致1010”有一个“种朵小花”的功能,玩家每隔 30 分钟就能够给植物浇一次水,通过浇水植物能够生长,并且生成金币。如果玩家在浇过一次水后,退出了游戏,然后等了 30 分钟后,再次回到游戏,此时计时应该是结束的,玩家可以再次为小花浇水。也就是说,虽然玩家退出了游戏,但是计时器并没有停止,仍然在计时,这就是离线计时功能了。


640.jpg


想实现这样的一个离线计时器的功能,我们需要借助 2 个东西。


第 1 个东西是“本地缓存”功能,它可以帮助我们把游戏中的数据缓存在本地,这样等玩家下次再打开游戏时,就可以通过“本地缓存”得到之前存储的数据。(有关于本地缓存的具体使用方法,可以参见这篇文章)


第 2 个东西叫做“时间戳”,它指的是从某一时间开始经过的秒数。通常所说的时间戳指的都是“UNIX时间”。

维基百科对于UNIX时间的定义:

UNIX时间,或称POSIX时间UNIX类UNIX系统使用的时间表示方式:从UTC1970年1月1日0时0分0秒起至现在的总秒数,不考虑闰秒。


通俗点儿来讲这个“时间戳”指的就是从某一时间开始到此刻为止,一共经历了多少时间。我们怎样通过它来计算离线时间呢?比方说,我在 8 点钟退出了游戏,那么就可以在退出游戏前,把此时的“时间戳”做个记录,使用缓存功能把这个时间记录下来。然后,我 9 点钟的时候,又重新进入了游戏。这时就可以将当前的“时间戳”减去之前缓存的“时间戳”,就可以计算出离线的时间了。


这就是计算离线时间的原理了。其实并不是指游戏退出后,偷偷的在背后运行进行计时,而是通过“本地缓存”和“时间戳”这两样东西,通过计算来得到离线的那段时间。


下面,我们就来实现一下离线计时的功能。


首先,开启本地缓存的插件。


640.png


开启之后,就可以使用与本地缓存有关的积木块了。


接着,找到获取“时间戳”的积木块,它位于“计算”类别中的“当前时间的XX”积木块中,点击下拉,可选中获得“时间戳”。


640.png


最后,看一下实现的积木逻辑。


640.png


我们梳理一下整个逻辑,每次进入游戏时,首先去计算一下离线时间,通过“当前的时间戳”减去“之前缓存的时间戳”,然后通过换算,得到离线时间的总秒数,然后将“剩余时间”减去“离线时间”得到最新的“剩余时间”。如果“剩余时间”大于 0 的话,就开始倒计时,否则的话就表明倒计时结束。


这里需要注意的一点儿就是倒计时中新增的两块缓存积木,每当“剩余时间”发生变化时,我们都将最新的“剩余时间”和“时间戳”进行缓存。这样,不论何时玩家退出游戏,或者是进入到游戏的其他场景,缓存中的“剩余时间”和“时间戳”记录的都是最后的那一刻。


最后,我做了一个计时器的示例项目,里面包含了在线计时器和离线计时器功能的实现,已经开源到了社区,大家可以自行获取项目进行改编或学习。

640.png

计时器示例项目地址:

https://gamemaker.weixin.qq.com/#/game?game_id=lbM2VmZjhmYmUtZGY5ZS00ZjU1LWIwYjUtOGMyYzZhNDE2Mzc4


今天分享的内容就到这里了,希望这篇文章能够帮助你彻底的搞懂在游戏中实现一个计时器的原理以及方法。


相关文章
|
机器学习/深度学习 算法 数据挖掘
马尔科夫链(Markov Chain, MC)算法详解及Python实现
马尔科夫链(Markov Chain, MC)算法详解及Python实现
11484 115
马尔科夫链(Markov Chain, MC)算法详解及Python实现
|
存储
wsl的存储路径
wsl的存储路径
1003 0
|
XML 前端开发 JavaScript
前端大神揭秘:如何让你的网页秒变炫酷,让用户欲罢不能的5大绝招!
前端开发不仅是技术活,更是艺术创作。本文揭秘五大前端开发技巧,包括合理运用CSS动画、SVG图形、现代JavaScript框架、优化网页性能及注重细节设计,助你打造炫酷网页,提升用户体验。
400 30
|
SQL 关系型数据库 数据库
SqlAlchemy 2.0 中文文档(四十)(2)
SqlAlchemy 2.0 中文文档(四十)
243 1
|
定位技术 图形学 开发者
【Unity实战】切换场景加载进度和如何在后台异步加载具有庞大世界的游戏场景,实现无缝衔接(附项目源码)
【Unity实战】切换场景加载进度和如何在后台异步加载具有庞大世界的游戏场景,实现无缝衔接(附项目源码)
1858 1
|
存储 缓存 编解码
计算机硬件学习教程
【7月更文挑战第26天】
661 2
|
开发工具 git
git error 已解决【Another git process seems to be running in this repository, e.g. an editor opened by】
git error 已解决【Another git process seems to be running in this repository, e.g. an editor opened by】
345 2
|
算法 程序员 数据处理
SSE - 多媒体编程中的利器 - SSE指令集简介和C代码示例
本文介绍了SSE(Stream SIMD Extensions)指令集在多媒体处理中的应用,它能提升浮点运算性能,尤其适合处理大量数据。SSE允许一次处理4个32位浮点数,提高效率。文中通过示例展示了如何在C++中集成SSE,比如使用`__m128`数据类型和`_mm_set_ps1()`等函数优化浮点数放大算法。测试结果显示,使用SSE优化后的算法比未优化版本快约3倍,强调了SSE在高效处理多媒体数据中的价值。
|
Linux API 数据库
Python 金融交易实用指南(三)(4)
Python 金融交易实用指南(三)
218 1
|
Python
Python自动化办公实战案例:文件整理与邮件发送
Python自动化办公实战案例:文件整理与邮件发送
325 0