2015-02-23 37 views
0

我有一個Windows窗體內的XNA窗口,當我調整窗口大小時遇到​​問題。停止調整窗口大小時移動的3D對象[XNA/WinForms/C#]

我想要的行爲是讓渲染的立方體根本不移動。因此,如果屏幕右側有第二個立方體,並且用戶將窗口大小調整爲右側,則第二個立方體將進入​​視野。所以基本上調整窗口的大小根本不會影響渲染的元素。

但是,當我調整窗口的大小,例如向右拖動,立方體也向右移動sad.png 當我拖動窗口時,立方體緩慢放大。

下面是立方體的每個四邊形我抽獎代碼:

GraphicsDevice dev = Core.Device; 

dev.BlendState = BlendState.Opaque; 
dev.DepthStencilState = DepthStencilState.Default; 

dev.SetVertexBuffer(_vb); 
dev.Indices = _ib; 

effect.View = Matrix.CreateLookAt(new Vector3(0, 0, 150), Vector3.Zero, Vector3.Up); 
effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, dev.Viewport.AspectRatio, 0.1f, 10000.0f); 
effect.World = Matrix.Identity; 

effect.EnableDefaultLighting(); 
effect.Texture = Texture; 

effect.CurrentTechnique.Passes[0].Apply(); 
dev.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Length, 0, indices.Length/3); 

我使用從XNA網站的WinForms/XNA樣品。當窗口被調整大小時,設備被重置並且後緩衝器的寬度和高度被設置爲xna窗口的寬度和高度。

這意味着Viewport.AspectRatio得到更新,3d立方體不會拉伸。現在我只需要他們的立場不要改變。

有誰知道我還能嘗試什麼?

回答

0

這是因爲XNA不瞭解您的Windows窗體窗口。這意味着它不知道如何縮放它,所以很自然地將它縮放爲1x1

完成問題的最簡單方法是將所有內容渲染到1920x1080的RenderTarget,然後用當前的窗口寬度/高度繪製該RenderTarget。

僞代碼:

public void Draw(params) 
{ 
    RenderTarget2D renderTarget = new RenderTarget2D(GraphicsDevice, 1920, 1080); // Might want some parameters, dunno 
    GraphicsDevice.SetRenderTarget(renderTarget); 

    // Render stuff as usual 

    GraphicsDevice.SetRenderTarget(null); // Resets it 

    spritebatch.Begin(); 
    spritebatch.Draw(renderTarget.GetTexture(), new Rectangle(0, 0, WindowWidth, WindowHeight), params...); 
    spritebatch.End(); 
} 

我不記得,如果這些都是確切的方法名稱,但它是類似的東西。

說明:你實質上正在做的是將所有內容都渲染到臨時內存緩衝區(類似於photoshop中的圖形)。然後在完成之後,您可以像使用其他任何2D紋理一樣使用它。這也意味着你可以將它繪製到屏幕上並根據需要進行轉換(在你的情況下,將它壓縮到800x600,如果這是你當前的WinForms大小);

+0

謝謝這是我一直在尋找的解決方案 – LynchDev 2015-02-24 12:51:33

相關問題