2014-05-16 86 views
0

我使用monogame框架開發遊戲。 遊戲本身的代碼是從XNA代碼轉換而來的,我以前編碼過。 我開發800 * 480分辨率的遊戲資產(背景等)。問題出現時,我嘗試在不同的設備分辨率(模擬器720p)中運行它。 如何調整它實際上?根據設備分辨率調整屏幕大小Monogame Windows Phone 8

我已經添加此代碼,但沒有發生

public Game1() 
{ 
_graphics = new GraphicsDeviceManager(this); 
this.Windows.ClientSizeChanged += Window_ClientSizeChanged; 
} 

void Window_ClientSizeChanged(object sender, EventArgs e) 
{ 
int currentWidth = this.Window.ClientBounds.Width; 
int currentHeight = this.Windows.ClientBounds.Height; 
} 

代碼只返回兩個currentWidth和currentHeight 0值;

我也遵循這一代碼

this.Window.ClientSizeChanged += new EventHandler<EventArgs>(Window_ClientSizeChanged); 

void Window_ClientSizeChanged(object sender, EventArgs e) 
{ 
graphics.PreferredBackBufferWidth = Window.ClientBounds.Width; 
graphics.PreferredBackBufferHeight = Window.ClientBounds.Height; 
graphics.ApplyChanges(); 
} 

但它也有類似的結果。調整大小沒有任何發生。 請給我一個解決這個問題的方法。因爲我的遊戲只能以480 * 800分辨率運行。在其他分辨率下,它會顯示一些空間。

以前感謝。

回答

0

我是如何處理我的遊戲的,我認爲這是一個簡單的解決方案。

您需要兩件事:設計尺寸和設備尺寸。聽起來像你編碼爲800 * 480,所以這些都是你的設計尺寸。

所以你需要先獲得實際的設備寬度和高度。我在App.xaml.cs中執行此操作,因爲如果您想將代碼重新用於其他平臺(我們已經完成),則需要執行其特定方式來獲取屏幕尺寸。

所以在App.xaml.cs你可以這樣做:

private void Application_Launching(object sender, LaunchingEventArgs e) 
    { 
     // Get device viewport. 
     double scaleFactor = (double)App.Current.Host.Content.ScaleFactor/100f; 
     double width = App.Current.Host.Content.ActualWidth * scaleFactor; 
     double height = App.Current.Host.Content.ActualHeight * scaleFactor; 

     ResolutionSystem.SetResolutionAndScale((float)width, (float)height); 
    } 

現在你正在做的是獲得設備的比例因子(1.0爲800 * 480的WP8)。然後獲得ActualWidth和ActualHeight(始終爲800和480),然後乘以縮放因子。所以你現在有了你的設備尺寸,而且你沒有連接到遊戲邏輯本身(除非你的邏輯需要基於中間遊戲風格到縱向切換的可能性)。

那麼我們要做的就是設置遊戲的縮放矩陣。由於着色器和用戶界面的原因,我需要做很多與縮放和渲染目標有關的其他工作,但我會保持簡單。本質上,你現在想要爲你的遊戲玩法開發一個你的精靈批處理的縮放矩陣。這意味着您可以在所需的設計視口範圍內做所有事情,然後在事實之後將其縮放到所需的大小(如果可以的話,您可能需要考慮重新設置資源以獲得像WXGA或1080p這樣的更高分辨率)。

所以,讓我們的規模矩陣在我們ResolutionSystem.cs類我們稱之爲:

public static void SetResolutionAndScale(float deviceWidth, float deviceHeight) 
    { 

     ScaleMatrix = Matrix.CreateScale(DeviceWidth/DesignWidth, 
             DeviceHeight/DesignHeight, 
             1f); 
    } 

此功能爲我們做了很多,但我修剪這一切了。所以你現在應該有一個縮放矩陣供你存儲,不過你想要。

現在在您可以用多種方式完成的繪圖調用中,您可以簡單地將該縮放矩陣包含爲SpriteBatch.Begin調用中的Matrix transformMatrix參數。

因此,像這樣:

spriteBatch.Begin(SpriteSortMode.FrontToBack, null, null, null, null, null, ResolutionSystem.ScaleMatrix); 

而且你現在應該有一些作品。您可以在Windows Phone商店查看我的遊戲SkyFehl並進行測試。它與1280 * 768的設計參數一起使用。使用這種方法移植到iOS是相對容易的(我不會在它皺起眉頭時將它鏈接起來)。希望我做了某種形式的感覺。

相關問題