Là một bài tập nhỏ, tôi đang cố gắng viết một công cụ trò chơi rất đơn giản, chỉ xử lý các thực thể (di chuyển, AI cơ bản, v.v.)Xử lý các thực thể trong một trò chơi
Như vậy, tôi đang cố gắng suy nghĩ về cách thức một trò chơi xử lý các bản cập nhật cho tất cả các thực thể, và tôi nhận được một chút bối rối (Có lẽ vì tôi đang đi về nó một cách sai)
Vì vậy, tôi quyết định đăng câu hỏi này ở đây để cho bạn thấy cách hiện tại của tôi suy nghĩ về nó, và để xem liệu có ai có thể gợi ý cho tôi cách làm tốt hơn không.
Hiện nay, tôi có một lớp CEngine mà mất con trỏ đến các lớp học khác mà nó cần (Ví dụ một lớp CWindow, CEntityManager lớp vv)
Tôi có một vòng lặp trò chơi mà trong mã giả sẽ đi như thế này (trong lớp CEngine)
while(isRunning) {
Window->clear_screen();
EntityManager->draw();
Window->flip_screen();
// Cap FPS
}
lớp CEntityManager tôi trông như thế này:
enum {
PLAYER,
ENEMY,
ALLY
};
class CEntityManager {
public:
void create_entity(int entityType); // PLAYER, ENEMY, ALLY etc.
void delete_entity(int entityID);
private:
std::vector<CEntity*> entityVector;
std::vector<CEntity*> entityVectorIter;
};
Và lớp CEntity của tôi trông như thế này:
class CEntity() {
public:
virtual void draw() = 0;
void set_id(int nextEntityID);
int get_id();
int get_type();
private:
static nextEntityID;
int entityID;
int entityType;
};
Sau đó, tôi sẽ tạo ra lớp ví dụ, đối với một kẻ thù, và cung cấp cho nó một tờ ma, chức năng riêng của mình, vv
Ví dụ:
class CEnemy : public CEntity {
public:
void draw(); // Implement draw();
void do_ai_stuff();
};
class CPlayer : public CEntity {
public:
void draw(); // Implement draw();
void handle_input();
};
Tất cả điều này làm việc tốt cho chỉ vẽ sprites vào màn hình.
Nhưng sau đó tôi đã đến vấn đề sử dụng các hàm tồn tại trong một thực thể, nhưng không phải trong một thực thể khác.
Trong ví dụ mã giả ở trên, do_ai_stuff(); và handle_input();
Như bạn thấy từ vòng lặp trò chơi của tôi, có một cuộc gọi đến EntityManager-> draw(); Điều này chỉ lặp lại thông qua entityVector và gọi là draw(); chức năng cho mỗi thực thể - Mà làm việc tốt nhìn thấy như tất cả các thực thể có một draw(); chức năng.
Nhưng sau đó tôi nghĩ, nếu đó là một thực thể người chơi cần xử lý đầu vào thì sao? Cách thức hoạt động?
Tôi chưa thử nhưng tôi giả sử rằng tôi không thể lặp lại như đã làm với hàm draw(), vì các thực thể như kẻ thù sẽ không có hàm handle_input().
tôi có thể sử dụng một câu lệnh if để kiểm tra entityType, như vậy:
for(entityVectorIter = entityVector.begin(); entityVectorIter != entityVector.end(); entityVectorIter++) {
if((*entityVectorIter)->get_type() == PLAYER) {
(*entityVectorIter)->handle_input();
}
}
Nhưng tôi không biết làm thế nào mọi người thường đi về cách viết công cụ này vì vậy tôi không chắc chắn về cách tốt nhất để làm đi.
tôi đã viết rất nhiều ở đây và tôi không yêu cầu bất kỳ câu hỏi cụ thể, vì vậy tôi sẽ làm rõ những gì tôi đang tìm kiếm ở đây:
- có phải là cách tôi đã đặt ra/thiết kế mã của tôi ok, và nó có thực tế không?
- Có cách nào hiệu quả hơn để tôi cập nhật các thực thể và chức năng gọi của mình mà các thực thể khác có thể không có?
- Đang sử dụng enum để theo dõi một thực thể có phải là cách hay để xác định các thực thể không?
Người đàn ông, anh chàng trong liên kết đó thực sự khủng khiếp. – Puppy
Có lẽ, nhưng anh ấy cũng lý do tại sao Ratchet & Clank không bao giờ thấp hơn 60fps. – Crashworks
@DeadMG: tốt, ông chỉ ra một số vấn đề thực tế, về hiệu suất và thiết kế. Anh ta cũng có vẻ không thích hợp với C++, và vắt vào một số bản sao hoàn toàn vô nghĩa (giống như cái chống lại các tham chiếu). Tuy nhiên, lọc ra sự nhảm nhí, và lời khuyên hiệu suất là khá vững chắc. – jalf