2014-01-27 5 views
3

Я пишу простую игру с использованием библиотеки MonoGame. Насколько я знаю, MonoGame (в отличие от XNA) не поддерживает автоматически изменение ориентации телефона, и необходимо использовать RenderTarget2D, а затем нарисуйте его с правильной ориентацией. Для этого мне нужно определить текущую ориентацию телефона.Как получить ориентацию телефона с SupportedOrientations = "Портрет"

Для того, чтобы получить 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 изменить свою ось координат в ландшафтном режиме ,

ответ

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

Если вы знаете лучший способ, пожалуйста, скажите мне ...

Смежные вопросы