2010-11-05 92 views
1

在大多数或所有面向对象的游戏中,每个类不仅依赖于它自己的父类。这个类的连接是如何在C++中实现的?你只需要为你需要的父类添加一个指针,或者有更好的方法吗?oo游戏的“概念”

例如一场足球比赛,当人员点击它时,问场景课程他是否踢任何球,并且他是否随后移动它。我希望这是可以理解的,不要太抽象。

回答

1

我不认为在构造函数中传递父项是一个好主意。相反,您应该使用一个维护所有游戏元素和设施之间交互的列表;例如,下面所示的游戏类将检查任何两个玩家之间的碰撞,并且如果它被检测到告诉他们每个人他们被击中以及由谁击中。

我不确定这是否会对您有所帮助,但我已将其输入以供初始回复,因此我不妨提交。请注意,如果您正在讨论纯文本游戏,所有这些仍然是相关的,只是在这种情况下忽略对图形的暗指。游戏的设计是围绕一个连续的游戏循环,并且可以被认为是非常简单的:

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

其中,“嘀”的比赛计时钟的每一次迭代,但是你选择来实现它 - 基于FPS ,每一秒,无论如何。在你的例子中,用户点击足球,游戏看到点击并告诉足球移动。要做到这一点很简单,维护一个列表中维护状态的所有游戏元素。为了说明,这里是你可以实现这是一个非常基本的方法:设置传入揽入motion--

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

假设有另一个类,从GameElement,播放器继承,有一种方法踢(足球)即,set kicked = True。所以初始化游戏,你会喜欢的东西将它设置:

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

可以改成维护,例如层,而不是整场比赛,再上一个台阶类可以调用每个更新按顺序排列图层,允许将事物涂在彼此之上,让孩子只与兄弟姐妹互动。有很多可能性。

1

陶然成在扑克游戏的工作类似的问题:这是我所采取的方式:

在你的榜样,一个场景* the_scene添加到人的构造函数。然后,当人初始化时,传递一个指向场景的指针。既然你说父母和孩子,如果父母是场景,那么它只会使用“this”,它会发送父母的地址。

然后,看起来好像你是这么做的。还有一件事,如果你需要人与多于一个类不直接交互的类进行交互,你可以创建一些容器类来存储指向它们的指针,并且只传递一个类来避免构造函数与参数太多。