1

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

肖像:

在此处输入图像描述

景观:

在此处输入图像描述

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

如果有人问.. 球图像是完美的圆形,大小为 200 像素 x 200 像素。

这是我的代码:

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));
4

2 回答 2

1

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

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

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;
  }
于 2013-09-09T12:50:33.937 回答
0

我自己想通了。要在 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();

}

您可能必须根据您的分辨率策略更改值,但这对我来说非常有效。

于 2012-09-16T19:51:56.530 回答