Chủ đề Android rắc rối quấn đầu tôi xung quanh thiết kế


9

Tôi đang gặp khó khăn trong việc thiết kế trò chơi. Trên nền tảng Android, tôi có một hoạt động và đặt chế độ xem nội dung của nó với chế độ xem bề mặt tùy chỉnh. Khung nhìn bề mặt tùy chỉnh đóng vai trò là bảng điều khiển của tôi và tôi tạo các thể hiện của tất cả các lớp và thực hiện tất cả các bản vẽ và tính toán trong đó.

Câu hỏi: Thay vào đó tôi có nên tạo các thể hiện của các lớp khác trong hoạt động của mình không?

Bây giờ tôi tạo một lớp luồng tùy chỉnh xử lý vòng lặp trò chơi.

Câu hỏi: Làm thế nào để tôi sử dụng một lớp này trong tất cả các hoạt động của mình? Hay tôi phải tạo một thể hiện riêng biệt của lớp luồng mở rộng mỗi lần?

Trong trò chơi trước của tôi, tôi có nhiều cấp độ phải tạo một thể hiện của lớp luồng và trong lớp luồng, tôi phải đặt các phương thức xây dựng cho từng cấp riêng biệt và trong vòng lặp sử dụng câu lệnh chuyển đổi để kiểm tra mức độ nào cần hiển thị và cập nhật. Xin lỗi nếu điều đó nghe có vẻ khó hiểu.

Tôi chỉ muốn biết liệu phương pháp tôi đang sử dụng có kém hiệu quả không (có lẽ là như vậy) và làm thế nào để thiết kế nó đúng cách. Tôi đã đọc nhiều hướng dẫn ngoài kia và tôi vẫn gặp nhiều rắc rối với chủ đề đặc biệt này. Có lẽ một liên kết đến một số hướng dẫn giải thích điều này? Cảm ơn.

Câu trả lời:


13

Tôi đặc biệt khuyên bạn nên có một chuỗi kết xuất (sử dụng Canvas/ OpenGL ES, Canvascó lẽ dễ cài đặt hơn một chút) và một chuỗi trò chơi nơi bạn đặt logic trò chơi của mình.

Để thực sự "tải" trò chơi, bạn có thể tạo một lớp GameEngine và biến nó thành điểm trung tâm của ứng dụng của bạn. Khi trình kết xuất của bạn sẵn sàng hoạt động, bạn có thể tạo một cuộc gọi lại đến phiên bản GameEngine sẽ tạo và bắt đầu hai luồng bằng cách sử dụng một Runnablekết xuất và một luồng khác Runnablecho logic trò chơi.

Mã mẫu:

Bắt đầu ứng dụng

private GameEngine engine;
private CanvasRenderer renderer;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   // Create instances of your two Runnable classes and pass that into
   // the GameEngine constructor.
   // Create an instance of the game engine.
   engine = new GameEngine(canvasRunnable, gamelogicRunnable);
   renderer = new CanvasRenderer(this, engine); 
   setContentView(renderer); 
}

CanvasRenderer

private GameEngine engine;    

// Save your instance from the GameEngine reference in your constrcutor and make
// a global initializion for your GameEngine instance.  

@Override
public void surfaceCreated(SurfaceHolder holder) {  
   // One time setup here.
   // When your view is ready, make this callback to the 
   // GameEngine.
   engine.surfaceIsReady();
}

GameEngine

private Thread canvasThread;
private CanvasRunnable canvasRunnable;
// You should be able to figure out how to create a second thread
// where you should put your game logic. :)

// Constructor stuff like creating instances of your threads
// and passing references as you wish to those.
// Don't start the threads here.
// Remember to set references from your Runnable's into your Thread's 
// instances here!

/**
 * Callback. Now your renderer is ready and you
 * can start your threads.
 */
public void surfaceIsReady() {
   thread.setName("Canvas");
   thread.start();
   // Same for game logic.
}

Ồ, cảm ơn bạn. Tôi thích cách bạn giải thích nó. Đó là một lời giải thích khai sáng toàn bộ khái niệm cho tôi.
semajhan

@semajhan: Chỉ cần hỏi nếu bạn có nhiều vấn đề hơn. :)

Đây là những gì tôi có trong đầu: Lớp GameEngine hoạt động như một "liên kết" hoặc "tham chiếu" đến tất cả các lớp khác với bảng điều khiển. Hoạt động> Bảng điều khiển> GameEngine> tất cả các lớp khác.
semajhan

@semajhan: Chính xác. Đối với chỉ kiến thức của bạn: nếu bạn quyết định đi với OpenGL ESbạn nên biết rằng các renderer trong OpenGL ESđã có chủ đề riêng của mình và trong trường hợp đó bạn không cần phải tự tạo ra và bắt đầu một mới ThreadRunnablecho hệ thống đó.

Bỏ qua bình luận này.
semajhan

3

Thông thường, vòng lặp trò chơi của bạn được khép kín bên trong một Hoạt động.

Khi bạn chuyển Hoạt động, bạn tạm dừng / hủy vòng lặp trò chơi của mình. Các hoạt động riêng biệt phải tương ứng với việc tạm dừng trò chơi (ví dụ: vì bạn đã chuyển sang hoạt động "gửi email cho bạn bè" hoặc "menu chính")

Đối với các cấp độ bổ sung, bạn không nên tạo hoặc phá hủy bất kỳ chủ đề mới nào ... trừ khi bạn chuyển sang "Hoàn thành cấp độ, tải cấp độ tiếp theo, vui lòng đợi" Hoạt động và bạn sẽ phải khởi động lại "trò chơi chính "Hoạt động nào. Nhưng ngay cả trong trường hợp đó, bạn không thực sự tạo ra các luồng "phụ", bạn chỉ tạo một luồng trong một Hoạt động đó và giết / khởi động lại / giết / khởi động lại liên tục ... vv Hoạt động đó. mỗi khi một cấp độ được hoàn thành.


3

Nếu bạn hiểu tiếng Đức, hướng dẫn này là rất tốt đẹp.

Đối với ngôn ngữ tiếng Anh, tôi có thể giới thiệu hướng dẫn này

Liên quan đến lớp luồng: Tôi không biết liệu có thực sự cần thiết mà bạn có thể tham khảo từ tất cả các lớp trong ứng dụng của mình không. Trong trò chơi của tôi, tôi đã giải quyết nó theo cách đó:

Lớp chịu trách nhiệm vẽ GUI chính có phương thức kết xuất quá mức. Trong phương thức này, một lớp luồng được gọi là cập nhật tất cả các thành phần GUI và xử lý các đầu vào của người dùng.

Các chủ đề cũng có trách nhiệm để duy trì tốc độ khung hình liên tục. Tùy thuộc vào trò chơi bạn đang phát triển, điều này có thể quan trọng.


Hướng dẫn tiếng Đức đó rất hay nhưng nó được dịch gần như là google nên thật khó hiểu.
semajhan
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.