在前面两节(第一节第二节)中介绍了中国象棋的功能和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));
}
}

运行结果:



最新文章

  1. ajax知识整理
  2. php大力力 [038节] 全栈工程师的含义
  3. 盘点mysql中容易被我们误会的地方
  4. http://tedhacker.top/2016/08/05/Spring%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/
  5. 数学对象Math ceil()、floor()、round()方法
  6. javascript 阻止冒泡
  7. Delphi Refactor 重构
  8. stm32 时钟配置&mdash;&mdash;外部时钟倍频、内部时钟倍频 【worldsing笔记】
  9. LightOj_1284 Lights inside 3D Grid
  10. 如何应对“改变现状”的失败&quot;
  11. Telephone Lines USACO 月赛
  12. Set对象常用操作方法和遍历
  13. 并查集(union-find set)与Kruskal算法
  14. 【报错】java.lang.ClassNotFoundException: org.apache.ibatis.session.SqlSession
  15. 《Mysql 分区分表》
  16. Easyui的DataGrid 清除所有勾选的行。
  17. Meet in the middle学习笔记
  18. word-ladder总结
  19. java代码块执行顺序
  20. 【javascrpt】——图片预览和上传,兼容IE 9-

热门文章

  1. Java中的异常注意点
  2. 《Java编程的逻辑》第一部分 编程基础与二进制
  3. c#——值类型与引用类型
  4. SQL基本操作——DROP撤销索引、表以及数据库
  5. [Windows Server 2003] 安装网站伪静态
  6. 【译】x86程序员手册06 - 2.4指令格式
  7. 解决richfaces自带的jquery
  8. cocos creator destroy方法
  9. groupbox
  10. CAD调用导角命令,并返回导角的圆弧对象