2015-08-30 37 views
0

我決定將我的遊戲從窗口模式移動到全屏模式,這是我面臨的第一個問題。我正在尋找一種基於屏幕分辨率調整我的所有精靈的方法。我的背景現在位於(0, 0)座標中,但我需要將它和所有精靈按某種固定縱橫比(16:9首選)進行縮放。並將它們調整到背景被拉伸以充滿屏幕的那部分。而不是更多,而不是更少。根據分辨率對屏幕上的所有精靈進行縮放

我已經看過一些在線教程,但我真的無法理解他們使用的概念。你能解釋一下你會怎麼做?我使用RenderTarget2D讀取並將它傳遞給spriteBatch.Begin()調用,具有某種效果,但必須有更多的代碼。

我並不是想支持分辨率更改選項,而是將精靈調整爲當前分辨率。

+0

您可以使用'SpriteBatch.Draw(Texture2D,Rectangle,Color)'(或重載)中的矩形將任何紋理調整爲任意大小。其餘的是數學。 – Mephy

+0

你能提供一個例子嗎?我假設你的意思是將'Texture2D.Width' /'。Height'的重載乘以某個東西,如果是的話,是什麼? –

回答

1

聽起來好像你在說resolution independence

總的想法是你的遊戲使用虛擬分辨率和規模向上或向下,以適應屏幕的實際分辨率進行。

var scaleX = (float)ActualWidth/VirtualWidth; 
var scaleY = (float)ActualHeight/VirtualHeight; 
var matrix = Matrix.CreateScale(scaleX, scaleY, 1.0f); 

_spriteBatch.Begin(transformMatrix: matrix); 

例如,如果您的虛擬分辨率是800x480,則只需渲染所有相關的精靈。然後在渲染精靈批處理之前,創建一個轉換矩陣以傳入Begin調用。

您應該知道的另一件事是,您需要反轉縮放鼠標/觸摸輸入座標以在虛擬分辨率中處理它們。在Update方法,你可以擴展反向鼠標的位置是這樣的:

var mouseState = Mouse.GetState(); // you're probably already doing this 
var mousePosition = new Vector2(mouseState.X, mouseState.Y); 
var scaledMousePosition = Vector2.Transform(mousePosition, Matrix.Invert(matrix)); 

然後你就可以在所有的地方使用的換算值您目前使用mouseState.XmouseState.Y

如果要實施letterboxing或者postboxing,它會變得更加複雜。如果您想知道這是如何工作的,請查看MonoGame.Extended中的視口適配器。

+0

因此'ActualWidth'和'ActualHeight'是'GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width'和'GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height'吧?然後我將'VirtualWidth'和'VirtualHeight'設置爲'1366x768'。我假設'mousePosition'是一個'MouseState'變量? –

+0

我傾向於使用'GraphicsDevice.Viewport.Width'和'GraphicsDevice.Viewport.Height'。你讀過[博客文章](http://dylanwilson.net/resolution-independence-in-monogame-with-viewport-adapters)嗎?是的,虛擬分辨率是你的代碼目前所期望的。如果您已經在1366x768窗口中定位精靈,請使用虛擬分辨率。 – craftworkgames

+0

我正在閱讀此刻。另外,如果我把上面的代碼放在'Draw()'中,如果是'Update()',我不能使用'scaledMousePosition'作爲臨時變量'matrix'嗎? –

1

根據比例尺(sW, sH),您可以將尺寸爲(W, H)的紋理放置在位置(X, Y)中。起初,比例是(1, 1),所以精靈將被放置在矩形(X, Y, W, H)中。

現在,假設初始分辨率爲800x600,但您現在需要的分辨率爲1440x900。如果800 -> sW = 11440 -> sW = 1440/800 = 1.8。類似的,我們的新sH是1.5。

這是說的是:如果某物原本應該在初始分辨率的X座標500上,它現在在新分辨率上的500 * 1.8 = 900 X位置上。對於邊緣來說這很明顯:如果之前在X = 800上出現了某種情況,它現在在800 * 1.8 = 1440上,仍然在屏幕的邊緣!

說了算,我們只需要乘。回到第一段,我們可以說一個矩形(X, Y, W, H)可以通過(sW, sH)(X * sW, Y * sH, W * sW, H * sH)的比例進行重新調整。

這當然是通過假設原始分辨率由(1, 1)縮放計算出來的,請不要忘記這一點!

+0

所以我打算編寫像「1366/800 = 1.7075」和「768/600 = 1.28」這樣的遊戲分辨率。所以現在我爲我的背景添加了'新的Rectangle(0 * 1.7075,0 * 1.28,800 * 1.7075,600 * 1.28)',當然''(0,0)'位置乘以後會返回0,所以我可以使用那裏有'0'。那麼輸入呢?我無法對我的'Point'變量進行硬編碼,如果它的距離爲500像素,我檢查鼠標是否點擊,對不對? –

+0

@JohnyP。輸入已經在新的座標系中,應該對照轉換爲新座標系的矩形進行檢查。我建議靜態更改大小(在Photoshop中調整紋理大小或其他),而不是在運行時。 – Mephy