Cocos2dx实现象棋之布局

前端之家收集整理的这篇文章主要介绍了Cocos2dx实现象棋之布局前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

开始界面

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

开始界面实现了滚动布局与点击选择执黑还是执白的功能

放置棋盘与桌面

  1. //desk
  2. CCSprite *desk=CCSprite::create("floor.jpg");
  3. addChild(desk);
  4. desk->setPosition(ccp(winSize.width/2,winSize.height/2));
  5. desk->setScaleX(winSize.width/desk->getContentSize().width);
  6. desk->setScaleY(winSize.height/desk->getContentSize().height);
  7.  
  8. //add plate and stone
  9.  
  10. CCSprite *plate=CCSprite::create("background.png");
  11. plate->setAnchorPoint(ccp(0,0));
  12. plate->setPosition(_plateoffset);
  13. plate->setScale((winSize.height-_plateoffset.y*2)/plate->getContentSize().height);
  14. addChild(plate);

创建棋子类

  1. #ifndef STONE_H
  2. #define STONE_H
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5.  
  6. class Stone : public CCSprite
  7. {
  8. public:
  9. Stone();
  10. enum TYPE {JIANG,SHI,XIANG,CHE,MA,PAO,BING};
  11. static Stone *create(int id,bool red)
  12. {
  13. Stone *s=new Stone();
  14. s->init(id,red);
  15. s->autorelease();
  16. return s;
  17. }
  18. void reset(bool red);
  19.  
  20. bool init(int id,bool red)
  21. {
  22. _id=id;
  23. _red=_id<16;
  24. //once init
  25. if(_id < 16)
  26. _type = _initPos[_id]._type;
  27. else
  28. _type = _initPos[_id-16]._type;
  29. const char* stonePic[14] = {
  30. "rshuai.png","rshi.png","rxiang.png","rche.png","rma.png","rpao.png","rbing.png","bjiang.png","bshi.png","bxiang.png","bche.png","bma.png","bpao.png","bzu.png"
  31. };
  32. int idx=(_red?0:1)*7+_type;
  33. CCSprite::initWithFile(stonePic[idx]);
  34. setScale(.8f);
  35. reset(red);
  36. return true;
  37. }
  38.  
  39. CC_SYNTHESIZE(TYPE,_type,Type)
  40. CC_SYNTHESIZE(int,_x,X)
  41. CC_SYNTHESIZE(int,_y,Y)
  42. CC_SYNTHESIZE(int,_id,Id)
  43. CC_SYNTHESIZE(bool,_dead,Dead)
  44. CC_SYNTHESIZE(bool,_red,Red)
  45.  
  46. static struct InitPos
  47. {
  48. int _x;
  49. int _y;
  50. Stone::TYPE _type;
  51. }_initPos[16];
  52.  
  53. };
  54.  
  55. #endif // STONE_H

加载棋子类,世界坐标与棋盘坐标的转换

  1. //addstone
  2. for(int i=0;i<32;i++)
  3. {
  4. _s[i]=Stone::create(i,red);
  5. addChild(_s[i]);
  6. //_s[i]->setPosition(ccp(_s[i]->getX()*_d,_s[i]->getY()*_d)+_stoneoffset);
  7. //setRealPos(_s[i]);
  8. _s[i]->setPosition(ccp(CCRANDOM_0_1()*winSize.width,CCRANDOM_0_1()*winSize.height));
  9.  
  10. CCMoveTo* move=CCMoveTo::create(1,this->getStonePos(_s[i]->getX(),_s[i]->getY()));
  11. _s[i]->runAction(move);
  12. }

加载悔棋按钮

  1. CCMenu *menu=CCMenu::create();
  2. CCMenuItemImage *item=CCMenuItemImage::create("regret.jpg","regret.jpg",this,menu_selector(SceneGame::back));
  3. menu->addChild(item);
  4. addChild(menu);
  5. menu->setPositionX(menu->getPositionX()+200);
  6. _steps=CCArray::create();
  7. _steps->retain();

悔棋功能的实现

  1. void SceneGame::back(CCObject *)
  2. {
  3. //CCLog("HELLO WORLD\n");
  4. if(_steps->count()==0)
  5. return;
  6. Step *step=(Step*)_steps->lastObject();
  7. _s[step->_moveid]->setX(step->_xFrom);
  8. _s[step->_moveid]->setY(step->_yFrom);
  9. _s[step->_moveid]->setPosition(getStonePos(step->_xFrom,step->_yFrom));
  10. if(step->_killid!=-1)
  11. {
  12. _s[step->_killid]->setVisible(true);
  13. _s[step->_killid]->setDead(false);
  14. }
  15.  
  16. _redTrun=!_redTrun;
  17. _steps->removeLastObject();
  18.  
  19. }

结果展示

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