本文仅供个人记录和复习,不用于其他用途
前言
这个小程序是我在慕课网上学到的,有兴趣的可以去慕课网搜索“雷过就跑”,这位老师讲得很不错,本章用到的图片资源也可以在那里下载。
设计思路
时钟程序并不复杂,我们只需要三个场景,这三个场景对应三个层:
- 加载场景
- 开始场景
- 时钟场景
对应这三个场景,我们需要相应的转换方法:
- 创建加载场景
- 从加载场景转换到开始场景
- 从开始场景转换到时钟场景
另外,为了方便起见,我们最好创建一个类,用来管理这三个场景。大体上就需要这三个场景,至于具体的逻辑实现,请跟着我往下看:
SceneManager
SceneManager
用于管理三个场景。
SceneManager.h
|
|
代码很简单,我们创建了一个场景管理类,用来统一管理这三个场景。同时,我们还定义了相关的转换场景的方法。
SceneManager.cpp
|
|
createLoadScene()
不用多说,类似的我们已经写了很多遍。至于这个tsm
其实就是SceneManager
的指针。goOpenScene()
初始化了场景,并且将写好的层加入父节点,同时要记得转换场景。至于goClockScene()
,也是一样。
说完了整体的场景架构,接下来就来看看具体的层是怎么实现的。
LoadLayer
LoadLayer
对应的是loadScene
,用于显示加载画面。
LoadLayer.h
|
|
onScheduleOnce()
是一个定时器用到的回调函数,而tsm
指针实际上就是为了方便SceneManager
转换场景,用于存储当前的SceneManager
对象。
LoadLayer.cpp
|
|
这里使用了一个Label
标签来显示Loading…
字符串。另外呢,我们还使用了一个一次性定时器,在2s之后执行回调函数onScheduleOnce()
。这个回调函数使用了SceneManager
对象,将场景转换到openScene
。
简单来说,我们先显示Loading…
,2s后就跳到了开始界面。所以这里的加载界面只是做一个样子,并没有和游戏的初始化结合起来(因为游戏太简单了,加载特别快)。
OpenLayer
OpenLayer
对应的是openScene
,用于展示开始菜单界面。
OpenLayer.h
|
|
其他的很简单,关于这个menuCallBakc()
,是一个菜单项用到的回调函数,用于实现点击菜单按钮后的效果。至于tsm
,已经讲过了。
OpenLayer.cpp
|
|
我们先创建一个标签,用于显示标题CLOCK PROGRAME
。然后创建了两个菜单项BEGIN
和EXIT
,分别用于开始和退出。上一章已经说到,我们需要提供相应的回调函数,使得点击后产生不同的效果。至于为什么要设置tag
,自然是为了区分不同的菜单项。至于回调函数menuCallBack()
,我们通过提供的MenuItem
对象,获取它的tag
值。如果为101
,那么便跳转到clockScene
场景,如果为102
就退出程序。
ClockLayer
ClockLayer
对应clockScene
,是最复杂的层。
ClockLayer.h
|
|
_hour
代表时针,_minute
代表分针,_second
代表秒针,_background
代表背景图片。hRotation
、mRotation
、sRotation
对应时、分、秒针需要旋转的角度。
ClockLayer.cpp
|
|
首先,创建一个Back
菜单项,用于跳转回开始界面。然后就是将时、分、秒针的图片加入对应的精灵,并且设置好位置、大小。接着,导入时钟的背景图片。
获取时间的那一串代码,仅用于windows
下、linux
和mac
下的又是另外一种方法:
|
|
win32
平台下:
|
|
至于指针的偏转,我们首先要知道,分针的角度是当前时间的分钟值乘以6,秒针的角度是当前时间的秒钟值乘以6。由于,时针是12小时,所以应该是当前时钟值乘以30并且加上分针角度除以12。
关于时针的角度是怎么算的,我来给大家总结一下。首先,时钟值乘以5乘以6是没有错的。但是呢,时针不可能只停留在整数,所以要根据当前分钟值来算出一个小时中时针走了多少。我们知道,分针转一圈,时针转72度,也就是说时针比分针为1:12。因此,拿分针旋转角度除以12就是时针应该多旋转的角度。注意,这里还要考虑时钟值超过12时的情况。
不过呢,我们现在仅仅只是对时钟的状态进行了初始化,我们还需要一个定时器,1s改变一次时钟,从而达到时钟计时的效果。
秒针很简单,1s变化6度即可。那么一旦秒针转了360度,那么分针转6度,秒针角度归零。至于时针,那么就是当分针角度整除72时,就旋转6度。因为一个大格有五个小格,每一个小格代表6度。当时针转6度时,分针就会旋转72度,所以要除以72。另外,分针也要记得归零。
总结
除了旋转的逻辑复杂一点点,其他的都是很容易理解的,以我们之前所学习的知识是能够做出来的。做出这个小项目也是为了整合之前的知识,弥补代码实战方面的不足。
由于表盘制作的不太精确,指针可能没有指准。效果大致如下: