在前面两节(第一节。第二节)中介绍了中国象棋的功能和project文件。在这篇博客中将介绍中国象棋的開始场景的实现
在写代码前先理清一下实现開始场景的思路:
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)); } }
运行结果: