Nghị quyết Độc lập trong libGDX


22

Làm cách nào để làm cho độ phân giải / mật độ trò chơi libGDX của tôi độc lập? Có cách nào để xác định kích thước hình ảnh là "tuyệt đối" bất kể mật độ cơ bản không?

Tôi đang làm một trò chơi trẻ em rất đơn giản; chỉ là một loạt các họa tiết được hiển thị trên màn hình và một số văn bản cho các menu (chủ yếu là menu tùy chọn). Những gì tôi muốn biết là: làm thế nào để làm cho độ phân giải sprite / phông chữ của tôi độc lập? (Tôi đã gói chúng trong các lớp học của riêng mình để làm cho mọi thứ dễ dàng hơn.)

Vì đây là một trò chơi trẻ em đơn giản, tôi không cần phải lo lắng về "khu vực có thể chơi" của trò chơi; Tôi muốn sử dụng càng nhiều không gian màn hình càng tốt.

Những gì tôi đang làm hiện tại, có vẻ như không chính xác, chỉ đơn giản là tạo ra hình ảnh phù hợp với độ phân giải lớn, sau đó thu nhỏ (hoặc hiếm khi, lên) để phù hợp với kích thước màn hình. Điều này có vẻ hoạt động tốt (trong phiên bản máy tính để bàn), ngay cả với ánh xạ tuyến tính trên kết cấu của tôi, nhưng độ phân giải nhỏ hơn trông xấu.

Ngoài ra, điều này dường như bay bổng khi đối mặt với "pixel độc lập với thiết bị" (DP) của Android. Hoặc có lẽ tôi đang thiếu một cái gì đó và libGDX đã quan tâm đến vấn đề này bằng cách nào đó?

Cách tốt nhất để giải quyết vấn đề này là gì? Tôi tìm thấy liên kết này; đây là một cách tốt để giải quyết vấn đề ?: http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

Nó đề cập đến cách kiểm soát hình ảnh, nhưng nó không đề cập đến cách chỉ định kích thước phông chữ / hình ảnh bất kể mật độ.



@thedaian không hẳn. Đó là về độ phân giải; Tôi quan tâm nhiều hơn về sự tương tác giữa mật độ và độ phân giải.
tro999

Câu trả lời:


12

Vì bạn có thể đọc mật độ thiết bị và hiển thị phông chữ trong thời gian chạy trong libgdx, tôi sử dụng giải pháp này để đạt được kích thước phông chữ độc lập với mật độ:

float densityIndependentSize = origFontSize * Gdx.graphics.getDensity();
int fontSize = Math.round(densityIndependentSize );
BitmapFont font = generator.generateFont(fontSize );

Thảo luận của tôi là về hình ảnh cũng như phông chữ. +1 cho kết xuất phông chữ động mặc dù (tôi đã làm điều này rồi).
tro999

10

Để đạt được điều này trong libgdx, bạn có thể sử dụng "orthographicCamera" ở đó bạn căn chỉnh kích thước mà bạn sử dụng và ở mọi độ phân giải bạn có thể thấy tất cả hình ảnh của mình được điều chỉnh theo kích thước đó (tôi sử dụng 800X480 vì màn hình lớn hơn trong Android ) và nó hoạt động tốt :)

public class GameStage extends Stage 
{ 
     public GameStage(float width, float height, boolean stretch) 
     { 
          this.camera = new OrthographicCamera(800, 480);
          this.camera.position.set(800/2, 480/2, 0f); 
     } 
}

Tôi có thể lấy một mẫu mã được không?
tro999

Đó là mã và bạn tạo một lớp thực hiện giao diện Màn hình, trong hàm tạo bạn xây dựng giai đoạn của bạn và trong phương thức kết xuất, bạn đặt stage.draw (). Nếu bạn không muốn sử dụng Giai đoạn, bạn có thể khai báo một biến trong lớp Loại máy ảnh được triển khai trên màn hình và thực hiện tương tự như trong Giai đoạn, nhưng trong phương thức kết xuất, bạn áp dụng bản cập nhật cho máy ảnh.
Rudy_TM

Điều này thực sự hoạt động khá tốt.
bạn786

4

Tôi tin rằng "pixel độc lập với thiết bị" của Android chỉ là một thước đo để phân loại thiết bị và thực tế không có sẵn dưới dạng pixel có thể kết xuất. Vì vậy, bạn không bỏ lỡ bất kỳ cơ sở hạ tầng giải quyết DPI kỳ diệu nào. Theo như tôi hiểu về tình trạng của nghệ thuật ở đây, bạn đã khám phá tất cả các tùy chọn. Có hai cách tiếp cận cơ bản để xử lý các thiết bị khác nhau:

  1. Chia tỷ lệ hình ảnh có sẵn để phù hợp với DPI thiết bị thực tế.
  2. Chọn từ một loạt các hình ảnh được chia tỷ lệ trước tại thời điểm chạy dựa trên DPI.

Tất nhiên, bạn có thể thực hiện một số kết hợp cả hai (chọn một hình ảnh gần như chính xác và sau đó thu nhỏ nó) hoặc sử dụng các cách tiếp cận khác nhau cho các yếu tố khác nhau của giao diện người dùng của bạn (ví dụ: hình ảnh có sẵn cho phông chữ / văn bản và chia tỷ lệ động cho trò chơi sprite).

Những gì trò chơi cụ thể của bạn đang cố gắng thực sự có thể tạo ra sự khác biệt trong đó cách tiếp cận có ý nghĩa hơn. Ví dụ: nếu bạn đã có một menu trên màn hình, bạn sẽ muốn đảm bảo các nút có nhiều kích cỡ đầu ngón tay hợp lý (vì vậy nút này luôn dễ bấm, nhưng không lớn hơn mức cần thiết thiết bị lớn như máy tính bảng). Ngoài ra, nếu bạn đang cố gắng xây dựng một trò chơi giải đố trong đó bạn muốn đảm bảo có thể nhìn thấy toàn bộ câu đố cùng một lúc, bạn sẽ cần chia tỷ lệ các yếu tố cho vừa với màn hình (ví dụ: bằng ngón chân cái trò chơi có lẽ bạn muốn mỗi yếu tố sử dụng khoảng 1/3 màn hình).

Tôi nghĩ đối với những thứ như phông chữ có nhiều chi tiết đẹp, bạn sẽ muốn có nhiều hình ảnh được kết xuất sẵn với văn bản, sau đó chọn kết quả phù hợp nhất. Vì vậy, các nút có thể thay đổi hình dạng / kích thước tương đối của chúng từ thiết bị này sang thiết bị khác, nhưng nhìn chung sẽ luôn trông đẹp mắt.

Hãy xem Trò chơi Android bắt đầu của Mario Zerchner để biết một số thảo luận về các vấn đề và một số giải pháp. Lưu ý rằng Mario là tác giả của libGDX, vì vậy cách tiếp cận của cuốn sách phản ánh libGDX (lưu ý rằng chúng không phải là một, cuốn sách bao gồm việc viết một thư viện tương tự libGDX, nhưng không phải là libGDX).


Ngay cả khi tôi chọn từ các bộ sưu tập hình ảnh được tạo sẵn dựa trên DPI, tôi không thấy làm thế nào tôi có thể đảm bảo rằng "sprite này PHẢI hiển thị là 64x64".
tro999

1
Tôi đã giả sử bạn đặt máy ảnh OpenGL của mình khớp với màn hình vật lý, do đó, 1 bản đồ pixel OpenGL thành 1 pixel hiển thị. Tại thời điểm đó, hình ảnh 64x64 sẽ hiển thị là 64x64 trên màn hình. Như Rudy_TM chỉ ra, bạn có thể lộn xộn với ánh xạ camera để có tỷ lệ toàn màn hình.
PT

Được rồi, nó trông giống như "nước sốt bí mật" mà tôi đã theo sau. Tôi sẽ kiểm tra và cho bạn biết, cảm ơn.
tro999

0

Một cách để làm điều đó là xác định tỷ lệ khung hình tối thiểu và tỷ lệ khung hình tối đa cho trò chơi của bạn. Đây sẽ là các tỷ lệ mà bạn muốn hỗ trợ. Sau đó, bạn cần sử dụng Viewport hiện được cung cấp trong libGdx. Chế độ xem sẽ mở rộng thế giới của bạn theo các cài đặt bạn cung cấp.

Có một số loại chế độ xem và bạn cần chọn loại phù hợp nhất cho trò chơi của mình.

Bạn có thể sử dụng ExtendViewport chẳng hạn và sửa chiều cao hoặc chiều rộng của bạn và tính toán cái khác. Sau đó, bạn cần đảm bảo rằng tất cả đồ họa có thể được nhìn thấy trong tỷ lệ khung hình tối thiểu của bạn. Chế độ xem mở rộng sẽ chia tỷ lệ đồ họa của bạn theo tỷ lệ khung hình chính xác mà không làm biến dạng đồ họa. Tuy nhiên, ExtendViewport hoạt động bằng cách thêm không gian bổ sung vào thế giới của bạn, do đó bạn cũng nên cung cấp đồ họa cho nền, ví dụ bao trùm toàn bộ tỷ lệ khung hình được bảo hiểm của bạn, khi thế giới nhỏ hơn tỷ lệ khung hình tối đa của bạn, phần phụ của đồ họa sẽ không được hiển thị.

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.