Cocos2d-X開發中國象棋《三》開始情境的實現,cocos2d-x《三》
在前面兩篇部落格中介紹了中國象棋的功能和工程檔案,在這篇部落格中將介紹中國象棋的開始情境的實現
在寫代碼前先理清一下實現開始情境的思路:
1、開啟遊戲後進入開始情境,情境上顯示一個紅色的帥和黑色的將,並且兩個棋子在同一條直線上(兩個棋子的y座標相同)
2、當玩家單擊紅色的帥後,紅色的帥一邊向右移動一邊按照順時針方向旋轉,黑色的將一邊向左移動一邊按照逆時針方向旋轉
3、當玩家單擊黑色的將後,紅色的帥一邊向右移動一邊按照順時針方向旋轉,黑色的將一邊向左移動一邊按照逆時針方向旋轉
4、當兩個棋子相撞後進入遊戲情境(兩個棋子的距離小於或者等於棋子的直徑)
5、如果玩家單擊的是紅色的帥,玩家的棋子為紅色
6、如果玩家單擊的是黑色的將,玩家的棋子為黑色
SceneStart.h和SceneStart.cpp用於實現開始情境
實現代碼:
SceneStart.h中的代碼
#ifndef _SceneStart_H_#define _SceneStart_H_#include "cocos2d.h"USING_NS_CC;class SceneStart : public CCLayer{public: static CCScene* scene(); bool init(); CREATE_FUNC(SceneStart); bool ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent); void ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent); CCSprite* _red; CCSprite* _black; void update(float); //標記是否選中了紅色棋子 bool _selected;};#endif
SceneStart.cpp中的代碼
#include "SceneStart.h"#include "SceneGame.h"CCScene* SceneStart::scene(){ CCScene* scene = CCScene::create(); SceneStart* layer = SceneStart::create(); scene->addChild(layer); return scene;}bool SceneStart::init(){ CCLayer::init(); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCSprite* bkr = CCSprite::create("bkg2.png"); addChild(bkr); CCSprite* bkb = CCSprite::create("bkg1.png"); addChild(bkb); bkr->setPosition(ccp(winSize.width / 2 - 100, winSize.height / 2)); bkb->setPosition(ccp(winSize.width / 2 + 100, winSize.height / 2)); _red = bkr; _black = bkb; //註冊觸摸事件 setTouchEnabled(true); setTouchMode(kCCTouchesOneByOne); return true;}bool SceneStart::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent){ return true;}void SceneStart::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent){ CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //獲得觸摸點的位置(座標) CCPoint ptClick = pTouch->getLocation(); //用於判斷是否點中了棋子 bool bClickStone = false; //當點中紅色的棋子的時候(觸摸點的位置在紅色的棋子所在的範圍內) if(_red->boundingBox().containsPoint(ptClick)) { //點中了紅色的棋子 this->_selected = true; //點中了棋子 bClickStone = true; } //當點中黑色棋子的時候(觸摸點的位置在黑色棋子所在的範圍內) else if(_black->boundingBox().containsPoint(ptClick)) { //沒點中紅色棋子 this->_selected = false; //點中了棋子 bClickStone = true; } //當點中了棋子的時候 if(bClickStone) { //移動棋子 CCMoveTo* moveTo1 = CCMoveTo::create(1, ccp(winSize.width / 2, winSize.height / 2)); CCMoveTo* moveTo2 = CCMoveTo::create(1, ccp(winSize.width / 2, winSize.height / 2)); //旋轉棋子 CCRotateBy* rotate1 = CCRotateBy::create(1, 360); CCRotateBy* rotate2 = CCRotateBy::create(1, -360); //旋轉和移動同時執行 CCSpawn* spawn1 = CCSpawn::create(moveTo1, rotate1, NULL); CCSpawn* spawn2 = CCSpawn::create(moveTo2, rotate2, NULL); //執行行動作 _red->runAction(spawn1); _black->runAction(spawn2); //啟動定時器 scheduleUpdate(); }}void SceneStart::update(float){ //擷取兩個棋子的x座標 float x1 = _red->getPositionX(); float x2 = _black->getPositionX(); //當紅色的棋子和黑色的棋子碰撞後 //兩個棋子的距離小於或等於棋子的直徑 //getContentSize().width獲得棋子的寬度(棋子的直徑) if(abs(x1 - x2) <= _red->getContentSize().width) { //進入遊戲 CCDirector::sharedDirector()->replaceScene(SceneGame::scene(this->_selected)); }}
執行結果: