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 ...
随机推荐
- 异步http框架简介&实现原理
1 )说明: Android开源代码:www.github.com 模拟一个异步http请求说明
- jquery------添加jQuery对象方法
my.js $(document).ready(function(){ (function($){ $.fn.swapClass=function(class1,class2){ if(this.ha ...
- yum被锁Another app is currently holding the yum lock; waiting for it to exit...
可能是系统自动升级正在运行,yum在锁定状态中. 可以通过强制关掉yum进程: #rm -f /var/run/yum.pid 然后就可以使用yum了.
- Python socket编程之二:【struct.pack】&【struct.unpack】
import struct """通过 socket 的 send 和 recv 只能传输 str 格式的数据""" "" ...
- shell的内建命令和外部命令
shell的内建命令和外部命令 Shell执行的命令可以分为内建命令(built-in)和外部命令(external),前者是构建在shell内部:后者是一个独立的文件(可以是二进制文件,也可以是一个 ...
- Js日期选择器并自动加入到输入框中
<html> <head> <title>Js日期选择器并自动加入到输入框中</title> <meta http-equiv="con ...
- mysql更新一个表里的字段等于另一个表某字段的值
update a left join c on a.id = c.id set a.body = c.c1 where a.id=c.id; update zcat as z left join zc ...
- UVALive 6125 I’ve Got Your Back(gammon) 题解
http://vjudge.net/problem/viewProblem.action?id=37481 East Central Regional Contest Problem D: I’ve ...
- Math.Round函数详解
有不少人误将Math.Round函数当作四舍五入函数在处理, 结果往往不正确, 实际上Math.Round采用的是国际通行的是 Banker 舍入法. Banker's rounding(银行家舍入) ...
- Unity 3D学习之 Prime31 Game Center插件用法
http://momowing.diandian.com/post/2012-11-08/40041806328 It's my life~: 为app 连入Game Center 功能而困扰的朋友们 ...