oo游戏的“概念”

时间:2010-11-05 01:30:45

标签: c++ oop class class-design

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

例如足球比赛,当人类点击它时,询问场景类他是否踢球,如果他正在移动它。我希望这是可以理解的,而不是太抽象。

2 个答案:

答案 0 :(得分:1)

参与扑克游戏的类似问题:这就是我做的方式:

在您的示例中,将场景* the_scene添加到person的构造函数中。然后,当人被初始化时,将指针传递给场景。既然你说父母和孩子,如果父母是场景,那么它只会使用“这个”,它会发送父母的地址。

然后再说一遍,无论如何你似乎都是这样做的。还有一件事,如果你需要人与多个不直接在其中的类进行交互,你可以创建一些容器类来存储指向所有这些的指针,并且只传递一个人以避免使用构造函数。参数太多了。

答案 1 :(得分:1)

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

我不确定这对你有什么好处,但我把它输入为我的初步回复,所以我不妨提交。请注意,如果您正在谈论纯文本游戏,所有这些仍然是相关的,在这种情况下只需忽略对图形的暗示。游戏设计基于连续的游戏循环,可以简单地将其视为:

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

其中“tick”是游戏时钟的每次迭代,但是你选择实现它 - 基于fps,每秒,无论如何。在您的示例中,用户点击足球,游戏看到点击并告诉足球移动。要非常简单地执行此操作,请维护一个维护状态的类中所有游戏元素的列表。为了说明,这里有一个非常基本的方法可以实现这个:

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,Player的另一个类,其中有一个方法kick(足球)将传递的足球设置为运动 - 即设置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);
}

这可以改为维护,例如,层而不是整个游戏,然后更高级别的类可以按顺序调用每个层的更新,允许事物相互绘制,子项只与兄弟姐妹交互。有很多可能性。