这可能是错误的方法,但是当我更深入地开发游戏引擎时,我遇到了时间问题。
因此,可以说我有一组语句,例如:
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))
...
}