2015-07-29 2 views
0

Я разрабатываю игру для Windows и Windows Phone 8.1. Игра проходит в 800х480, который установлен в игре конструктор класса:MonoGame 3.4 Windows Phone 8.1 - визуализация рендеринга под виртуальными кнопками hw

graphics = new GraphicsDeviceManager(this); 
graphics.PreferredBackBufferHeight = 480; 
graphics.PreferredBackBufferWidth = 800; 

работает как шарм на PC, hovewer, когда я запускаю игру на Nokia 630 с виртуальными кнопками и фактическим разрешением 854x480, в viewport отображается под виртуальными кнопками.

Если я пытаюсь получить фактическое разрешение от spriteBatch или graphics или непосредственно в GraphicsDevice классе, я всегда получаю 800x480, в то время как это очевидно, что реальное разрешение больше (в то время как на ПК я могу выяснить дисплей находится в 1920x1080).

Просто чтобы прояснить, я в настоящее время есть очень простой метод Draw, без каких-либо других изменений разрешения или видовых бы то ни было:

GraphicsDevice.Clear(oc.colBack); 
spriteBatch.Begin(); 
foreach (Mob mobUnit in oc.mob) { 
    spriteBatch.Draw(sprSquare, mobUnit.position, origin: mobUnit.size/2, color: oc.colMob * 0.8f); 
} 
spriteBatch.End(); 
base.Draw(gameTime); 

Любые идеи, как решить эту проблему? Спасибо.

PS: Строка состояния НЕ показывает и не «толкает» видовое окно в сторону.

+0

Это может быть связано с этой ошибкой я сообщил недавно https://github.com/mono/MonoGame/issues/4018 – craftworkgames

+0

«о поведении ошибка очень затрудняет достижение независимости разрешения Letterboxing/pillarboxing, насколько я могу сказать, что версия DX определенно нарушена ». oh .. Да, я использую версию DX, я также попробовал вашу библиотеку Monogame.Extended - без какого-либо полезного эффекта. Поэтому я предполагаю, что мне придется ждать патча или что-то в этом роде. Если кто-то не приходит с обходным путем - например, масштабируя область просмотра прямо до кнопок, для чего мне нужно знать, есть ли они там и их размер (который не 54px, так как он находится в растянутом 800px ...). Спасибо :) – NoHarmDan

+0

Да, правильно, я не мог найти способ реализовать версию DX. Хотя реальная проблема заключается в том, что это не имеет значения, monogame должен вести себя одинаково на всех платформах. Я уверен, что они исправит его в следующей версии, возможно, в вашем случае есть какое-то обходное решение. Надеюсь, – craftworkgames

ответ

0

После некоторых интенсивных исследований и вычислений я придумал довольно проблематичное решение. В Initialize метода:

matScale = Matrix.CreateScale(1f, 1f, 1f); 

if (Window.ClientBounds.Width < Window.ClientBounds.Height) { 
     var dpiY = Windows.Graphics.Display.DisplayInformation.GetForCurrentView().RawDpiY; 
     var dpiX = Windows.Graphics.Display.DisplayInformation.GetForCurrentView().RawDpiX; 
     if (dpiY < dpiX - 1) { 
      matScale = Matrix.CreateScale(.937f,1f,1f); 
     } 
} 

DpiX - 1 потому, что я на самом деле есть разница 1px между ПИ на ПК - хотя компьютеры не должны очистить первый, если заявление. .937f - это процент 800px минус размер виртуальных кнопок, что составляет около 50 пикселей. (54px Это когда размер экрана 854px, так что делает примерно 6,323% экрана.)

И, конечно же, в Draw:

spriteBatch.Begin(transformMatrix: matScale); 

Это работает. Я оставлю этот вопрос открытым, хотя, я считаю, что это неправильный способ сделать это. Если только все документированные методы ApplicationView фактически были там ...