繁体   English   中英

使用RotationModifier的引擎肖像失真

[英]AndEngine portrait distortion with RotationModifier

我正在使用AndEngine尝试创建一个不断旋转360度的球的简单精灵。 旋转工作正常。 但是,只有在纵向模式下,球的图像才会失真。

肖像:

在此处输入图片说明

景观:

在此处输入图片说明

您会注意到在“纵向”模式下,球似乎如何向上伸展。 我不确定是什么原因造成的。 我只希望球保持完美的圆形。

万一有人问..球图像是完美的圆形,是200px x 200px。

这是我的代码:

Ball = new Sprite(100, 100, 200, 200, this.BallRegion);

LoopEntityModifier EntityModifier = 
             new LoopEntityModifier(new RotationModifier(10, 0, 360));          
Ball.registerEntityModifier(EntityModifier);

scene.attachChild(Ball);

我的解决政策:

    this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
    return new org.anddev.andengine.engine.Engine(new EngineOptions(true,
            null, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),
            this.mCamera));

我采取了上述解决方案并对其进行了改进:

创建相机时,请执行以下操作:

Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);

camera.setResizeOnSurfaceSizeChanged(true);
camera.setCenter( 0.5f * CAMERA_WIDTH
                , 0.5f * CAMERA_HEIGHT);

然后重写onConfigurationChanged(Configuration newConfig)

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            getEngine().getCamera().setRotation(0);
        }
        else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            getEngine().getCamera().setRotation(90f);
        }
    }

同样在这种情况下,如果您在墙纸中使用加速度计,则应更正来自加速度计的数据:

 @Override
 public void onAccelerationChanged(final AccelerationData pAccelerationData) {
     boolean isCameraRotated = getEngine().getCamera().isRotated();

        float correctAccelerationX = isCameraRotated ? pAccelerationData.getY() 
                                                     : pAccelerationData.getX();
        float correctAccelerationY = isCameraRotated ? pAccelerationData.getX() 
                                                     : pAccelerationData.getY() * -1;
  }

我自己想通了。 要使用AndEngine中的动态壁纸处理方向更改,可以使用以下代码:

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        scene.setScale(1);
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        scene.setScaleX(480.0f / 720.0f);
        scene.setScaleY(1.0f);
    }

            //Rebuilds the scene. onLoadScene() calls to this method.
    BuildScene();

}

您可能需要根据您的解决方案策略更改值,但这对我来说效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM