在大多数或所有面向对象的游戏中,每个类不仅依赖于自己的类而且依赖于父类。如何在C ++中实现此类连接?你只是为你需要的父类添加一个指针,还是有更好的方法?
例如足球比赛,当人类点击它时,询问场景类他是否踢球,如果他正在移动它。我希望这是可以理解的,而不是太抽象。
答案 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);
}
这可以改为维护,例如,层而不是整个游戏,然后更高级别的类可以按顺序调用每个层的更新,允许事物相互绘制,子项只与兄弟姐妹交互。有很多可能性。