quick-cocos2d-x 学习系列之二样例2048游戏学习
最近蛤蟆会来看下quick中提供的几个SAMPLE例子,例子不多那咱们就一一过一下呗。先从2048这个游戏开始吧。
该游戏不介绍了,没听过的就去小黑屋哭泣吧~
源码路径 ..\quick-3.3\quick\samples\2048
这个是资源文件夹,里面就放了2个图片GreenButton.png,GreenScale9Block.png。
这个是LUA代码文件夹了,所有逻辑都在此中。也是蛤蟆要重点照顾的文件夹。
这个LUA文件是程序的入口函数
然后文件会调用appentry函数,代码如下
require("appentry")
这个,其实可以理解成C语言中的
#include <appentry>
appentry文件,包含logic和game文件,然后调用game文件的startup函数如下:
require("logic")
require("game")
game.startup()
game文件中有一个startup函数。
该函数设置了一个资源路径。然后进入game文件中的另一个函数enterMainScene
enterMainScene函数通过scenes文件夹中的MainScene文件创建了一个新的场景,显示场景后完毕退出game文件。之后程序就进入到了游戏主体函数中了。
我们来看下这个MainScene.lua主要文件。创建场景后先运行函数
该函数先给游戏增加一个颜色,如下图
display.newColorLayer(cc.c4b(0xfa,0xf8,0xef,255)):addTo(self)
然后调用function initGrid(m,n)
来显示一个网格,该函数在logic.lua文件中,具体如下
function initGrid(m,n)
local grid = {}
for i=1,m do
if not grid[i] then
grid[i] = {}
end
for j=1,n do
grid[i][j] = 0
end
end
randomNum(grid)
randomNum(grid)
return grid
end
输入参数为m,n。创建一个mxn的矩阵。
最后返回一个矩阵,矩阵会随机生成2个随机数2或者4
90%的概率是2,10%的概率是4. ,其他都为0。
接着增加游戏标题
self:createLabel("2048")
createLabel函数在该文件中实现。
增加了游戏标题和游戏得分。
增加网格显示
通过如下函数来实现网格显示
self:createGridShow()
将矩阵数字显示在屏幕上。
该函数将数字转变为字符然后显示。
如果为0就不显示了。
数字的大小为40,每个数字底部的宽度为140。
(注:该函数中调用了show函数,该函数的输入参数是一个CELL结构体和 矩阵坐标)
增加按钮
self:createButtons()
增加一个new Game按钮,按下后调用restartGame函数。
加载状态
判断文件hxgame.config是否存在,如果存在则读取文件
该文件在蛤蟆现在这一时刻的内容如下:
do localgrid,bestScore,totalScore,WINSTR,isOver
={[1]={[1]=0,[2]=0,[3]=0,[4]=2},[2]={[1]=0,[2]=0,[3]=2,[4]=0},[3]={[1]=0,[2]=0,[3]=0,[4]=0},[4]={[1]=0,[2]=0,[3]=0,[4]=0}},356,0,'',falsereturn grid,bestScore,totalScore,WINSTR,isOver end
然后调用函数reLoadGame
这个函数将历史最好分数和当前分数显示在屏幕上。
失败后重启游戏
通过全局变量isOver来控制游戏是否结束
结束则调用函数restartGame.
不过当前游戏并不会自动根据状态来判断游戏是否OVER,只是在点击new game按钮的时候才能重启。
重启游戏函数中,重新创建一个4X4矩阵,同时将一些全局变量保存到hxgame.config 文件中。
该函数会在调用完毕MainScene:ctor()后调用,MainScene:ctor()函数类似对象类编程的构造函数。
onEnter()函数会设置一个TOUCH监听。其他基本没有了。
当有触摸时候调用函数onTouch
onTouch函数,根据触摸情况调用logic文件中的上下左右逻辑。然后调用logic文件中的函数touch_op ,该函数实现前一次矩阵临时保存,然后调用相应上下左右并得到当前分数。然后通过函数getOpList返回变化后的矩阵,接着用doOpList函数来处理一下变化后的数字。
继续就是计算得分,是否超过历史最高。
再调logic文件中的canMove函数来判断 游戏是否出现僵局,并赋值给全局变量isOver.
最后调用saveStatus 函数,保存全局参数到文件中。
这里:我们来看下移动的函数,这里只说明向下移动
local functionmoveDown(grid)
先取出每列的数字放到一个表中,然后处理原始矩阵的每一列,将他们自下往上堆叠起来。然后判断同一列中是否有相同的数字,如果有则进行重合并判断积分是否达到2048.最后返回分数和是否胜利(改变后的矩阵不需要返回,因为本身就是一个全局变量)
这个文件是游戏主要逻辑,实现了 随机数产生,随机位置,左移,右移,上移,下移等函数。
2048通过LUA实现逻辑上和用其他语言实现没撒大的区别,主要要注意的是实现逻辑上功能模块化。这样不但利用DEBUG,也可以养成良好的编程习惯。
下回再见。