这可能是错误的方法,但是当我更深入地开发游戏引擎时,我遇到了时间问题。

因此,可以说我有一组语句,例如:

for(int i = 0; i < 400; i++)
{
     engine->get2DObject("bullet")->Move(1, 0);
}


项目符号将移动,但是,在屏幕上将没有任何动画。它基本上将从屏幕的一个部分“弯曲”到下一个部分。

因此,我正在考虑...为每个基础对象(用户从中继承)创建一个函数指针向量,当他们调用“ Move”时,实际上直到下一次游戏循环时才移动该对象。
所以像这样:

while(game.running())
{
     game.go();
}

go()
{
     for(...)
          2dobjs.at(i)->action.pop_back();
}


或类似的东西,通过这种方式,它在每​​次迭代期间仅对每个对象运行单个动作(当然,我将添加检查以查看是否确实存在要运行的“动作”)。

如果那是个好主意,我的问题是如何存储参数。由于每个对象都可以执行多种动作而不是移动(rotateby是一个示例),因此我认为创建一种类似于以下内容的结构是没有意义的:

struct MoveAction {
     MovePTR...;
     int para1;
     int para2;
};


有什么想法吗?还是这是完全错误的方向?

最佳答案

我认为这不是正确的方向。在函数指针向量中存储400个移动之后,您仍然需要弹出并执行移动,重画屏幕并重复。仅移动(),重绘和重复是否更容易?

我想说您的子弹正在变形是因为它移动了400像素/帧,而不是因为您需要延迟移动计算。

但是,如果这是您的体系结构的正确解决方案,则在C ++中,应使用类而不是函数指针。例如:

class Action // an abstract interface for Actions
{
public:
    virtual void execute() = 0; // pure virtual function
}

class MoveAction: public Action
{
public:
    MoveAction(Point vel) : velocity(vel) {}
    virtual void execute();
    Point velocity;
    ...
}

std::vector<Action*> todo;

gameloop
{
    ...
    todo.push_back(new MoveAction(Point(1,0))
    ...
}

10-04 20:20