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