Classe de jogo e função principal

8

Eu tenho uma classe de jogo com minhas principais funções de jogo e instâncias de objetos de jogo como tela, etc. Meu jogo é feito usando C ++ e SDL.

Eu estava pensando, no entanto, deveria ser uma função principal da minha classe? Ou devo fazer "Game game"; de "int main ();" e tem o loop dentro de main?

Minha dúvida é: se eu fizer isso de fora, principalmente, a maioria das minhas coisas terá que ser pública, e isso é meio ruim, não é?

Alguma ideia? Obrigado!

David Gomes
fonte
Isso não é algo que realmente importa. Escreva o que achar mais fácil. Isso pode ser feito de qualquer maneira ou de muitas outras maneiras, e a escolha afeta o seu jogo real de maneira nenhuma significativa.
Sean Middleditch

Respostas:

9

Você pode ter um único método público em sua Gameclasse para servir como ponto de entrada (por exemplo, um método chamado Run()). Então, a única coisa que você precisa fazer main()para colocar tudo em funcionamento seria chamar esse método - nada mais.

O Run()método pode começar inicializando todos os subsistemas e depois entrar no loop principal do jogo. Também deve cuidar de desligar tudo corretamente assim que o loop terminar.

Todo o resto da classe pode permanecer privado (ou protegido, se você preferir criar um jogo concreto herdando-o), porque ele só será necessário para a implementação do jogo.

Exemplo

Nota: ossos completamente nus, sem cálculos de tempo, loop de jogo extremamente simplista, apenas um exemplo para você começar. Para um jogo real, provavelmente deve ter muito mais complexidade do que isso:

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;
}

E no seu main()método:

int main()
{
    Game game;
    game.Run();
    return 0;
}
David Gouveia
fonte
11
Normalmente é assim que é feito. Torna mais fácil fornecer um bom lugar para uma captura de exceção de última chance, e agora você pode destruir seu jogo e recriá-lo facilmente.
Patrick Hughes
11
Eu concordo com a exceção (capturada na função main ())). Mas por que você quer destruir e recriar o jogo inteiro? (assim também a janela principal do SDL?). Não tenho certeza de entender.
tigrou
5
@ user1083855 nem todos os jogos são monstruosidades enormes, muitos são pequenos e simplesmente excluir todo o objeto do jogo e reconstruí-lo é muito mais fácil do que escrever um método Reset () e esperar que você se lembre de redefinir e limpar todos os estados. Portanto, é mais rápido escrever e não é necessário depurar. Mesmo alguns jogos grandes fazem isso com sistemas de mecanismo como mapas toda vez que você faz a transição ou sai do menu principal, então é realmente apenas uma questão de quanto é demolido e reconstruído, e não se é uma má ideia ou não.
Patrick Hughes
2
Se você constrói um jogo maior, é bom ter uma função de redefinição suave, melhora muito a experiência do usuário e, em alguns jogos, você não pode simplesmente desconstruir e reconstruir a classe do jogo. Digamos que você faça toda a sua configuração e inicialização na classe do jogo; isso é um problema de tempo; e se a classe do jogo controlar o sistema de menus, você realmente deseja que o jogo seja reiniciado apenas porque deseja sair do tipo de jogo atual? ? Isso depende completamente do design do seu jogo, mas adicionar funções principais é melhor agora do que depois.
Matt Jensen