在上一篇博客中实现了创建游戏场景,和一些按钮,由于按钮中实现具体的响应事件,需要使用到摆棋中的一些函数,为此我特意将按钮的具体实现方式放在了后面将,
在摆棋前先理清一下摆棋的思路:
1、创建一个Stone类处理棋子信息
2、建立一个表保存棋子信息
3、创建棋子
4、初始化棋子
5、摆棋子
摆棋的效果:
玩家持红棋
玩家持黑棋
创建一个Stone类用于处理棋子的信息,设置Stone类由CCSprite派生而来
//棋子类class Stone : public CCSprite{public: Stone(); //棋子的类型:将、士、相、车、马、炮、兵 enum TYPE {JIANG,SHI,XIANG,CHE,MA,PAO,BING}; //创建棋子 //第一个参数:棋子的类型 //第二个参数:棋子的颜色 static Stone* create(int ID,bool red); //初始化棋子 bool init(int ID,bool red); //摆棋子 voID reset(bool red); //保存梅个棋子的初始位置 static struct InitPos { int _x; int _y; Stone::TYPE _type; }_initPos[16]; CC_SYNTHESIZE(TYPE,_type,Type) CC_SYNTHESIZE(int,_x,X) CC_SYNTHESIZE(int,_y,Y) CC_SYNTHESIZE(int,_ID,ID) CC_SYNTHESIZE(bool,_dead,Dead) CC_SYNTHESIZE(bool,_red,Red) /*//棋子的位置(坐标) int x; int y; int _ID;//棋子的ID 0~31(一共有32个棋子) bool dead;//判断棋子是否被吃了 bool _red;//判断棋子的颜色*/};
建立一个表保存棋子的信息
//创建一张表Stone::InitPos Stone::_initPos[16] ={ //车的位置(0,0) {0,Stone::CHE},//马的位置(1,0) {1,Stone::MA},//相的位置(2,0) {2,Stone::XIANG},//士的位置(3,0) {3,Stone::SHI},//将的位置(4,0) {4,Stone::JIANG},//士的位置(5,0) {5,//相的位置(6,0) {6,//马的位置(7,0) {7,//车的位置(8,0) {8,//炮的位置(1,2) {1,2,Stone::PAO},//炮的位置(7,2) {7,//兵的位置(0,3) {0,3,Stone::BING},//兵的位置(2,3) {2,//兵的位置(4,3) {4,//兵的位置(6,3) {6,//兵的位置(8,3) {8,};
创建棋子
//创建棋子//第一个参数:棋子的类型//第二个参数:棋子的颜色Stone* Stone::create(int ID,bool red){ Stone* s = new Stone(); s->init(ID,red); s->autorelease(); return s;}
初始化棋子
/初始化棋子//象棋的一次性初始化bool Stone::init(int ID,bool red){ _ID = ID;//获得棋子的ID //当棋子的ID小于16时,棋子是红色的 _red = _ID < 16; //初始化红色的棋子 if(_ID < 16) { _type = _initPos[_ID]._type; } else//初始化黑色的棋子 { //类型(车、马、炮)相同颜色不同的两个棋子的ID相差16 _type = _initPos[_ID-16]._type; } const char* stonePic[14] = { "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" //(黑色)卒 }; //计算图片的下标 //如果棋子是红色的 IDx = _type //如果棋子是黑色的 IDx = 7 + _type //两个棋子的颜色的下标相差 7 int IDx = (_red ? 0 : 1) * 7 + _type; //创建精灵(创建棋子) CCSprite::initWithfile(stonePic[IDx]); //压缩棋子 setScale(.8f); //摆棋子(设置棋子的位置) reset(red); return true;}
摆放棋子
//摆放棋子//参数:用于判断游戏玩家选择进入游戏场景时是否//点了红色的棋子voID Stone::reset(bool red){ //刚摆棋子的时候棋子没被吃掉 this->setDead(false); if(red)//当玩家点红色的棋子进入游戏场景时 {//玩家的棋子的颜色为红色 if(_ID < 16)//摆放红色的棋子 { //设置棋子的x坐标 this->setX(_initPos[_ID]._x); //设置棋子的y坐标 this->setY(_initPos[_ID]._y); } else//摆放黑色的棋子 { this->setX(8 - _initPos[_ID-16]._x); //两个类型相同颜色不同的棋子的y坐标相差9 //如:红色的车和黑色的车的y坐标相差9 this->setY(9 - _initPos[_ID-16]._y); } } else//当玩家点黑色的棋子进入游戏场景时 {//玩家的棋子的颜色是黑色 if(_ID < 16)//摆放黑色的棋子 { this->setX(8 - _initPos[_ID]._x); this->setY(9 - _initPos[_ID]._y); } else//摆放红色的棋子 { //两个类型相同颜色不同的棋子的ID相差16 //如:红色的车和黑色的车的ID相差16 this->setX(_initPos[_ID-16]._x); this->setY(_initPos[_ID-16]._y); } }}总结
以上是内存溢出为你收集整理的Cocos2d-X开发中国象棋《五》摆棋全部内容,希望文章能够帮你解决Cocos2d-X开发中国象棋《五》摆棋所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)