網上找了很多寫作教程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就正常了。
遊戲截圖:
cocos2d x點滴總結 2
cocos2d x中的各種座標系 1 裝置本身的座標系 是以左上角為原點 x向右 y向下的。所以觸控的函式 都是這個座標系下的座標。2 遊戲座標系 是以左下角為原點 x向右 y向上。所以設定setposition都是設定的這個座標。3 精靈的紋理座標系 是和螢幕座標系一致的。4 精靈在遊戲座標系中的...
cocos2d x的聲音控制
聲音控制 audioengine是單例,以下是其方法。cpp view plain copy 獲得 audioengine的例項 static audioengine sharedengine 提前載入音訊 void preloadbackgroundmusic const char pszfile...
cocos2d x中的精靈
所有的遊戲都有 sprites 精靈,你可能知道或者不知道它們是什麼。精靈就是遊戲中在場景裡進行移動的物件。你可以操縱它們。精靈可能是遊戲中最主要的角色。我知道你在想什麼 難道每乙個圖形物件都是精靈sprite嗎?當然不是!為什麼?當你操縱乙個精靈的時候,它就是乙個精靈。如果你不對它進行操作,那它就...