2010-11-05 12 views
1

Dans la plupart ou tous les jeux orientés objet, chaque classe repose non seulement sur ses propres classes, mais sur les classes parentes. Comment cette connexion de classe est-elle implémentée en C++? Ajoutez-vous simplement un pointeur pour la classe parente dont vous avez besoin ou y a-t-il un meilleur moyen?Le «concept» d'un jeu oo

Par exemple, un jeu de football, lorsque la classe clique dessus, demande à la classe de scène s'il donne des coups de pied dans les balles, et s'il le fait, déplacez-le. J'espère que cela est compréhensible et pas trop abstrait.

Répondre

1

Je ne pense pas que le fait de passer le parent dans un constructeur soit une bonne idée. Au lieu de cela, vous devriez utiliser une classe qui maintient une liste de tous les éléments de jeu et des interactions d'installations entre eux; par exemple, la classe de jeu illustrée ci-dessous permettrait de vérifier les collisions entre deux joueurs et si elle est détectée, dites à chacun d'eux qu'ils ont été touchés et par qui. Je ne suis pas sûr si cela vous sera bénéfique, mais je l'ai tapé pour ma première réponse, donc je pourrais aussi soumettre. Notez que tout cela est toujours pertinent si vous parlez d'un jeu en mode texte, ignorez simplement les allusions aux graphiques dans ce cas. La conception du jeu est basé autour d'une boucle de jeu continue, et peut être considéré tout simplement comme:

while(true) 
    for each tick: 
     react to user input 
     update player, enemies, objects, etc. 
end while 

Où « tick » est chaque itération de l'horloge de jeu, mais vous choisissez de mettre en œuvre - sur la base des images par seconde , chaque seconde, peu importe. Dans votre exemple, l'utilisateur clique sur le ballon de football, le jeu voit le clic et demande au football de se déplacer. Pour ce faire très simplement, maintenez une liste de tous les éléments du jeu dans une classe qui maintient l'état. Pour illustrer, voici est une façon très simple, vous pouvez mettre en œuvre ceci:

class Game { 
    vector<GameElement> elements; 
Football football; 
Player currentPlayer; 

Game() { 
    this.football = new Football(); 
} 

    void update() { 
     for e in elements: 
      e.update(); 

     // Once every element has been updated for the current tick, redraw them on the screen 
     screen.redraw(); 
    } 
    void addElement(GameElement e) { 
     elements.add(e); 
    } 
} 

class GameElement { 
    int posx, posy;  // screen coordinates 
    void paint() {}; // method to draw this element to the screen 
    virtual void update(); 
} 

class Football: public GameElement { 
    bool kicked; 
    int anglex, angley; 
    double velocity; 

    void update() { 
     if(kicked){ 
      // update position, angle, velocity; slow it down, check for bounce, whatever 
      posx = new x position; 
      posy = new y position; 
     if(velocity == 0) 
      kicked = false;  
     } 
     paint(); // call the paint method after the new position has been found 
    } 
} 

Supposons que vous avez une autre classe qui hérite de GameElement, joueur, avec un coup de pied de la méthode (de football) qui définit le ballon passé dans motion-- c'est-à-dire, définit kicked = True. Donc, pour initialiser le jeu, vous souhaitez le configurer avec quelque chose comme:

Game game = Game(); 
game.add(new Football()); 
game.add(new Player()); 
while(true) { 
if(user_input==X) 
    game.currentPlayer.kick(football); 
    game.update(); 
    sleep(1); 
} 

Cela pourrait être changé pour maintenir, par exemple, des couches au lieu de l'ensemble du jeu, puis une classe de niveau supérieur pourrait appeler la mise à jour de chaque Couchez dans l'ordre, permettant aux objets d'être peints les uns sur les autres et aux enfants d'interagir uniquement avec leurs frères et sœurs. Il y a beaucoup de possibilités.

1

questions similaires se heurtaient à des travaillant sur un jeu de poker: Voici la façon dont je l'ai fait:

Dans votre exemple, ajoutez une scène * the_scene au constructeur de la personne. Ensuite, lorsque la personne est initialisée, passez-lui un pointeur vers la scène. Puisque vous avez dit parent et enfant, si le parent est Scene, il utilisera simplement "this" et enverra l'adresse du parent.

Ensuite, il semble que c'est comme ça que vous alliez le faire quand même. Encore une chose, si vous avez besoin d'interagir avec plus d'une classe qui ne se trouve pas directement à l'intérieur, vous pouvez créer une sorte de conteneur qui stockerait les pointeurs sur chacun d'entre eux et passer la personne pour éviter d'avoir un constructeur avec trop de paramètres.