cocos2dx实现象棋之运动
1、头文件
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);
要实现象棋的运动,首先要确定选中的目标,再其次确定选中的位置,再确定选择的位置是否有对方棋子
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;
}
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);
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)
{
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;
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;
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();
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;
}
cocos2dx实现象棋之运动的更多相关文章
- Cocos2d-x加速度计实例:运动的小球
下面我们通过一个实例介绍一下如果通过层加速度计事件实现访问加速度计.该实例场景如下图所示,场景中有一个小球,当我们把移动设备水平放置,屏幕向上,然后左右晃动移动设备来改变小球的位置. 下面我们再看看具 ...
- Cocos2d-X中国象棋的发展《五岁以下儿童》摆棋
在博客上,以实现创建的游戏场景.而一些button,因为button落实到事件作出详细答复,需要使用一些功能摆棋.为此我特意button上的背面的具体实施, 在摆棋前先理清一下摆棋的思路: 1.创建一 ...
- Cocos2dx实现象棋之布局
开始界面 #ifndef SCENESTART_H #define SCENESTART_H #include "cocos2d.h" #include "SceneGa ...
- 关于Cocos2d-x中让主角运动的方法
比如要让角色跳起来 1.如果是用到物理引擎,那么在物理世界中,可以用 hero->getPhysicsBody()->setVelocity(Vec2(0, 400)); //给主角一个 ...
- Cocos2d-x中由sprite来驱动Box2D的body运动(用来制作平台游戏中多变的机关)
好久都没写文章了,就来一篇吧.这种方法是在制作<胖鸟大冒险>时用到的.<胖鸟大冒险>中使用Box2D来进行物理模拟和碰撞检測,因此对每一个机关须要创建一个b2body.然后&l ...
- cocos2dx 运动+旋转动画 CCSequence CCAnimation CCAnimate CCMoveTo CCCallFuncN
cocos2dx 动画是个非常奇妙的东西~~. 这里看到的是一个物体,在运动的过程中会不断地翻转的过程. 两个动画一起来~~ 以下的代码中涉及到:CCAnimation(补间动画 ) CCAnima ...
- cocos2d-x游戏开发系列教程-中国象棋06-游戏规则
前情回顾 上一个博文我们提到象棋运动的函数dealWithChess,但是只是说该函数完成了棋子的选择和移动功能 其实在这个函数里,在移动棋子之前,是要对棋子的移动是否合法进行判断的,我们一起来看看如 ...
- cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面
之前两个博客讲述了象棋的规格和工程文件之后,我们继续深入的从代码开始学习cocos2dx 首先从程序入口main函数开始 main函数 int APIENTRY _tWinMain(HINSTANCE ...
- cocos2d-x游戏开发系列教程-中国象棋01-工程文件概述
上一篇博文我们看到了象棋的效果图,这一张我们来看象棋代码的整体概述 让我们先对整个代码框架有个了解. 主目录: 主目录包含内容如上图: classes目录:业务代码 proj.win32:包括main ...
随机推荐
- groovy-实现接口
Groovy提供了一些非常方便的方法来实现接口 使用闭包实现接口 只有一个方法的接口可以使用闭包来实现,例如 1 // a readable puts chars into a CharBuffer ...
- LeetCode 65 Valid Number
(在队友怂恿下写了LeetCode上的一个水题) 传送门 Validate if a given string is numeric. Some examples: "0" =&g ...
- Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 Android启动模式Flags栈Task 目录(?)[+] 什么是栈 栈 ...
- ubuntu自动关闭屏幕显示器
在程序中系统调用如下两个命令,可以关闭显示器. 1,xset dpms force off 2,system("vbetool dpms off"); 因为应用要在ubuntu开机 ...
- org.springframework.orm.hibernate3.LocalSessionFactoryBean的疑惑解决办法
在项目中使用了SSH框架(Struts2 + Spring3+ Hibernate3),applicationContext中配置了sessionFactory <bean id="s ...
- Ubuntu学习总结-03 安装软件 & 技巧
1 UBuntu 安装 Googole Chrome 首先下载软件 wget https://dl.google.com/linux/direct/google-chrome-stable_curre ...
- IOS基础之 (二) 面向对象思想
编写Objective-C程序时,要使用Foundation框架. 什么是框架? 框架(framework)是由很多类(class)组成的库,可以用来编写程序. 对象(Object) 对象可以保存数据 ...
- ExtJS入门教程05,grid的异步加载数据
上一篇演示了extjs grid的基本用法,并加载了本地数据.今天我们将演示如何加载异步数据. 所谓异步,就是通过ajax的方式将服务器端的数据加载到我们的grid中.为了提供数据,我们先定义一个数据 ...
- .NET平台上的Memcached客户端介绍
早上接到一个任务,需要对Linux服务器的Memcached的update操作进行性能测试,我发现我是一个典型的“手里拿着锤子, 就把所有问题都当成钉子”的人.我第一个念头就是,上Memcached的 ...
- 百度编辑器Ueditor 初始化加载内容失败解决办法
项目上有用到百度文本编辑器ueditor,在页面加载的时候初始化编辑器内容时候,使用 $.document.ready(function() { UE.getEditor('editor').setC ...