如何获得支持方向=“肖像”的手机方向

时间:2014-01-27 07:53:47

标签: windows-phone-8 monogame

我使用MonoGame库编写了一个简单的游戏。据我所知,MonoGame(与XNA不同)不会自动支持更改手机的方向,因此必须使用RenderTarget2D然后以正确的方向绘制它。为此,我需要检测手机的当前方向。

为了获得OrientationChanged事件,我必须允许GamePage.xaml使用不同的方向:

SupportedOrientations="PortraitOrLandscape" Orientation="Portrait"

问题在于,在这种情况下,我的GamePage会自动开始更改方向,并且在横向位置,精灵会水平拉伸。看起来在风景位置手机认为它在水平方向上具有与在纵向方向上相同的像素数(480像素)。

enter image description here enter image description here

无需任何手动旋转即可实现此效果。绘图代码是:

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin();
    spriteBatch.Draw(t, Vector2.Zero, null, Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 1);
    spriteBatch.End();

    base.Draw(gameTime);
}

其中一个解决方案是在GamePage.xaml中禁止不同的方向:

SupportedOrientations="Portrait" Orientation="Portrait"

但是在这种情况下我无法获得OrientationChanged事件(GamePage.OrientationChanged或Game.Window.OrientationChanged)。我将以下代码放在Game类的构造函数中,但它没有帮助

graphics.SupportedOrientations = DisplayOrientation.Portrait |
                                 DisplayOrientation.PortraitDown |
                                 DisplayOrientation.LandscapeLeft |
                                 DisplayOrientation.LandscapeRight;

graphics.ApplyChanges();
this.Window.OrientationChanged += OrientationChanged;

请告诉我如何获取OrientationChanged事件,同时不允许GamePage在横向模式下更改其坐标轴。

1 个答案:

答案 0 :(得分:2)

感谢您的回复:)

我发明的解决方案是修复页面方向:

SupportedOrientations="Portrait" Orientation="Portrait"

并使用加速度计来获得手机的实际位置:

public class Game1 : Game
{
    Accelerometer accelSensor;
    PageOrientation currentOrientation = PageOrientation.None;
    PageOrientation desiredOrientation = PageOrientation.None;
    ...

    public Game1()
    {
        accelSensor = new Accelerometer();
        accelSensor.ReadingChanged += new EventHandler<AccelerometerReadingEventArgs> AccelerometerReadingChanged);
        ...

    private void AccelerometerReadingChanged(object sender, AccelerometerReadingEventArgs e)
    {
        double angle = Math.Atan2(-e.X, e.Y) * 180.0 / Math.PI;
        double delta = 15;

        if (angle > -45 + delta && angle < 45 - delta) desiredOrientation = PageOrientation.PortraitDown;
        if (angle > 45 + delta && angle < 135 - delta) desiredOrientation = PageOrientation.LandscapeLeft;
        if (angle > -135 + delta && angle < -45 - delta) desiredOrientation = PageOrientation.LandscapeRight;
        if ((angle >= -180 && angle < -135 - delta) || (angle > 135 + delta && angle <= 180)) desiredOrientation = PageOrientation.PortraitUp;
    }

    protected override void Update(GameTime gameTime)
    {
        if (desiredOrientation != currentOrientation) SetOrientation(desiredOrientation);
        ...

如果你知道更好的方法,请告诉我......