在XNA

2013-06-13 29 views
2

縮放一個Texture2D我具有與1280×720的分辨率的窗口餘繪製爲隨後一個160×80按鈕(I意譯有點這裏):在XNA

currentwindowwidth = 1280; 
// The scale in this instance would be 1.0f 
scale = currentwindowwidth/1280f; 
b.position = new Vector2(640, 650) * scale; 
b.origin = new Vector2(80, 40) * scale; 
spriteBatch.Draw(b.texture, b.pos, null, Color.White, 0, b.ori, scale, SpriteEffects.None, 0); 

當我繪製窗口在1280 x 720,該按鈕被繪製在正確的位置和按鈕檢測:

if (mousepos.X >= b.pos.X - b.ori.X && mousepos.X <= b.pos.X + b.ori.X) 
{ 
    if (mousepos.Y >= b.pos.Y - b.ori.Y && mousepos.Y <= b.pos.Y + b.ori.Y) 
    { 
     HandleButton(b); 
    } 
} 

工程100%。按鈕檢測到我的鼠標點擊像素完美的精度,並且texture2d被忠實地繪製到檢測框中。

然而,當我擴展到1920×1080(相同的縱橫比),該按鈕被繪製在不正確的位置:

currentwindowwidth = 1920; 
// The scale would be 1.5f here 
scale = currentwindowwidth/1280f; 
b.position = new Vector2(640, 650) * scale; 
b.origin = new Vector2(80, 40) * scale; 
spriteBatch.Draw(b.texture, b.pos, null, Color.White, 0, b.ori, scale, SpriteEffects.None, 0); 

現在,這將給我的位置矢量(960,975)和(120,60)(< - 我在Visual Studio的「Locals」選項卡中找到)的來源。在做了一些計算之後,這些都是正確的值,並且按鈕檢測正好在我希望它工作的地方工作。然而,精靈沒有繪製在正確的位置,它被繪製(-60,-30)像素偏離它應該。按比例放大按鈕檢測在正確的位置(840-1080,915-1035)工作,但紋理2d繪製在錯誤的位置。當我將屏幕縮放到另一個16:9分辨率(例如1366 x 768)時,除(-60,-30)關但按比例(-8.0625,-4.03125)和(-30, - 15)在1600 x 900.

當我使用小於1280 x 720(854 x 480)的分辨率,但在相反的方向(正偏移矢量而不是負值)時,也會出現此效果。

在每16:9分辨率下,按鈕檢測按照計算的方式工作,但是當我縮放texture2d時,它被繪製在不正確的位置。我唯一的猜測是,我不知道的方式是scale2的紋理。

如果任何人有問題我會非常感激的經驗,

+0

您是否嘗試過指定比例值,但在SpriteBatch.Draw調用中使用原始位置和偏移值? – gareththegeek

回答

3

origin參數從精靈紋理的左上角像素規定。它會在精靈縮放或定位之前應用 - 您無需在屏幕上縮放origin

此外,可能需要考慮將縮放矩陣傳遞給SpriteBatch.Begin,以擴展整個場景,而不是手動縮放和定位每個精靈。

無論在哪種情況下,您都可能需要重新計算您的數學來確定點擊範圍。

請注意,如果您使用縮放你的整個場景中的矩陣,即矩陣可以反轉從屏幕(客戶端)座標回去現場(世界)座標。

+0

這解決了我的問題100%。對於那些在家裏我用過的東西:spriteBatch.Begin(SpriteSortMode.Deferred,BlendState.AlphaBlend,null,null,null,null,scalematrix);並將我的scalematrix定義爲scalematrix = Matrix。CreateScale(scale,scale,1f);並通常繪製像spriteBatch.Draw(b.texture,b.pos + offsetvector,null,Color.White,0,b.ori,1,SpriteEffects.None,0);.神祕地,我沒有必要放大按鈕檢測,但是這個工作不會那麼少。 – Ken