cocos2dx,走四棋.求移动棋子的原理

发布于 2021-11-24 00:32:38 字数 1747 浏览 667 评论 2

@王选易 你好,想跟你请教个问题:

你的这个项目.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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无法言说的痛 2021-11-28 19:28:34

我想我大致应该理解了,因为移动的系数为1.

那么sin,cos永远只能在-1,1之间波形运动.

陌若浮生 2021-11-28 09:45:01

是的,我在做的过程中遇到这个问题了。

如果出现移动的Move为(1,1)时,我返回的newDest是(1,1)/ 根号2.  我会在checkMove这个函数中把它否决掉,具体可以看我的checkMove中的实现。

在ChessboardChecker.cpp中,你会看到checkMove函数中有一个判断是move.dest.x - (floor)(move.dest.x) == 0 就是在判断你说的这种情况

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文