我很难想出一种方法来实现类似吐温的动画,比如移到currentX+3,在那里你只放了deltaX,剩下的就被插进去了。我现在要做的是:
绘图/opengl线程,它跟踪绘图时间并处理框架:
public void onDrawFrame(GL10 gl) {
endingTime = System.currentTimeMillis();
int timeElapsed = (int) (endingTime - startingTime);
if (timeElapsed < FRAMEDURATION_MILISEC) {
try {
Thread.sleep(FRAMEDURATION_MILISEC - timeElapsed);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
startingTime = System.currentTimeMillis();
Game.renderGame(gl);
}
和一个逻辑线程,它通过更改GameObjects‘x和y值来激活:
static long RATE = 30l; // times
static long duration = 1000l / RATE;
public void run() {
lastUpdate = System.currentTimeMillis();
long dur = duration; // copy
while (Game.running) {
long tElapsed = System.currentTimeMillis() - lastUpdate;
if (tElapsed >= dur) {
lastUpdate = System.currentTimeMillis();
Game.updateGame(tElapsed);
} else {
try {
GameLogicThread.sleep(dur - tElapsed);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我想要实现一个动画类,例如,我可以为GameObject设置一个x的差异,并将这个动画对象应用到GameObject中,以便在绘图或逻辑循环中更新位置。
我不知道该在哪里做这件事,也不知道该如何保持一个干净的结构。有人能帮我吗?
编辑:
谢谢,我现在做了一个GLAnimation类,您可以通过它传递dX、dY、dRotation、dScale等,然后计算出对象每毫秒必须更改的速度。通过将此动画对象调用应用于GameObject,因此更新和呈现调用可以传递timeElapsed以移动对象。谢谢兹科德!
发布于 2012-02-27 04:58:48
所以,从本质上说,你现在谈论的情况是一个物理线程(“逻辑线程”)和一个图形线程。我认为你想问自己的第一个问题是,是否值得把它们分成不同的线程;你的逻辑/物理实际上是否计算密集到足以对你的框架产生负面影响?对于一个简单的游戏,您将保存bug和努力,保持他们在一个循环。对于每个功能类别,代码肯定应该使用不同的文件进行分解,但是它们都可以在同一个线程上运行(步骤逻辑一次,绘制,重复)。
采用单线程方法的原因之一是现在看来你的物理运行速度越快越好,这实际上不是个好主意。你会因为小的精度增加而消耗大量的能量--可能是精度下降,这取决于游戏代码的外观。除非你的物理非常复杂,而且需要很高的精度,否则你的物理框架要比你的图形框架高得多。
我喜欢您的动画对象的想法;您如何做到这一点在很大程度上取决于GameObjects可以包含什么或者您的动画对象可能想要改变什么。我建议编写GameObject以符合动画对象可以用来对其进行变异的协议;如果您在C++中,最简单的实现方法是让所有GameObjects继承根GameObject类。然后,您的动画对象可以包含有关如何修改GameObject的信息。
如果我们在C++,我建议:
根GameObject类方法:
其他状态游戏对象所拥有的position
根动画类是一个具有一个(虚拟)方法的虚拟类:
然后子类动画根类来执行单独的动画,例如AnimationTranslate可以在对象的位置和角度上添加一个偏移量,或者AnimationScale可以改变大小,或者AnimationGravity可以将对象加速到屏幕底部。
类似的设计可以在任何面向对象的语言中完成。你也可以用直截了当的C来完成它;如果你这样做了,你可能会想要把函数指针成员放入你的结构中。如果您使用的语言具有sum类型,则可以使用sum类型代替继承层次结构用于动画;同样的想法也适用。
https://stackoverflow.com/questions/9464470
复制相似问题