在博客上,以实现创建的游戏场景。而一些button,因为button落实到事件作出详细答复,需要使用一些功能摆棋。为此我特意button上的背面的具体实施,
在摆棋前先理清一下摆棋的思路:
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, 0, Stone::CHE},//马的位置(1,0){1, 0, Stone::MA},//相的位置(2,0){2, 0, Stone::XIANG},//士的位置(3,0){3, 0, Stone::SHI},//将的位置(4,0){4, 0, Stone::JIANG}, //士的位置(5,0){5, 0, Stone::SHI},//相的位置(6,0){6, 0, Stone::XIANG}, //马的位置(7,0){7, 0, Stone::MA}, //车的位置(8,0){8, 0, Stone::CHE},//炮的位置(1,2){1, 2, Stone::PAO}, //炮的位置(7,2){7, 2, Stone::PAO},//兵的位置(0,3){0, 3, Stone::BING}, //兵的位置(2,3){2, 3, Stone::BING}, //兵的位置(4,3){4, 3, Stone::BING}, //兵的位置(6,3){6, 3, Stone::BING}, //兵的位置(8,3){8, 3, Stone::BING},};创建棋子
//创建棋子//第一个參数:棋子的类型//第二个參数:棋子的颜色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//两个棋子的颜色的下标相差 7int 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坐标相差9this->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相差16this->setX(_initPos[_id-16]._x);this->setY(_initPos[_id-16]._y);}}}版权