gpt4 book ai didi

c++ - oo游戏的 "concept"

转载 作者:行者123 更新时间:2023-11-30 04:37:06 24 4
gpt4 key购买 nike

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

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

最佳答案

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

我不确定这是否对您有任何好处,但我将其输入以作为我的初始回复,所以我不妨提交。请注意,如果您谈论的是纯文本游戏,那么所有这些仍然是相关的,在这种情况下请忽略对图形的暗示。游戏设计基于连续的游戏循环,可以非常简单地认为:

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

“滴答”是游戏时钟的每次迭代,无论您选择如何实现它——基于 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(football) 将传递的足球设置为运动——即设置 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);
}

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

关于c++ - oo游戏的 "concept",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4102890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com