怎么样让精灵做圆周运动呢?

如题,我查找了cocos2d-js相关文档,没有找到可以让精灵做圆周运动的方法,不知道各位有人遇到这样的问题没有?怎么解决的呢?
是不是需要自己编写圆周运动的方法?

如果是的话,该怎么样做呢?烦请指点一二。

两种方法

  1. 根据圆的方程x=rcos(a) , y=rsin(a) 改变精灵的坐标就行,角度a用定时器改变

  2. 将精灵放在一个Node中,位置设成(r,0),然后再用Rotate动作旋转Node。这种方式就像月亮绕着地球转一样,始终是同一面朝着圆心

谢谢你的回答,第二个方法似乎更适合我这个游戏,
将精灵放在一个Node中,位置设成(r,0)
如果我把原Sprite的锚点设置成(r,0),是不是会实现跟你说的一样的效果?
公司这边没有测试环境,不然我会自己试一遍:14:

锚点范围只有0.0~1.0

搜噶,忘记了,哈哈,回去试试

http://math.stackexchange.com/questions/384186/calculate-new-positon-of-rectangle-corners-based-on-angle

简化,只要你的圆的position绕着某一个点定时旋转即可。

请问 第二个怎么设置Node围绕旋转的点?
我发现旋转始终是绕着(0,0),即使修改Node的位置和锚点也没用

node的坐标位置就是旋转的圆心。

var node1 = cc.Node.create();
node1.attr({
x: size.width *0.5,
y: size.height *0.5
});
this.addChild(node1, 1);

                                  cc.log("node1:%f, %f", node1.x, node1.y);
                                  
                                  var sprite1 = new cc.Sprite(res.CloseNormal_png);
                                  sprite1.attr({
                                               x: 200,
                                               y: 0
                                  });
                                  node1.addChild(sprite1, 0);
                                  
                                  node1.runAction(
                                                  cc.RepeatForever(cc.RotateBy(4, 360))
                                  );

/**
 * 圆运动
 * @param {Number} duration
 * @param {cc.Node|cc.p} dot 圆心点坐标或者node
 * @param {Number}   半径 如果为负数, 反时钟方向
 * @param {Number}  旋转角度
 * @returns {cc.CardinalSplineTo}
 */
cc.circleBy = function(duration, dot, r, angle){
    var dp = angle || 20, dpr = 360 / dp, ary = ];
    r = r || 20;
    if(r < 0) dpr = -dpr;
    r = Math.abs(r) * dg.scale;

    for(var i = 0; i < dp; i ++){
        ary.push(cc.p(Math.sin(dpr * i * cc.RAD) * r + dot.x, Math.cos(dpr * i * cc.RAD) * r + dot.y));
    }
    ary.push(ary);
    return cc.cardinalSplineTo(duration, ary, 0);
};

var spr = new cc.Sprite("xxx.png");
spr.setPosition(100, 100);
spr.runAction(cc.circleBy(1, spr, -20).repeatForever());

3赞

提示1.node自刷新
提示2.不要使用动画,而要不断的修改node的坐标
提示3.圆周运动,一周的时间、速度、半径之间的公式
提示4.封装

秒啊,加载到node上然后旋转,可怜我当时还自己重载ActionInterval