2011-03-02 92 views
1

我發展爲學校項目的UI,我嘗試了類似的方法來縮放我的紋理在這裏上市,但這裏的問題:如何擴展的Texture2D在XNA與窗口大小調整

我們項目的開發時間爲1440 x 900,因此我製作了適合該屏幕分辨率的自己的圖像。當我們必須在課堂上演示我們的項目時,投影機最多隻能渲染1024 x 768,因此屏幕上的許多內容都會丟失。我添加了窗口大小調整功能,並且我正在按照這種方式進行縮放。我有我自己的叫做「按鈕」的類,它有一個紋理2d和一個由Button控制的Vector2位置(Texture2d img,float width,float height)。

我的想法是將圖像的位置設置爲窗口寬度和高度的可縮放的百分比,所以我試圖將img的位置設置爲0-1之間的數字,然後乘以窗口寬度和高度,以保持一切縮放正確。

(此代碼是不正確的語法,我只是想傳達點)

Button button = new Button(texture, .01, .01); 
int height = graphicsdevice.viewport.height * button.position.Y; 
int width = graphicsdevice.viewport.width * button.position.X; 

Rectangle rect = new Rectangle(0,0,width, height); 

sprite.being() 
sprite.draw (button.img, rect, color.white); 
sprite.end 

它不會結束縮放什麼,當我去畫它,並通過拖動調整窗口的大小鼠標左右。如果我以不同的緩衝區高度和緩衝區寬度開頭編碼,則不管分辨率如何,圖像的大小都保持相同,但分辨率越小,圖像看起來越像素化。

什麼是設計我的程序允許動態紋理2D縮放的最佳方式?

+0

爲什麼你將窗口的* size *乘以按鈕的* position *?此外,XNA不會直接通過拖動處理窗口大小調整,請執行谷歌搜索以瞭解如何在XNA中實現此功能。如果你只是全屏運行,你應該沒有問題。 – Hannesh 2011-03-02 19:47:26

回答

0

正如Hannesh所說,如果你全屏運行它,你將不會遇到這些問題。但是,您在這樣做的方式中也存在根本性問題。而不是使用精靈的位置,在調整窗口大小時根本不會改變,你必須使用精靈的大小。我經常使用我的Sprite類中稱爲Scale的屬性來完成此操作。因此,不要將精靈的位置固定在0和1之間,而應該將精靈的Size屬性固定在0和1之間。然後,在重新調整窗口大小時,它將重新縮放精靈。

在我看來,更好的方法是使用默認分辨率,在你的情況下是1440 x 900.然後,如果窗口被重新縮放,只需將所有圖形的比例因子乘以新的屏幕比例到舊的屏幕。每次調整大小隻需要1次乘法,而不是每次更新的乘法(這是您的方法將執行的操作,因爲每次更新都必須從被鉗位的0-1值轉換爲實際值)。

此外,您在精靈手動重新縮放過程中注意到的效果是正常的。將圖像重新縮放到任意大小會導致渲染圖像出現僞像,因爲圖形設備不知道大多數尺寸下應該做什麼。解決這個問題的好方法是在開發過程中使用填充工藝,然後以正確的分辨率創建最終的藝術。很明顯,這不適用於你的情況,因爲你正在調整窗口大小爲任意大小,但在遊戲中你通常只能切換到某些固定分辨率。