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