2009-02-26 31 views
6

Chỉnh sửa: Điều này làm cho rất nhiều ý nghĩa với tôi bây giờ mà tôi đã lấy một bước đi từ mã, nhờ sự giúp đỡ.Gameloop cho j2me "theo lượt" trò chơi

Chỉ tìm thấy tràn ngăn xếp vào ngày khác thông qua Mã hóa Kinh dị và có vẻ tuyệt vời. Hình rằng tôi muốn hỏi cộng đồng về một vấn đề mà tôi đang cố gắng giải quyết.

Tôi đang phát triển trò chơi xếp loại roguelike sử dụng j2me cho điện thoại 2.0 midp. Dự án vẫn đang trong giai đoạn phát triển cơ bản khi tôi tìm ra cách nó sẽ hoạt động. Phần tôi hiện đang mắc kẹt phải làm với luồng.

Trò chơi có lớp tùy chỉnh HaxCanvas kéo dài thời gian chạy GameCanvas và Implements. Đó là phương thức chạy các cuộc gọi repaint() và sau đó ngủ trong 50 ms, dẫn đến tốc độ khung hình là 20 FPS. Điều này cho phép tôi viết phần còn lại của trò chơi mà không cần phải đặt dấu vết ở khắp mọi nơi và nên làm cho hình động và hiệu ứng dễ dàng hơn để làm sau này. (ít nhất là về lý thuyết).

Luồng trò chơi được điều khiển bởi lớp GameManager, vòng lặp qua tất cả NPC trên bản đồ, thay phiên nhau, cho đến lượt của người chơi. Tại thời điểm này tôi cần phải nhận được đầu vào để cho phép người chơi di chuyển xung quanh và/hoặc tấn công mọi thứ. Ban đầu, tôi đã gọi số gameManager.runUntilHeroTurn() theo phương thức keyPressed của số HaxCanvas. Tuy nhiên sau khi đọc về các chủ đề hệ thống j2me, tôi nhận ra rằng việc đặt một phương thức có khả năng chạy trong một thời gian trong một cuộc gọi lại là một ý tưởng tồi. Tuy nhiên tôi phải sử dụng keyPressed để thực hiện thao tác nhập liệu, vì tôi cần truy cập vào các phím số và getKeyStates() không hỗ trợ tính năng này.

Hãy cố gắng để đưa gameloop của tôi vào chủ đề riêng của nó đã dẫn đến thảm họa. Một "ArrayIndexOutOfBoundsException" không có dấu lạ "" không có dấu vết ngăn xếp xuất hiện sau khi trò chơi đã chạy nhiều lần.

Vì vậy, tôi cho rằng câu hỏi của tôi là thế này:

Đối với một "biến dựa trên" trò chơi trong j2me, cách tốt nhất để thực hiện các vòng lặp trò chơi là những gì, cho phép đầu vào chỉ handeling khi đến lượt của người chơi?

+0

Nhân tiện, câu hỏi hay. +1 – Fostah

Trả lời

3

Tôi sẽ tránh luồng cho logic trò chơi như luồng J2ME, tùy thuộc vào nhà sản xuất của khóa học, không làm tốt công việc chia sẻ tài nguyên giới hạn. Bạn thường sẽ thấy tạm dừng trong khi một luồng xử lý nặng. Tôi sẽ chỉ đề nghị các chủ đề để tải hoặc các tính năng kết nối mạng như trong trường hợp này, bạn sẽ chỉ cung cấp cho người dùng phản hồi "Đang tải ..." cơ bản.

Để xử lý việc này, tôi sẽ không có các vòng phụ để cập nhật từng AI trong một khung.Tôi sẽ làm một cái gì đó như sau trong hàm run:

public void run() { 
    while(true) { 
     // Update the Game 
     if(gameManager.isUsersTurn()) { 
      // Collect User Input 
      // Process User Input 
      // Update User's State 
     } 
     else { 
      // Update the active NPC based on their current state 
      gameManager.updateCurrentNPC(); 
     } 

     // Do your drawing 
    } 
} 

Bạn muốn tránh phải tất cả mọi thứ được cập nhật trong một khung hình như 1) cập nhật có thể được làm chậm, kết quả là không có phản hồi thị giác ngay lập tức cho người sử dụng 2) bạn có thể 'làm sống động từng NPC riêng lẻ khi họ thực hiện hành động của họ. Với thiết lập này, bạn có thể có trạng thái NPC, NPC_DECIDE_MOVE và NPC_ANIMATING, điều đó sẽ cho phép bạn kiểm soát nhiều hơn những gì NPC đang làm. NPC_ANIMATING về cơ bản sẽ đặt trò chơi ở trạng thái đợi cho hoạt ảnh diễn ra, tránh bất kỳ quá trình xử lý nào khác cho đến khi hoạt ảnh hoàn tất. Sau đó, nó có thể chuyển sang lượt NPC tiếp theo.

Ngoài ra, tôi sẽ chỉ có một gameManager.update() và gameManager.paint (g) (sơn sẽ được gọi là từ sơn) có thể xử lý mọi thứ và giữ cho phương pháp chạy mỏng.

Cuối cùng, bạn có nhìn vào flushGraphics() không? Với GameCanvas, bạn thường tạo một đối tượng Graphics, vẽ mọi thứ cho nó và sau đó gọi flushGraphics(), sau đó đợi. Phương pháp bạn đề cập là cách giải quyết nó cho lớp Canvas. Chỉ cần nghĩ rằng tôi sẽ đề cập đến điều này và đăng liên kết: Game Canvas Basics

5

Mặc dù không đặc biệt j2me bạn nên nắm bắt đầu vào của người dùng, chiến lược chung là xếp hàng đầu vào cho đến khi nó xử lý đầu vào.

input ---> queue <---> Manager(loop) 

Bằng cách này, bạn thậm chí có thể nhập tập lệnh cho mục đích gỡ lỗi.

Vì vậy, bạn không cần một chuỗi mới. Mỗi khi người dùng nhấn phím bạn lưu trữ chúng trong một bộ đệm, và sau đó xử lý nội dung của bộ đệm khi cần thiết. Nếu bộ đệm trình phát không có đầu vào, người quản lý phải bỏ qua tất cả các trò chơi, làm hình động và sau đó bắt đầu lại (vì trò chơi không phải là trò chơi hành động).

Các vấn đề liên quan