基本思路:用二维数组实现核心的消除逻辑,然后提供接口给UI展示层。
游戏引擎:Quick-Cocos2dx-Community 3.7.7 Release
思路分析:采用自顶向下的设计风格。从用户点击开始,一步一步分解整个流程。
逻辑主干如下:
1,用户点击->
2,进入核心逻辑层判断要消除->
3,遍历二维数组,递归获得每个点的连续序列->
4,判断出连续序列符合消除规则->
5,获得消除、下落等的动画信息->
6,UI展示层根据动画信息播放单次点击后的动画
文件名:
1,ArrayCore.lua 二维数组实现的核心逻辑层
2,GamePaper.lua 利用渲染引擎实现的UI展示层
1,用户点击
将两个元素的数组坐标传递给核心逻辑层,获得动画播放信息
local animateInfo = ArrayCore:userInput(x1,y1,x2,y2)
if animateInfo then
playAnimateByInfo(animateInfo)
end
2-5,ArrayCore.lua的完整代码如下 :
-- 2019年10月18日19:50:20 bluebear
-- 三消核心逻辑层
-- 用户输入,如果产生消除,则与消除后的结果共同构成数据返回给显示层。
local ArrayCore = {
name = "ArrayCore"}
local array = {
}
local ROW, COL, NUM = 0
local function getNearNum(i, j)
local n1, n2 = nil
if i > 2 then
if array[i-1][j] == array[i-2][j] then
n1 = array[i-1][j]
end
end
if j > 2 then
if array[i][j-1] == array[i][j-2] then
n2 = array[i][j-1]
end
end
return n1, n2
end
function ArrayCore:initArrayRandom(row, col, num)
math.randomseed(tostring(os.time()):reverse():sub(1, 7))
for i = 1, row do
array[i] = {
}
for j = 1, col do
local random = math.random(num)
local n1, n2 = getNearNum(i, j)
while random == n1 or random == n2 do
random = math.random(num)
end
array[i][j] = random
end
end
ROW = row
COL = col
NUM = num
self.ROW = ROW
self.COL = COL
self.NUM = NUM
end
function ArrayCore:resetArray()
self:initArrayRandom(ROW, COL, NUM)
end
local function printTable(t)
for __,a in pairs(t) do
print(a[1],a[2])
end
end
local function isTIncPos(t,pos)
for i = 1,#t do
if t[i][1] == pos[1] and t[i][2] == pos[2] then
return true
end
end
return false
end
ArrayCore.isTIncPos = isTIncPos
local function addT2T(t1,t2)
for i = 1,#t2 do
if not isTIncPos(t1,t2[i]) then
table.insert(t1,t2[i])
end
end
end
local function checkPos(x,y)
local tmp_table = {
{
x,y}}
local n = array[x][y]
local function func(x,y)
if x>=2 and array[x-1][y] == n and not isTIncPos(tmp_table,{
x-1,y}) then
table.insert(tmp_table, {
x-1, y})
func(x-1,y)
end