Cocos2d-X开发中国象棋《三》开始场景的实现

前端之家收集整理的这篇文章主要介绍了Cocos2d-X开发中国象棋《三》开始场景的实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在前面两节(第一节第二节)中介绍了中国象棋的功能和工程文件,在这篇博客中将介绍中国象棋的开始场景的实现

在写代码前先理清一下实现开始场景的思路:

1、打开游戏后进入开始场景,场景上显示一个红色的帅和黑色的将,并且两个棋子在同一条直线上(两个棋子的y坐标相同)

2、当玩家单击红色后,红色的帅一边向右移动一边按照顺时针方向旋转,黑色的将一边向左移动一边按照逆时针方向旋转

3、当玩家单击黑色后,红色的帅一边向右移动一边按照顺时针方向旋转,黑色的将一边向左移动一边按照逆时针方向旋转

4、当两个棋子相撞后进入游戏场景(两个棋子的距离小于或者等于棋子的直径)

5、如果玩家单击的是红色的帅,玩家的棋子为红色

6、如果玩家单击的是黑色的将,玩家的棋子为黑色


SceneStart.h和SceneStart.cpp用于实现开始场景

实现代码

SceneStart.h中的代码

  1. #ifndef _SceneStart_H_
  2. #define _SceneStart_H_
  3.  
  4. #include "cocos2d.h"
  5. USING_NS_CC;
  6.  
  7. class SceneStart : public CCLayer
  8. {
  9. public:
  10. static CCScene* scene();
  11.  
  12. bool init();
  13.  
  14. CREATE_FUNC(SceneStart);
  15.  
  16. bool ccTouchBegan(CCTouch* pTouch,CCEvent* pEvent);
  17. void ccTouchEnded(CCTouch* pTouch,CCEvent* pEvent);
  18.  
  19. CCSprite* _red;
  20. CCSprite* _black;
  21.  
  22. void update(float);
  23.  
  24. //标记是否选中了红色棋子
  25. bool _selected;
  26. };
  27.  
  28. #endif


SceneStart.cpp中的代码

  1. #include "SceneStart.h"
  2. #include "SceneGame.h"
  3.  
  4.  
  5. CCScene* SceneStart::scene()
  6. {
  7. CCScene* scene = CCScene::create();
  8.  
  9. SceneStart* layer = SceneStart::create();
  10.  
  11. scene->addChild(layer);
  12.  
  13. return scene;
  14. }
  15.  
  16.  
  17. bool SceneStart::init()
  18. {
  19. CCLayer::init();
  20.  
  21. CCSize winSize = CCDirector::sharedDirector()->getWinSize();
  22.  
  23. CCSprite* bkr = CCSprite::create("bkg2.png");
  24. addChild(bkr);
  25.  
  26. CCSprite* bkb = CCSprite::create("bkg1.png");
  27. addChild(bkb);
  28.  
  29. bkr->setPosition(ccp(winSize.width / 2 - 100,winSize.height / 2));
  30. bkb->setPosition(ccp(winSize.width / 2 + 100,winSize.height / 2));
  31.  
  32. _red = bkr;
  33. _black = bkb;
  34.  
  35. //注册触摸事件
  36. setTouchEnabled(true);
  37. setTouchMode(kCCTouchesOneByOne);
  38. return true;
  39. }
  40.  
  41.  
  42. bool SceneStart::ccTouchBegan(CCTouch* pTouch,CCEvent* pEvent)
  43. {
  44. return true;
  45. }
  46.  
  47.  
  48. void SceneStart::ccTouchEnded(CCTouch* pTouch,CCEvent* pEvent)
  49. {
  50. CCSize winSize = CCDirector::sharedDirector()->getWinSize();
  51.  
  52. //获得触摸点的位置(坐标)
  53. CCPoint ptClick = pTouch->getLocation();
  54.  
  55. //用于判断是否点中了棋子
  56. bool bClickStone = false;
  57.  
  58. //当点中红色的棋子的时候(触摸点的位置在红色的棋子所在的范围内)
  59. if(_red->boundingBox().containsPoint(ptClick))
  60. {
  61. //点中了红色的棋子
  62. this->_selected = true;
  63.  
  64. //点中了棋子
  65. bClickStone = true;
  66. }
  67. //当点中黑色棋子的时候(触摸点的位置在黑色棋子所在的范围内)
  68. else if(_black->boundingBox().containsPoint(ptClick))
  69. {
  70. //没点中红色棋子
  71. this->_selected = false;
  72.  
  73. //点中了棋子
  74. bClickStone = true;
  75. }
  76.  
  77. //当点中了棋子的时候
  78. if(bClickStone)
  79. {
  80. //移动棋子
  81. CCMoveTo* moveTo1 = CCMoveTo::create(1,ccp(winSize.width / 2,winSize.height / 2));
  82. CCMoveTo* moveTo2 = CCMoveTo::create(1,winSize.height / 2));
  83. //旋转棋子
  84. CCRotateBy* rotate1 = CCRotateBy::create(1,360);
  85. CCRotateBy* rotate2 = CCRotateBy::create(1,-360);
  86.  
  87. //旋转和移动同时执行
  88. CCSpawn* spawn1 = CCSpawn::create(moveTo1,rotate1,NULL);
  89. CCSpawn* spawn2 = CCSpawn::create(moveTo2,rotate2,NULL);
  90.  
  91. //执行行动作
  92. _red->runAction(spawn1);
  93. _black->runAction(spawn2);
  94.  
  95. //启动定时器
  96. scheduleUpdate();
  97. }
  98. }
  99.  
  100.  
  101. void SceneStart::update(float)
  102. {
  103. //获取两个棋子的x坐标
  104. float x1 = _red->getPositionX();
  105. float x2 = _black->getPositionX();
  106.  
  107. //当红色的棋子和黑色的棋子碰撞后
  108. //两个棋子的距离小于或等于棋子的直径
  109. //getContentSize().width获得棋子的宽度(棋子的直径)
  110. if(abs(x1 - x2) <= _red->getContentSize().width)
  111. {
  112. //进入游戏
  113. CCDirector::sharedDirector()->replaceScene(SceneGame::scene(this->_selected));
  114. }
  115. }

执行结果:



猜你在找的Cocos2d-x相关文章