【发布时间】:2011-04-20 08:53:05
【问题描述】:
这可能是错误的方法,但是当我深入研究开发我的游戏引擎时,我遇到了时间问题。
假设我有一组语句,例如:
for(int i = 0; i < 400; i++)
{
engine->get2DObject("bullet")->Move(1, 0);
}
子弹会移动,但是在屏幕上不会有任何动画。它基本上会从屏幕的一个部分“扭曲”到下一个部分。
所以,我在想...为每个基础对象(用户继承自)创建一个函数指针向量,当他们调用“移动”时,我实际上不会移动对象,直到游戏的下一次迭代环形。 所以像:
while(game.running())
{
game.go();
}
go()
{
for(...)
2dobjs.at(i)->action.pop_back();
}
或者类似的东西,这样在每次迭代期间它只运行每个对象的一个动作(当然我会添加一个检查,看看是否真的有“动作”要运行)。
如果这是个好主意,我的问题是如何存储参数。由于每个对象可以做不止一种类型的“动作”而不是移动(rotateby 就是一个例子),我认为创建一个类似于以下方式的结构是荒谬的:
struct MoveAction {
MovePTR...;
int para1;
int para2;
};
想法?或者这是完全错误的方向?
【问题讨论】:
-
你是说如果你在一帧中移动你的“子弹”400次,引擎不会绘制中间步骤?我不确定我是否理解您要解决的问题。
-
我认为我明白你在问什么,但我不确定。您希望子弹在屏幕上移动得足够慢以便被看到。你有一个主游戏循环,其中
go()每秒执行 10 次。我在正确的轨道上吗? -
@Seth 对,因为循环是在下一个循环开始之前执行的,所以引擎不会绘制发生了什么。就本例中的引擎而言,坐标发生了变化,而不是物体实际移动了。 @Beta是的,我希望在执行循环中每次执行一次“移动”功能,这样它就会产生“移动”而不是包装的效果。所以,你说循环将执行是正确的,例如每秒 10 次,但由于“移动循环”在下一个游戏循环之前执行,玩家看不到它“移动”。
-
要真正迂腐,我认为您的意思是“warp”而不是“wrap”。
-
@JoshD 你知道我的意思 :)...但我还是修正了错字。
标签: c++ design-patterns oop