Gần đây tôi đã thực hiện một cái gì đó như thế này trong thư viện MonoGame.Extends . Tạo một khung nhìn hộp thư / trụ cột trong MonoGame thực sự khá khó khăn. Tôi sẽ làm hết sức mình để cung cấp một câu trả lời tốt ở đây.
Về cơ bản có 3 phần. Đầu tiên là tạo một ma trận chia tỷ lệ để chuyển vào SpriteBatch.Begin
cuộc gọi. Các biến đại diện cho độ phân giải thực tế của bạn so với độ phân giải ảo . Ví dụ: bạn mã hóa trò chơi theo độ phân giải ảo 800x480 nhưng hiển thị nó ở độ phân giải thực tế là 1024x768. Mã này sẽ kéo dài hình ảnh cho phù hợp.
var scaleX = (float)ActualWidth / VirtualWidth;
var scaleY = (float)ActualHeight / VirtualHeight;
var scaleMatrix = Matrix.CreateScale(scaleX, scaleY, 1.0f);
_spriteBatch.Begin(transformMatrix: scaleMatrix);
Phần thứ hai là cách bạn có được hiệu ứng hộp thư / hộp cột. Nó thay đổi kích thước khung nhìn trên GraphicsDevice
và căn giữa hình ảnh. Mã này cần chạy mỗi khi kích thước màn hình thiết bị hoặc kích thước cửa sổ thay đổi. Ví dụ, trong Window.ClientSizeChanged
sự kiện.
var viewport = GraphicsDevice.Viewport;
var aspectRatio = (float) VirtualWidth / VirtualHeight;
var width = viewport.Width;
var height = (int)(width / aspectRatio + 0.5f);
if (height > viewport.Height)
{
height = viewport.Height;
width = (int) (height * aspectRatio + 0.5f);
}
var x = (viewport.Width / 2) - (width / 2);
var y = (viewport.Height / 2) - (height / 2);
GraphicsDevice.Viewport = new Viewport(x, y, width, height);
Phần cuối cùng là xử lý tọa độ đầu vào từ chuột hoặc màn hình cảm ứng. Vì bạn đã thu nhỏ và di chuyển đồ họa, bạn sẽ cần thực hiện ngược lại cho tọa độ đầu vào. Trong trường hợp này, một cái gì đó như thế này
var viewport = GraphicsDevice.Viewport;
var matrix = Matrix.Invert(scaleMatrix);
var oldPosition = new Vector2(mousePoint.X - viewport.X, mousePoint.Y - viewport.Y);
var newPosition = Vector2.Transform(oldPosition, scaleMatrix).ToPoint();
Tôi có một hướng dẫn đầy đủ với tất cả những thứ này trong các lớp học trên blog của tôi .