设为首页
收藏本站
切换到窄版
登录
立即注册
找回密码
搜索
搜索
本版
帖子
用户
快捷导航
论坛
BBS
C语言
C++
NET
JAVA
PHP
易语言
数据库
IE盒子
»
论坛
›
IE盒子
›
C语言
›
C语言GUI编程之数字记忆游戏——计时器、暂停和重置游戏 ...
返回列表
发帖
查看:
86
|
回复:
1
C语言GUI编程之数字记忆游戏——计时器、暂停和重置游戏 ...
[复制链接]
暮雪苍穹
暮雪苍穹
当前离线
积分
14
4
主题
6
帖子
14
积分
新手上路
新手上路, 积分 14, 距离下一级还需 36 积分
新手上路, 积分 14, 距离下一级还需 36 积分
积分
14
发消息
发表于 2022-12-21 20:17:08
|
显示全部楼层
|
阅读模式
上一期已经把游戏的核心玩法的程序实现思路做了整理和讲解,接下来就给游戏玩家做一些可以看得见、摸得着的功能。
计时器
UI展示
计时器默认是00:00:00,玩家开启游戏后开始计时。
计时器UI
算法描述
开始游戏时的系统时间记为start_time,程序当前运行的时间记为current_time,用current_time减去start_time即为玩游戏花费的时间,把这个时间格式化成时、分、秒展示在图层上即可。
虽然算法逻辑上比较简单,但是在开发过程中还是遇到了几个问题,下面就展开来说说。
在哪儿调用
我们一直使用while(true)循环监听鼠标、键盘事件,所以更新计时器的函数调用也在放在这个while循环体内,和监听事件一前一后调用。
以秒为单位计时
遇到第一个问题,如何以秒为单位计时?也就是要达到隔一秒计时器更新一次。
由于是在while循环体内调用计时器的更新函数,为了避免同一秒内更新太频繁次导致UI更新太快出现画面闪烁的现象,在调用UI更新之前先做一个判断:当时间间隔大于等于1秒的时候再去更新。
定义第三个变量记为last_counting_time,表示上一次计时器更新的时间,初始值为计时器开启的时间,也就是上面说的start_time,当current_time减去last_counting_time大于等于1时去更新计时器UI,并把current_time赋值给last_counting_time。
消息获取方式
遇到的第二个问题,EasyX库获取消息的函数getmessage()会阻塞程序。官方的说法是用getmessage()获取消息时,如果当前消息队列中没有,就一直等待。
也就是说用getmessage()获取消息(鼠标、键盘、字符、窗口),当开启游戏后不进行任何操作,等于是暂停了计时器UI的更新,但是时间还是在继续走着的,所以会出现计时器“卡住”的现象。
解决的方法就是使用另一个获取消息的函数peekmessage(),获取到消息返回true,否则返回false。
程序逻辑、动画造成阻塞
由于在游戏关卡的加载上做了动画,而且游戏关卡留给玩家有一定的观察时间,在这个期间内程序是Sleep()的状态,这两种情况都会造成计时器“卡住”的现象,如下图所示计时器从第2秒跳到了第10秒。
计时器卡住现象
取代Sleep()
在timer.cpp模块里定义一个函数用来取代Sleep()函数,这个函数能和Sleep()一样消耗时间,但是它不像Sleep()那样什么都不做,而是刚好在这个期间内去更新计时器,这样做简直就是一箭双雕——既能取代Sleep(),又能更新计时器。
动画中调用更新计时器函数
动画阻塞计时器的问题相对来说就更加简单和直接了。在生成动画的时候使用的是一组循环的绘制操作,只需要在循环体内调用计时器更新函数就OK了。
在做了这两项优化之后计时器就能正常的工作而不会出现“卡住”的状态了。
计时器正常更新
暂停和重置
游戏暂停
通过EasyX自带的事件处理机制,来判断玩家是否点击了暂停按钮。游戏暂停时,做下面几件事:
游戏状态改变
计时器暂停计时
“暂停游戏”按钮文字改变为“继续游戏”
计时器暂停,不代表计时器的线程停止了,实际上线程还在运行着。通过给计时器一个状态码来控制计时器的更新,并且记下暂停的时间节点,等游戏继续后再记录下时间节点,两者相减就是暂停的总时间pause_time,让计时器更新的时候减去这个pause_time即可达到预期的效果。
注意一点,游戏可能暂停很多次,所以暂停的时间是累加的,在玩家继续游戏后,计算暂停总时间用 pause_time += new_pause_time,而不是pause_time = new_pause_time。
暂停和重新开始功能按钮
游戏重置
这里的游戏重置指的是从第一关开始,并不是当前关卡的重置。游戏重置时,做下面几件事:
游戏参数重置(游戏状态、关卡、游戏数据等)
计时器重置
UI重载
重置相对暂停来说简单许多,直接“归零”。
下一期的功能扩展
关卡内的提示功能(提示总次数有限制)
游戏音效:点击正确、错误音效、过关音效、音效的开关
游戏排行榜(在之前的项目计划之中)
弹窗提示,比如点击重置的时候向玩家确认是否真的重置
OK,这次的分享就到这里了,咱们下期再会~
回复
使用道具
举报
的做法
的做法
当前离线
积分
18
2
主题
10
帖子
18
积分
新手上路
新手上路, 积分 18, 距离下一级还需 32 积分
新手上路, 积分 18, 距离下一级还需 32 积分
积分
18
发消息
发表于
前天 15:58
|
显示全部楼层
打酱油的人拉,回复下赚取积分
回复
使用道具
举报
返回列表
发帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
快速回复
返回顶部
返回列表