Làm cách nào để tôi hộp thư một khung nhìn C # / Monogame trong một cửa sổ có thể thay đổi kích thước?


7

Tôi đang làm một trò chơi 2d với xna / monogame. Tôi muốn khu vực xem chính luôn hiển thị các ô 15x15 hoặc 480x480px.

bản vẽ tình huống

Tôi đã có một cái gì đó loại công việc, theo hướng dẫn này . Nó mở rộng phạm vi xem nếu bạn làm cho cửa sổ nhỏ hơn. Tuy nhiên, nó hoạt động hơi đúng nếu bạn mở rộng nó. Nó hoạt động như dự định nếu cửa sổ được tối đa hóa.

Tôi muốn phạm vi của những gì được hiển thị không lớn hơn 480px x 480px bất kể kích thước của cửa sổ, nhưng tôi muốn các họa tiết xuất hiện lớn hơn nếu độ phân giải cửa sổ được đặt lớn hơn (và ngược lại).


Tôi chỉnh sửa để làm rõ nhất có thể. Tôi đã bối rối bởi những phần giải thích hành vi bạn muốn và có. Tôi đã cố vẽ nó . Điều đó có đúng không?
Anko

Có xin lỗi vì tôi không rõ ràng hơn, đôi khi tôi gặp khó khăn trong việc truyền đạt những gì tôi đang thực sự nghĩ. Đó chính xác là những gì tôi muốn thực hiện, hướng dẫn có được thứ gì đó cực kỳ giống như nó nhưng phạm vi kết xuất của người chơi không ở nơi tôi muốn.
ChrisD3

1
Có vẻ như bạn có thể theo đuổi một trong những giải pháp được cung cấp cho: stackoverflow.com/questions/7591466/ Lời
lzcd

Câu trả lời được chọn trên trang đó tôi nhận được một ngoại lệ tham chiếu null trên biến biểu mẫu và đó chỉ là bản sao được dán để thử.
ChrisD3

Câu trả lời:


4

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.Begincuộ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 GraphicsDevicevà 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.ClientSizeChangedsự 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 .


1

bài viết thường không được thích trong trao đổi Stack nhưng đây là bài viết của tôi khi tôi cố gắng ghi nhớ điều này

http://www.david-amador.com/2010/03/xna-2d-indepocate-resolution-rendering/


articles generally are not likedbởi vì nếu trang web bị sập, câu trả lời là vô ích. Làm thế nào về trích dẫn các bit có liên quan của bài viết của bạn trong câu trả lời của bạn?
tro999

không phải bài viết của tôi, đó là của người khác và có thể được bảo vệ bởi một số malarkey bản quyền
RoughPlace

Làm thế nào tôi có thể sử dụng điều này với 2dcamera mà tôi muốn luôn luôn tập trung vào người chơi. Câu trả lời này bù đắp cho máy ảnh khá nhiều. dẫn đến điều này
ChrisD3
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.