【问题标题】:rotate sprite in CubicBezierCurveMoveModifier在三次贝塞尔曲线移动修改器中旋转精灵
【发布时间】:2014-04-28 11:20:01
【问题描述】:

我可以在移动时使用路径修改器以正确的角度旋转我的精灵。为了实现这一点,我在 IPathModifierListener 的 onPathWaypointStarted() 方法中使用了 setRotation()。

PathModifier aModifier = new PathModifier(finishTime, aPath,
            new IPathModifierListener() {
                @Override
                public void onPathWaypointStarted(
                        PathModifier pPathModifier, IEntity pEntity,
                        int pWaypointIndex) {

                    switch (pWaypointIndex) {
                    case 0:

                        setRotation(270 + getAngle(xCur1, xCur2, x1, x2));

                        break;
                    case 1:
                        setRotation(270 + getAngle(x1, x2, x3, x4));

                        break;
                    case 2:
                        setRotation(270 + getAngle(x3, x4, x5, x6));

                        break;
                    case 3:

                        setRotation(270 + getAngle(x5, x6, x7, x8));
                        break;
                    case 4:
                        setRotation(270 + getAngle(x7, x8, x9, x10));

                        break;

                    case 5:
                        setRotation(270 + getAngle(x9, x10, x11, x12));
                        break;

                    case 6:
                        setRotation(270 + getAngle(x11, x12, x13, x14));
                        break;

                    default:
                        break;
                    }

                }

                @Override
                public void onPathWaypointFinished(
                        PathModifier pPathModifier, IEntity pEntity,
                        int pWaypointIndex) {
                }

                @Override
                public void onPathStarted(PathModifier pPathModifier,
                        IEntity pEntity) {
                }

                @Override
                public void onPathFinished(
                        final PathModifier pPathModifier,
                        final IEntity pEntity) {

                    ResourcesManager.getActivity().runOnUpdateThread(
                            new Runnable() {
                                @Override
                                public void run() {

                                    unregisterEntityModifier(pPathModifier);

                                }
                            });

                }
            });

我的 getAngle 在下面

    private synchronized float getAngle(float startx, float starty,
        float targetx, float targety) {

    double angle1 = Math.atan2(targety - starty, targetx - startx);
    float angle = (float) Math.toDegrees(angle1);
    // Log.e("getAngle", "getAngle" + angle);
    return angle;
}

但是当我想使用 CubicBezierCurveMoveModifier 平滑移动 wuite 时,我找不到任何像 IPathModifierListener 这样的监听器。所以我不能以正确的角度旋转精灵。

任何想法。

我的对象:

【问题讨论】:

  • 无法解决问题。有人来帮忙吗?

标签: android andengine


【解决方案1】:

我知道我迟到了,可能已经找到了解决方案,但我只是遇到了这个问题并提出了这个问题。

我看不出有什么理由不能将它用于其他移动修饰符,但这是我为 Andengine GLES2 中的 CubicBezierCurveMoveModifier 所做的。

它所做的只是在更新之前捕获旧的x,y 坐标,然后根据新的x,y 计算角度。

我添加了一个 rotationOffset 参数,因为我正在使用的精灵图像偏离了 90 度。本来以为 0 度是精灵的顶部,但要么我的数学非常错误,要么 0 度是图像的右侧

import org.andengine.entity.IEntity;
import org.andengine.entity.modifier.CubicBezierCurveMoveModifier;
import org.andengine.util.math.MathUtils;
import org.andengine.util.modifier.ease.IEaseFunction;

public class CubicBezierCurveWithRotationModifier extends CubicBezierCurveMoveModifier {

    float rotationOffset = 0f;

    public CubicBezierCurveWithRotationModifier(float rotationOffset, float pDuration, float pX1, float pY1, float pX2, float pY2, float pX3, float pY3, float pX4, float pY4) {
        super(pDuration, pX1, pY1, pX2, pY2, pX3, pY3, pX4, pY4);
        this.rotationOffset = rotationOffset;
    }

    public CubicBezierCurveWithRotationModifier(float rotationOffset, float pDuration, float pX1, float pY1, float pX2, float pY2, float pX3, float pY3, float pX4, float pY4, IEaseFunction pEaseFunction) {
        super(pDuration, pX1, pY1, pX2, pY2, pX3, pY3, pX4, pY4, pEaseFunction);
        this.rotationOffset = rotationOffset;
    }

    public CubicBezierCurveWithRotationModifier(float rotationOffset, float pDuration, float pX1, float pY1, float pX2, float pY2, float pX3, float pY3, float pX4, float pY4, IEntityModifierListener pEntityModifierListener) {
        super(pDuration, pX1, pY1, pX2, pY2, pX3, pY3, pX4, pY4, pEntityModifierListener);
        this.rotationOffset = rotationOffset;
    }

    public CubicBezierCurveWithRotationModifier(float rotationOffset, float pDuration, float pX1, float pY1, float pX2, float pY2, float pX3, float pY3, float pX4, float pY4, IEntityModifierListener pEntityModifierListener, IEaseFunction pEaseFunction) {
        super(pDuration, pX1, pY1, pX2, pY2, pX3, pY3, pX4, pY4, pEntityModifierListener, pEaseFunction);
        this.rotationOffset = rotationOffset;
    }

    @Override
    protected void onManagedUpdate(float pSecondsElapsed, IEntity pEntity) {
        float oldX = pEntity.getX();
        float oldY = pEntity.getY();

        super.onManagedUpdate(pSecondsElapsed, pEntity);

        float deltaX = pEntity.getX() - oldX;
        float deltaY = pEntity.getY() - oldY;

        float degree = (float) Math.atan2(deltaY, deltaX);

        pEntity.setRotation(rotationOffset + MathUtils.radToDeg(degree));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 2012-07-27
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多