Làm cách nào để tạo độ phân giải trò chơi 2D độc lập?


10

Tôi đang làm việc trên một trò chơi 2D đơn giản. Tôi đã hoàn thành phiên bản điện thoại di động.

Tuy nhiên, ông chủ của tôi muốn trò chơi hoạt động trên RT của mình. Tôi đang thực hiện "chuyển đổi" nhưng các nút của tôi ở sai vị trí, vì tôi đã mã hóa cứng kích thước màn hình, như thế này:

 texture = game.Content.Load<Texture2D>("StartScreen");
 mainFrame = new Rectangle(0, 0, game.GraphicsDevice.Viewport.Width, game.GraphicsDevice.Viewport.Height);

 // button definitions
 startbrect = new Rectangle(300, 258, 88, 88);
 startbtext = game.Content.Load<Texture2D>("bplay");

Trong ví dụ này, mainframetốt, nhưng startbrectkhông, vì tôi đã xác định kích thước phù hợp với màn hình Windows Phone. Làm cách nào tôi có thể xử lý thiết kế phản hồi khi tất cả màn hình của điện thoại Windows 8 khác nhau? Có một công thức hoặc vĩ mô để tính toán mỗi lần kích thước tốt?


Bạn có thể kiểm tra tỷ lệ phần trăm của Windows Phone sàng lọc các nút của bạn được sử dụng và sau đó sử dụng tỷ lệ phần trăm đó để tính toán kích thước chính xác cho mọi độ phân giải khác. Nhưng tôi chắc chắn có nhiều cách thanh lịch hơn thế này.
Christian

Tôi đang tìm kiếm một cách thanh lịch hơn, nhưng tôi sẽ thử với tỷ lệ phần trăm cho thời điểm này.
Gabson

2
Bạn sẽ có thể làm điều đó bằng cách thao tác với máy ảnh.
tro999

Giải pháp của tôi là đối phó với tỷ lệ phần trăm không tìm thấy tốt hơn.
Gabson

Câu trả lời:


17

Tôi sử dụng kích thước màn hình tham chiếu và chia tỷ lệ mọi thứ theo nó, trong khi vẫn giữ tỷ lệ của mọi thứ như nhau.

private static float CalcRatio(Vector2 Sizes)
{
    return Sizes.y/Sizes.x;
}

public static Vector2 CalculateNewPos(Vector2 RefPos, Vector2 RefScreenSize, 
                                      Vector2 CurrentScreenSize)
{       
    return new Vector2((RefPos.x/RefScreenSize.x) * CurrentScreenSize.x, 
                       (RefPos.y/RefScreenSize.y) * CurrentScreenSize.y);
}

public static Vector2 CalculateNewSize(Vector2 RefSize, Vector2 RefScreenSize,
                                       Vector2 CurrentScreenSize)
{       
    float origRatio = CalcRatio(RefSize);
    float perW = RefSize.x * 100f / RefScreenSize.x;    
    float newW = perW / 100f * CurrentScreenSize.x;
    float newH = newW * origRatio;
    return new Vector2(newW, newH);
}

Để đảm bảo trò chơi có độ phân giải tốt với các tỷ lệ khác biệt đáng kể so với độ phân giải tham chiếu của bạn, hãy xác định "khu vực có thể chơi", phù hợp với bất kỳ loại màn hình nào và đặt tất cả các hình ảnh quan trọng của trò chơi vào đó. Điền vào tất cả mọi thứ bên ngoài của nó với nền. Thông thường, diện tích có thể chơi tham chiếu của tôi lớn bằng chính kích thước màn hình tham chiếu.

Theo hướng dọc, tôi tính diện tích có thể phát (mới) để màn hình được lấp đầy theo chiều dọc và không gian cần theo chiều ngang chỉ lớn bằng mức cần thiết để giữ tỷ lệ. Theo hướng ngang, tôi lấp đầy màn hình theo chiều ngang và giữ tỷ lệ khi đặt kích thước dọc.

Để biết thêm, hãy xem http://en.wikipedia.org/wiki/Safe_area_(television) vì đây là một khái niệm tương tự, nếu không giống hệt nhau.


0

Tôi nghĩ rằng cách tiếp cận dễ dàng và tự nhiên nhất để bố trí độc lập độ phân giải là sơ đồ tương đối (phần trăm). Vì vậy, từ đầu không làm việc với độ phân giải thực mà chỉ trong một hình vuông [0,1] x [0,1] bất cứ nơi nào có thể.

Điều đó có nghĩa là đối với một vị trí nhất định screen_sizevà cho trước object_sizevà một vị trí tương đối nhất định (px, py)(ví dụ (0,5, 0,5) cho tâm màn hình), góc trên, góc trái của đối tượng được tính bằng:

x = px * screen_size.width - 0.5 * object_size.width
y = py * screen_size.height - 0.5 * object_size.height

Ý tưởng nên rõ ràng. Một sự trừu tượng sẵn sàng sẽ là

x = cx1 * screen_size.width + cx2 * object_size.width + cx3
y = cy1 * screen_size.height + cy2 * object_size.height + cy3

và mọi vị trí được xác định sau đó bởi (cxi, cyi). Bằng cách này, người ta có thể đặt các đối tượng trong các góc có hoặc không có viền, v.v.

Vui lòng đảm bảo rằng kích thước các thành phần đơn (nút, nhãn, ...) cũng được chia tỷ lệ.


-2

Đặc biệt cho MonoGame tôi có giải pháp độc lập nền tảng cho vấn đề này được gọi là IRR (Trình phân giải độc lập kết xuất). Nó có cách sử dụng rất đơn giản:

  1. Tạo IRR trong phương thức Khởi tạo ()

    _irr = new Độ phân giải (cái này, VirtualResolutionWidth, VirtualResolutionHeight, _gfx.PreferredBackBufferWidth, _gfx.PreferredBackBufferHeight);

  2. Gọi _irr.Draw () mỗi chu kỳ trong cuộc gọi Draw ()
  3. Cung cấp _irr.GetTransaturesMatrix () trong bất kỳ cuộc gọi SpriteBatch.Begin () nào bạn muốn sử dụng IRR.

Mô tả ở đây: http://panthernet.ru/forum/index.php?/topic/17-monogamexna-examples-v14/?p=44

Mã ở đây: https://github.com/panthernet/Monogame-Examples

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.