cocos2dx,走四棋.求移动棋子的原理
@王选易 你好,想跟你请教个问题:
你的这个项目.http://my.oschina.net/wangxuanyihaha/blog/265649
//移动棋子,src为当前点,dest为要移动到的点 void ChessboardController::tryMove(const CCPoint& src, const CCPoint& dest){ if (dest.equals(src))//如果两个点是一样的就不用移动了 return; CCLOG("try move : dest-src(x:%f,y:%f) . (dest-src).getLength() (%f)",(dest - src).x,(dest-src).y,(dest-src).getLength()); CCLOG("(dest - src) / (dest - src).getLength() x:%f,y:%f",((dest - src) / (dest - src).getLength()).x,((dest - src) / (dest - src).getLength()).y); CCPoint newDest = (dest - src) / (dest - src).getLength() + src; CCLOG("newDest : x:%f,y:%f",newDest.x,newDest.y); Move move(chessboard->getCurrentMove().currentRound,src, newDest);//谁移动的,开始位置,结束位置 if(chessboard->checkMessage(BEGIN_MOVE_MSG) && chessboard->checkMove(move)){ chessboard->alterMove(move); } }
CCPoint newDest = (dest - src) / (dest - src).getLength() + src;
这一行求解释,我只是理解这里是求出了斜边,然后拿要移动的点的x(邻边),y(对边),求出sin,cos,然后加上原始点.
但是为什么这么做就可以,或者说这样做是个什么原理?为什么要这样做,有没什么数学公式?
例如我的开始点是1,0. ccTouchMoved时点在1,2.
这是怎么个数学原理就到了 1,1
log :
Cocos2d: try move : dest-src(x:0.000000,y:2.000000) . (dest-src).getLength() (2.000000) Cocos2d: (dest - src) / (dest - src).getLength() x:0.000000,y:1.000000 Cocos2d: newDest : x:1.000000,y:1.000000
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我想我大致应该理解了,因为移动的系数为1.
那么sin,cos永远只能在-1,1之间波形运动.
是的,我在做的过程中遇到这个问题了。
如果出现移动的Move为(1,1)时,我返回的newDest是(1,1)/ 根号2. 我会在checkMove这个函数中把它否决掉,具体可以看我的checkMove中的实现。
在ChessboardChecker.cpp中,你会看到checkMove函数中有一个判断是move.dest.x - (floor)(move.dest.x) == 0 就是在判断你说的这种情况