Lớp trò chơi và chức năng chính


8

Tôi có một lớp Trò chơi với các chức năng trò chơi chính của mình và các thể hiện của các đối tượng trò chơi như màn hình, v.v. Trò chơi của tôi được tạo bằng C ++ và SDL.

Tôi đã tự hỏi, mặc dù, chính nên là một chức năng của lớp học của tôi? Hoặc tôi nên làm "Trò chơi trò chơi;" từ "int main ();" và có vòng lặp bên trong chính?

Nghi ngờ của tôi là - nếu tôi làm điều đó từ bên ngoài chính, thì hầu hết mọi thứ của tôi sẽ phải được công khai, và điều đó hơi tệ, phải không?

Có ý kiến ​​gì không? Cảm ơn bạn!


Đây không phải là một cái gì đó thực sự quan trọng. Viết bất cứ điều gì bạn nghĩ là dễ dàng hơn. Nó có thể được thực hiện theo cách này hoặc nhiều cách khác, và sự lựa chọn ảnh hưởng đến trò chơi thực tế của bạn không có ý nghĩa gì cả.
Sean Middleditch

Câu trả lời:


9

Bạn có thể có một phương thức công khai duy nhất trong Gamelớp để phục vụ như một điểm vào (ví dụ: một phương thức được gọi Run()). Sau đó, điều duy nhất bạn cần làm bên trong main()để có được mọi thứ và chạy sẽ là gọi phương thức đó - không có gì hơn.

Các Run()phương pháp có thể bắt đầu bằng cách khởi tạo tất cả các hệ thống con và sau đó tiến hành để vào vòng đấu chính. Nó cũng nên quan tâm đến việc tắt tất cả mọi thứ đúng cách khi vòng lặp kết thúc.

Mọi thứ khác trong lớp có thể được giữ riêng tư (hoặc được bảo vệ nếu bạn muốn tạo một trò chơi cụ thể bằng cách kế thừa từ nó) bởi vì nó sẽ chỉ cần thực hiện trong trò chơi của bạn.

Thí dụ

Lưu ý: Hoàn toàn trống rỗng, không tính toán thời gian, vòng lặp trò chơi cực kỳ đơn giản, chỉ là một ví dụ để bạn bắt đầu. Đối với một trò chơi thực tế, nó có thể có độ phức tạp cao hơn nhiều so với điều này:

class Game
{
public:
    void Run()
    {
        Initialize();
        while(_running)
            Frame();
        Shutdown();
    }

private:
    void Initialize() { /* Initialize subsystems */ }
    void Shutdown() { /* Shutdown subsystems */ }
    void Frame() { /* Update and draw game */ }
    bool _running = true;
}

Và về main()phương pháp của bạn :

int main()
{
    Game game;
    game.Run();
    return 0;
}

1
Đây thường là cách nó được thực hiện. Nó giúp dễ dàng hơn để cung cấp một vị trí tốt để bắt ngoại lệ cơ hội cuối cùng, cộng với bây giờ bạn có thể phá hủy trò chơi của mình và tạo lại nó một cách dễ dàng.
Patrick Hughes

1
Tôi đồng ý cho ngoại lệ (bắt trong hàm main ()). Nhưng tại sao bạn lại muốn phá hủy và tái tạo lại toàn bộ trò chơi? (do đó cũng là cửa sổ SDL chính?). Không chắc chắn để hiểu.
tigrou

5
@ user1083855 không phải tất cả các trò chơi đều là những quái vật khổng lồ, nhiều trò chơi nhỏ và chỉ đơn giản là xóa toàn bộ đối tượng trò chơi và xây dựng lại nó dễ dàng hơn nhiều so với việc viết phương thức Reset () và hy vọng rằng bạn nhớ đặt lại và xóa tất cả các trạng thái. Vì vậy, nó vừa nhanh hơn để viết và không cần gỡ lỗi. Ngay cả một số trò chơi lớn cũng làm điều này với các hệ thống động cơ như bản đồ mỗi khi bạn chuyển đổi hoặc thoát khỏi menu chính, vì vậy thực sự chỉ là vấn đề bị phá hủy và xây dựng lại bao nhiêu và không phải là ý tưởng tồi hay không.
Patrick Hughes

2
Nếu bạn xây dựng một trò chơi lớn hơn, thật tuyệt khi có chức năng thiết lập lại mềm, nó giúp mọi thứ trở nên tốt hơn cho người dùng, và đối với một số trò chơi, bạn không thể giải mã và tái cấu trúc lớp trò chơi. Giả sử bạn thực hiện tất cả cài đặt và khởi tạo trong lớp trò chơi, sau đó là vấn đề thời gian, nếu lớp trò chơi của bạn kiểm soát hệ thống menu của bạn, bạn có thực sự muốn trò chơi khởi động lại chỉ vì bạn muốn thoát khỏi loại trò chơi hiện tại ? Điều này hoàn toàn phụ thuộc vào thiết kế trò chơi của bạn, nhưng thêm các chức năng cốt lõi bây giờ tốt hơn sau này.
Matt Jensen
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.