围绕另一个 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