cocos2dx例項開發之2048(新增動畫版)

2021-06-26 07:42:43 字數 4152 閱讀 2712

網上找了好多教程寫2048,不過都沒有實現卡片的移動動畫,自己寫了乙個不太完美的帶動畫版。

開發步驟:

1,設計乙個cardsprite類。

2,設計主遊戲場景gamescene,實現遊戲邏輯,新增動畫邏輯。

3,新增遊戲勝利或者遊戲失敗的層,新增歷史分數儲存。

4,新增聲音等其他元素,專門弄了乙個聲音預載入的場景,主場景新增聲音切換變數儲存。

貼上主場景關鍵**:

gamescene.h

#pragma once

#include "cocos2d.h"

#include "cardsprite.h"

#include "menulayer.h"

class gamescene :public cocos2d::layer

;

gamescene.cpp

/*

*game:2048

*author:tashaxing

*time:2014/10/12

*/#include "gamescene.h"

#include "******audioengine.h"

using namespace cocos2d;

using namespace cocosdenshion;

scene* gamescene::createscene()

bool gamescene::init()

void gamescene::restart(ref* sender)

bool gamescene::ontouchbegan(touch *touch, event *event)

return true;

}void gamescene::ontouchended(touch *touch, event *event)

auto endpt = touch->getlocation(); //獲得觸控結束點

offsetx = endpt.x - startpt.x; //計算偏移

offsety = endpt.y - startpt.y;

bool istouch = false;

if (abs(offsetx) > abs(offsety)) //判斷為方向

else

if (istouch) //如果滑動成功則判斷 }

void gamescene::createcardarr(size size)

} //建立臨時卡片矩陣,用於動畫,每個動畫卡片對應乙個實際卡片的動畫,這是個技巧,並且動畫層在卡片層之上,所以後加入,也可以設定addchild層次

for (int i = 0; i < 4; i++) }

}void gamescene::randomcreatecard()

}//向左滑動遊戲邏輯,其他方向類似

bool gamescene::moveleft()

else if (cardarr[x][y]->getnumber() == cardarr[x1][y]->getnumber())

break; //此處break防止出現連續乘2的bug}}

} }return moved;

}bool gamescene::moveright()

else if (cardarr[x][y]->getnumber() == cardarr[x1][y]->getnumber())

break; //此處break防止出現連續乘2的bug}}

} }return moved;

}bool gamescene::moveup() //這裡的「上」是邏輯上往座標值小的方向,在螢幕上實際是往下動

else if (cardarr[x][y]->getnumber() == cardarr[x][y1]->getnumber())

break; //此處break防止出現連續乘2的bug}}

} }return moved;

}bool gamescene::movedown() //這裡的「下」是邏輯上往座標值小的方向,在螢幕上實際是往上動

else if (cardarr[x][y]->getnumber() == cardarr[x][y1]->getnumber())

break; //此處break防止出現連續乘2的bug}}

} }return moved;

}void gamescene::checkgamewin()

auto menubestscorelabel = labelttf::create(string::createwithformat("best: %d", bestscore)->getcstring(), "arial", 20);

menubestscorelabel->setposition(menusize.width / 2, menusize.height / 2 - 30);

menulayer->addchild(menubestscorelabel);

menuitemfont::setfontname("arial");

menuitemfont::setfontsize(25);

auto menuitemrestart = menuitemfont::create("restart", this, menu_selector(gamescene::restart));

menuitemrestart->setcolor(color3b(255, 255, 0));

auto menu = menu::create(menuitemrestart, null);

menulayer->addchild(menu);

menu->setposition(point(menusize.width / 2, menusize.height / 2 - 80)); }}

void gamescene::checkgameover()

} }//否則遊戲結束

if (isgameover)

auto menubestscorelabel = labelttf::create(string::createwithformat("best: %d", bestscore)->getcstring(), "arial", 20);

menubestscorelabel->setposition(menusize.width / 2, menusize.height / 2 - 30);

menulayer->addchild(menubestscorelabel);

menuitemfont::setfontname("arial");

menuitemfont::setfontsize(25);

auto menuitemrestart = menuitemfont::create("restart", this, menu_selector(gamescene::restart));

menuitemrestart->setcolor(color3b(255, 255, 0));

auto menu = menu::create(menuitemrestart, null);

menulayer->addchild(menu);

menu->setposition(point(menusize.width / 2, menusize.height / 2 - 80));

} }

關鍵點:1,專門弄了乙個4*4的卡片臨時矩陣做為動畫層,也就是有16個卡片專門負責對應卡片的動畫(卡片生成的動畫是實際卡片,這個是例外)。

2,關於遊戲邏輯中每次移動後面都有乙個break

如果不加這個break就會出現:

加上break就正常了。

遊戲截圖:

源**

Cocos2dx開發之錨點例項

錨點概念 由於我們在使用cocos2dx進行開發時,一般都是在場景中載入精靈來實現的,而精靈上掛載的往往都不是乙個點而是一張資源,那麼我們在場景中設定這個精靈的位置時,對這張資源來說是應該把這張資源中的哪個點與我們設定的點對齊呢?這裡就引出了錨點這個概念,我們通過設定錨點來確定資源上哪個點與我們設定...

cocos2d x遊戲開發之動畫

mygame.h中宣告動畫函式 class mygame public cocos2d layer bool mygame init return true 注意 若按鈕事件中包含切換場景事件,則需要在按鈕事件中新增schedule函式,否則切換場景後,動畫還來不及生成,再次點選按鈕出發按鈕事件,則...

cocos2d x 之UITextField的使用

本文使用的是cocos2d x 2.1.6版本,cocosstudio1.6.0.0版本。其呼叫的相關 如下 bool helloworld init void helloworld textfieldevent ccobject psender,textfiledeventtype type 不過...