2011-09-29 39 views
9

Sử dụng XNA, tôi đang cố gắng để làm cho một động cơ cuộc phiêu lưu trò chơi cho phép bạn thực hiện trò chơi mà hình như họ rơi ra khỏi đầu những năm 90, như Day of the TentacleSam & Max Hit Đường. Vì vậy, tôi muốn các trò chơi để thực sự chạy ở 320x240 (tôi biết, nó có lẽ nên là 320x200, nhưng shh), nhưng nó nên mở rộng quy mô tùy thuộc vào cài đặt người dùng.Scaling toàn bộ màn hình trong XNA

Nó hoạt động bình thường ngay bây giờ, nhưng tôi đang gặp phải một số vấn đề mà tôi thực sự muốn nó trông giống nhiều hơn pixel mà hiện tại nó đang thực hiện.

Đây là những gì tôi đang làm ngay bây giờ:

Trong trò chơi khởi tạo:

public Game() { 
     graphics = new GraphicsDeviceManager(this); 
     graphics.PreferredBackBufferWidth = 640; 
     graphics.PreferredBackBufferHeight = 480; 
     graphics.PreferMultiSampling = false; 

     Scale = graphics.PreferredBackBufferWidth/320; 
    } 

Scale là một biến public static mà tôi có thể kiểm tra bất cứ lúc nào để xem có bao nhiêu tôi nên mở rộng trò chơi của tôi tương đối đến 320x240.

Trong chức năng vẽ của tôi:

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone, null, Matrix.CreateScale(Game.Scale)); 

Bằng cách này, tất cả mọi thứ được vẽ ở 320x240 và thổi lên để phù hợp với độ phân giải hiện tại (640x480 theo mặc định). Và tất nhiên tôi làm toán để chuyển đổi tọa độ thực tế của chuột thành tọa độ 320x240, v.v.

Bây giờ, điều này là tuyệt vời và tất cả, nhưng bây giờ tôi đang đi đến điểm mà tôi muốn bắt đầu mở rộng quy mô của tôi sprites, để có họ đi bộ vào khoảng cách và vv.

Xem các hình ảnh bên dưới. Hình trên bên trái là một phần của ảnh chụp màn hình từ khi trò chơi đang chạy ở 640x480. Hình ảnh bên phải của nó là làm thế nào nó "nên" nhìn, tại 320x240. Hàng dưới cùng của hình ảnh chỉ là hàng đầu thổi lên đến 300% (trong Photoshop, không phải trong động cơ), do đó bạn có thể thấy những gì tôi đang nói về.

image showing the difference in scaling as the resolution changes

Trong 640x480 hình ảnh, bạn có thể nhìn thấy nhau "độ dày đường;" các đường dày hơn là nó trông thực sự như thế nào (một pixel = 2x2, vì nó đang chạy ở 640x480), nhưng các đường mỏng hơn (1x1 pixel) cũng xuất hiện, khi chúng không nên, do mở rộng (xem hình ảnh bên phải).

Về cơ bản, tôi đang cố gắng mô phỏng màn hình 320x240 nhưng bị thổi bay lên bất kỳ độ phân giải nào bằng XNA và các phép biến đổi ma trận không thực hiện thủ thuật. Có cách nào tôi có thể đi về việc này không?

Trả lời

14

Render tất cả mọi thứ trong việc giải quyết nguồn gốc từ một RenderTarget thay vì bộ đệm trở lại:

 SpriteBatch targetBatch = new SpriteBatch(GraphicsDevice); 
     RenderTarget2D target = new RenderTarget2D(GraphicsDevice, 320, 240); 
     GraphicsDevice.SetRenderTarget(target); 

     //perform draw calls 

Sau đó, làm cho mục tiêu này (toàn bộ màn hình của bạn) vào bộ đệm trở lại:

 //set rendering back to the back buffer 
     GraphicsDevice.SetRenderTarget(null); 

     //render target to back buffer 
     targetBatch.Begin(); 
     targetBatch.Draw(target, new Rectangle(0, 0, GraphicsDevice.DisplayMode.Width, GraphicsDevice.DisplayMode.Height), Color.White); 
     targetBatch.End(); 
+1

Cảm ơn một bó! Tôi đã thực hiện cuộc gọi SpriteBatch cuối cùng: spriteBatch.Begin (SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone); để làm cho hình chiếu không bị mờ, nhưng có vẻ tuyệt vời! Cảm ơn một lần nữa! –

Các vấn đề liên quan