围绕另一个 Sprite 旋转一个 Sprite -libGDX-

Posted

技术标签:

【中文标题】围绕另一个 Sprite 旋转一个 Sprite -libGDX-【英文标题】:Rotate a Sprite around another Sprite -libGDX- 【发布时间】:2015-07-23 07:19:31 【问题描述】:

video game link

我正在尝试制作游戏(请参阅上面的链接),我需要让摇杆围绕自己旋转以保持朝向圆心的方向。

这就是我声明 Sprite 的方式,以及我如何围绕圆圈移动它:

声明:

    line = new Sprite(new Texture(Gdx.files.internal("drawable/blockLine.png")));
    line.setSize(140, 20);
    lineX = Gdx.graphics.getWidth()/2 - line.getWidth()/2;
    lineY = (Gdx.graphics.getHeight()/2 - line.getHeight()/2) + circle.getHeight()/2;

运动:

     Point point = rotatePoint(new Point(lineX, lineY), new Point(Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2), angle+= Gdx.graphics.getDeltaTime() * lineSpeed);
     line.setPosition(point.x, point.y);

rotatePoint 函数:

    Point rotatePoint(Point point, Point center, double angle)

    angle = (angle ) * (Math.PI/180); // Convert to radians

    float rotatedX = (int) (Math.cos(angle) * (point.x - center.x) - Math.sin(angle) * (point.y-center.y) + center.x);

    float rotatedY = (int) (Math.sin(angle) * (point.x - center.x) + Math.cos(angle) * (point.y - center.y) + center.y);

    return new Point(rotatedX,rotatedY);


有什么建议吗?

【问题讨论】:

【参考方案1】:

我现在无法测试,但我认为线条的旋转应该是:

Math.atan2(rotatedPoint.getOriginX() - middlePoint.getOriginX(), rotatedPoint.getOriginY() - middlePoint.getOriginY()));

然后您必须将弧度调整为度数或您将使用的任何值。如果它不起作用,请告诉我!

【讨论】:

我是这样用的,line.setRotation((float) Math.atan2(point.x - Gdx.graphics.getWidth()/2, point.y - Gdx.graphics.getHeight()/2)) 但它不起作用 嗯,正如我所说,不幸的是,我现在无法测试,我制作了一个游戏,其中我有这种围绕被击物体旋转的盾牌效果,与你想要实现的非常相似,我使用此代码:shieldEffect.setRadiansToImpact((float) Math.atan2(shieldEffect.getX() - this.getOriginX(), shieldEffect.getY() - this.getOriginY())); shieldEffect.setRotation((float) (shieldEffect.getRadiansToImpact() * -180 / Math.PI)-45); 硬编码的 -45 只是由于我如何绘制纹理。 shieldEffect.setRotation((float) (shieldEffect.getRadiansToImpact() * -180 / Math.PI)-45) 是围绕 object2 旋转 object1 还是围绕其自身旋转 object1 ? 在我的情况下,这会旋转盾牌效果以面对被击中的对象(中间),在您的情况下,它将是旋转线以面对中点 我不认为它与我正在寻找的相同。我需要一个数学公式之类的东西来让棍子保持在圆圈的边缘,不知何故..【参考方案2】:

我会采用不同的方法,我刚刚创建了一个方法,可以在屏幕上的单击周围放置 n 个按钮。我正在使用看起来像这样的东西:

float rotation; // in degree's
float distance; //Distance from origin (radius of circle).
vector2 originOfRotation; //Center of circle
vector2 originOfSprite; //Origin of rotation sprite we are calculating
Vector2 direction = new vector2(0, 1); //pointing up

//rotate the direction
direction.rotate(rotation);
// add distance based of the direction. Warning: originOfRotation will change because of chaining method.
// use originOfRotation.cpy() if you do not want to init each frame
originOfSprite = originOfRotation.add(direction.scl(distance));

现在你有了你的精灵的位置。您需要将 rotation 每帧增加 x 以使其旋转。如果你想改变精灵的方向,你可以使用方向向量,可能再次旋转 180。效率方面我不确定会有什么不同。

【讨论】:

以上是关于围绕另一个 Sprite 旋转一个 Sprite -libGDX-的主要内容,如果未能解决你的问题,请参考以下文章

如何根据平移手势速度向 Sprite Kit 节点应用角脉冲

GL_POINT_SPRITE_ARB(广告牌)旋转时的照明问题

iOS 7 Sprite Kit 更改 SKAction 中的 zPosition

Cocos2dx 如何实现对背景进行模糊处理以达到突出某一个Sprite?

WebGL之点精灵的旋转(Rotation Sprite)

将 Sprite 对象数组合并为一个 Sprite - Unity