cocos2dx实现象棋之运动
2016-02-26 17:12
549 查看
1、头文件
[code] void moveStone(int moveid, int killid, int x, int y); void moveComplete(CCNode*, void*); bool canMove(int moveid, int killid, int x, int y); bool canMoveJiang(int moveid, int killid, int x, int y); bool canMoveShi(int moveid, int x, int y); bool canMoveXiang(int moveid, int x, int y); bool canMoveChe(int moveid, int x, int y); bool canMoveMa(int moveid, int x, int y); bool canMovePao(int moveid, int killid, int x, int y); bool canMoveBing(int moveid, int x, int y); int getStoneCount(int xo, int yo, int x, int y);
要实现象棋的运动,首先要确定选中的目标,再其次确定选中的位置,再确定选择的位置是否有对方棋子
[code]void SceneGame::setSelectId(int id) { if(id==-1) { return; } if(_s[id]->getRed()!=_redTrun) return; _selectid=id; _selectSprite->setVisible(true); _selectSprite->setPosition(_s[_selectid]->getPosition()); }
void SceneGame::moveStone(int moveid, int killid, int x, int y)
{
if(killid != -1&&_s[moveid]->getRed()==_s[killid]->getRed())
{
setSelectId(killid);
return;
}
[code] bool bCanMove = canMove(moveid, killid, x, y); if(bCanMove == false) return; //set step Step* step = Step::create(moveid, killid, _s[moveid]->getX(),_s[moveid]->getY(), x, y); _steps->addObject(step); _s[moveid]->setX(x); _s[moveid]->setY(y); //_s[moveid]->setPosition(getStonePos(x,y)); CCMoveTo *moveto=CCMoveTo::create(.5f,getStonePos(x,y)); CCCallFuncND *call=CCCallFuncND::create(this,callfuncND_selector(SceneGame::moveComplete),(void*)(intptr_t)killid); CCSequence *sequence=CCSequence::create(moveto,call,NULL); _s[moveid]->setZOrder(_s[moveid]->getZOrder()+1); _s[moveid]->runAction(sequence); //_selectid=-1; //_selectSprite->setVisible(false); //_redTrun=!_redTrun; }
不同的棋子运动规则不同,车,马,炮等都有不同的运动方式
总函数bool SceneGame::canMove(int moveid, int killid, int x, int y)
{
Stone *s=_s[moveid];
switch(s->getType())
{
case Stone::JIANG:
return canMoveJiang(moveid, killid, x, y);
[code] case Stone::SHI: return canMoveShi(moveid, x, y); case Stone::XIANG: return canMoveXiang(moveid, x, y); case Stone::CHE: return canMoveChe(moveid, x, y); case Stone::MA: return canMoveMa(moveid, x, y); case Stone::PAO: return canMovePao(moveid, killid, x, y); case Stone::BING: return canMoveBing(moveid, x, y); } return false; }
将的移动
bool SceneGame::canMoveJiang(int moveid, int killid, int x, int y)
{
[code] if(killid!=-1) { Stone* skill = _s[killid]; if(skill->getType() == Stone::JIANG) { return canMoveChe(moveid, x, y); } } //can only walk one step and can not walk out the lattic also can kill the king Stone *s=_s[moveid]; int xo=s->getX(); int yo=s->getY(); int xoff=abs(xo-x); int yoff=abs(yo-y); int d = xoff*10 + yoff; if(d != 1 && d != 10) return false; if(x<3||x>5) return false; if(_redSide==s->getRed()) { if(y<0||y>2) return false; }else { if(y < 7 || y > 9) return false; } return true; }
士的移动
bool SceneGame::canMoveShi(int moveid, int x, int y)
{
Stone *s=_s[moveid];
int xo=s->getX();
int yo=s->getY();
int xoff=abs(xo-x);
int yoff=abs(yo-y);
int d = xoff*10 + yoff;
if(d != 11) return false;
[code] if(x<3||x>5) return false; if(_redSide==s->getRed()) { if(y<0||y>2) return false; }else { if(y < 7 || y > 9) return false; } return true; }
相的移动
bool SceneGame::canMoveXiang(int moveid, int x, int y)
{
Stone *s=_s[moveid];
int xo=s->getX();
int yo=s->getY();
int xoff=abs(xo-x);
int yoff=abs(yo-y);
int d = xoff*10 + yoff;
if(d != 22) return false;
[code] int xm=(xo+x)/2; int ym=(yo+y)/2; int id=getStone(xm,ym); if(id!=-1) { return false; } if(_redSide == s->getRed()) { if(y>4) return false; } else { if(y<5) return false; } return true; } 车的移动 bool SceneGame::canMoveChe(int moveid, int x, int y) { Stone *s=_s[moveid]; int xo=s->getX(); int yo=s->getY(); if(getStoneCount(xo,yo,x,y)!=0) return false; return true; } bool SceneGame::canMoveMa(int moveid, int x, int y) { Stone* s = _s[moveid]; int xo = s->getX(); int yo = s->getY(); int xoff = abs(xo-x); int yoff = abs(yo-y); int d = xoff*10 + yoff; if(d != 12 && d != 21) return false; int xm,ym; if(d==12) { xm=xo; ym=(yo+y)/2; }else { xm=(xo+x)/2; ym=yo; } if(getStone(xm,ym)!=-1) return false; return true; }
炮的移动
bool SceneGame::canMovePao(int moveid, int killid, int x, int y)
{
Stone* s = _s[moveid];
int xo = s->getX();
int yo = s->getY();
[code] if(killid != -1 && this->getStoneCount(xo, yo, x, y) == 1) { return true; } else if(killid==-1) { return canMoveChe(moveid,x,y); } return false; } 兵的移动 bool SceneGame::canMoveBing(int moveid, int x, int y) { Stone* s = _s[moveid]; int xo = s->getX(); int yo = s->getY(); int xoff = abs(xo-x); int yoff = abs(yo-y); int d = xoff*10 + yoff; if(d != 1 && d != 10) return false; if(_redSide==s->getRed()) { if(y<yo) return false; if(yo<=4&&y==yo) return false; }else { if(y>yo) return false; if(yo>=5&&y==yo) return false; } return true; }
相关文章推荐
- spine3.0导出文件转换成cocos3.8可使用文件工具
- Cocos2dx实现象棋之布局
- cocos2d-实现读取.plist文件(使用数组CCArray)
- cocos2dx 3.0调用点击事件
- cocos2dx 重载node绘制基本图形
- cocos2dx 3.0设置精灵高亮效果
- 我所理解cocos2d-x 3.6 lua --使用Cocos Studio
- cocos 入门三部曲
- cocos2dx 常见的49中动作详解
- cocos js 实现 滚动字幕 且自动根据文本的宽度稳定滚动速率
- Cocos2.2.3在线下载——sd卡容量判定
- cocos create 系列 【一】 初识cocos creator
- quick-cocos2d-x学习笔记—定时器
- quick cocos 的scheduler 定时器
- Android Studio上首次使用cocos2d-android出现Duplicate files copied in APK assets/fps_images.png
- cocos2dx给DrawNode的shader传递Texture2D
- cocos2dx实现经典飞机大战
- cocos2d-x lua 3.6 解析json
- cocos2dx-js3.9 手动绑定JS到C++
- Cocos2.2.3文件夹的创建与递归删除