Cocos2d-x 别踩白块
前言
将很久以前写的教程梳理梳理
原文
环境:
- Cocos2d-x 3.2
- VS2012
块,Block
首先新建一个项目,
然后修改它的 AppDelegate.cpp ,将显示尺寸调整成竖屏分辨率。
最后在生成APK前,还要在android那设置,永远竖屏的属性。
最重要的类:块,Block
在游戏内,有很多不同颜色的块(黑色、白色、黄色等),这些块统一封装到一个类中,通过不同参数来控制呈现不同状态。
参数:
- 颜色
- 大小
- 内容文本
- 内容字体大小
- 内容字体颜色
代码:
1 | // Block.cpp |
然后,在Block类中,还需要支持增删方法及容器
1 | // Block.cpp |
基础的块类实现后,来贴合游戏业务,实现开始行和结束行。
此处,直接调整模板附带的HelloWorldScene
1 | // HelloWorldScene.cpp |
添加完开始行,看一下效果:
添加结束行
1 | // HelloWorldScene.cpp |
添加完开始行和结束行,再将中间内容黑白块填充一下
首先,在Block类中添加一个变量 lineIndex,
然后,添加与它相关的get和set函数
这个变量用处是 来知道该块放在哪一行,
比如开始行就应该放在第0行(在addStartLine相应位置修改一下)
结束行就该放在 第4行(同上,也在相应位置修改)
1 | // HelloWorldScene.cpp |
要知道,整个界面被分成四行(0、1、2、3) 和 四列,
这里随机数随机生成 0~3 ,每行中只有一个会和 i 相同,这个就是黑色块,其余的就是白色块,
让场景初始化的时候调用自定义的开始函数
1 | // HelloWorldScene.cpp |
现在,基础的样子已经呈现出来了
逻辑,Logic
别踩白块游戏,主要逻辑是让玩家按照顺序,点击黑色的块,避免点击白色的块,所以要实践触摸事件。
首先,判断点击事件时,要遍历所有的块,所以需要获取所有块的方法。
1 | // Block.cpp |
然后,添加监听器,监听触摸事件
1 | // HelloWorldScene.cpp |
现在,我们实现了第一行的逻辑,只能点黑块,不能点白块。
接下来,要在点击正确后,将所有行整体下移一行,最上面产生一个新行,我们通过新的方法来实现该逻辑。
1 | // HelloWorldScene.cpp |
1 | // Block.cpp |
接下来,处理游戏结束时的情况。
目前的玩法就是 走50行,然后计算花费的时间。
因此,需要记录已经实现的行数,然后在走到第50行的时候判断
- 若已经显示最后一行(全绿),就无需动作
- 若还没有显示最后一行,需要执行新动作
1 | // HelloWorldScene.cpp |
1 | // HelloWorldScene.cpp |
现在可以开始和结束了,游戏生命周期算完整了。
最后,再处理一下计时相关。
首先是显示,块是一行行在移动的,但是时间文本是固定不变的,因此可以分为两层,一层显示文本,一层处理块。
1 | // HelloWorldScene.cpp init函数 |
然后处理时间的 开始、停止、更新
1 | void HelloWorld::startTimer() |
最后在触碰判断处,设定开始计时和停止计时的时机。
1 | // HelloWorldScene.cpp init函数 监听器部分 |
优化,Optimization
第一点,触摸屏蔽;即每次踩到白块后,屏蔽触摸,避免后续异常行为。
通过新建屏蔽层来实现
1 | // SwallowLayer.h |
1 | // SwallowLayer.cpp |
第二点,记录最高分。
本游戏有两个模式:固定时间、固定函数。
每次游戏结束,都要向游戏结束界面传递对应数据,比如,在固定时间模式下显示花费的时间,在固定行数模式下显示完成行数。
通过对游戏结束层的函数重载来实现。
1 | //接受模式(Limit Block OR Limit Time ),// true 为LimitBlocks,false为LimitTime |
1 | void GameOver::createText( bool mode , double num ) |
第三点,时间显示的优化,就是做一个格式化。
1 | double modeLimitTime::getMillSecond() |
1 | //时间的偏差 |
资料