quick-cocos2d-x 学习系列之二样例2048游戏学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/notbaron/article/details/43819325

quick-cocos2d-x 学习系列之二样例2048游戏学习

        

最近蛤蟆会来看下quick中提供的几个SAMPLE例子,例子不多那咱们就一一过一下呗。先从2048这个游戏开始吧。

该游戏不介绍了,没听过的就去小黑屋哭泣吧~

源码路径 ..\quick-3.3\quick\samples\2048

1.  文件介绍

1.1    res文件

这个是资源文件夹,里面就放了2个图片GreenButton.png,GreenScale9Block.png。

 

1.2    src文件

这个是LUA代码文件夹了,所有逻辑都在此中。也是蛤蟆要重点照顾的文件夹。

 

 

2.  代码执行逻辑

 

2.1         Main.lua

这个LUA文件是程序的入口函数

然后文件会调用appentry函数,代码如下

require("appentry")

这个,其实可以理解成C语言中的

#include <appentry>

 

2.2         appentry

appentry文件,包含logic和game文件,然后调用game文件的startup函数如下:

 

require("logic")

require("game")

game.startup()

 

2.3         game

game文件中有一个startup函数。

该函数设置了一个资源路径。然后进入game文件中的另一个函数enterMainScene

enterMainScene函数通过scenes文件夹中的MainScene文件创建了一个新的场景,显示场景后完毕退出game文件。之后程序就进入到了游戏主体函数中了。

 

2.4         MainScene.lua文件

我们来看下这个MainScene.lua主要文件。创建场景后先运行函数

2.4.1             function MainScene:ctor()

          该函数先给游戏增加一个颜色,如下图

                   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 文件中。

 

 

 

 

 

 

 

2.4.2             function MainScene:onEnter()

该函数会在调用完毕MainScene:ctor()后调用,MainScene:ctor()函数类似对象类编程的构造函数。

onEnter()函数会设置一个TOUCH监听。其他基本没有了。

         当有触摸时候调用函数onTouch

2.4.3             function MainScene:onTouch(event, x, y)

onTouch函数,根据触摸情况调用logic文件中的上下左右逻辑。然后调用logic文件中的函数touch_op ,该函数实现前一次矩阵临时保存,然后调用相应上下左右并得到当前分数。然后通过函数getOpList返回变化后的矩阵,接着用doOpList函数来处理一下变化后的数字。

继续就是计算得分,是否超过历史最高。

再调logic文件中的canMove函数来判断 游戏是否出现僵局,并赋值给全局变量isOver.

最后调用saveStatus 函数,保存全局参数到文件中。

 

这里:我们来看下移动的函数,这里只说明向下移动

local functionmoveDown(grid)

先取出每列的数字放到一个表中,然后处理原始矩阵的每一列,将他们自下往上堆叠起来。然后判断同一列中是否有相同的数字,如果有则进行重合并判断积分是否达到2048.最后返回分数和是否胜利(改变后的矩阵不需要返回,因为本身就是一个全局变量)

2.5         logic

这个文件是游戏主要逻辑,实现了 随机数产生,随机位置,左移,右移,上移,下移等函数。

 

2      小结:

2048通过LUA实现逻辑上和用其他语言实现没撒大的区别,主要要注意的是实现逻辑上功能模块化。这样不但利用DEBUG,也可以养成良好的编程习惯。

         下回再见。

 

 

 

展开阅读全文

没有更多推荐了,返回首页