首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在OpenGL中实现动画

在OpenGL中实现动画
EN

Stack Overflow用户
提问于 2012-02-27 11:45:34
回答 1查看 597关注 0票数 0

我很难想出一种方法来实现类似吐温的动画,比如移到currentX+3,在那里你只放了deltaX,剩下的就被插进去了。我现在要做的是:

绘图/opengl线程,它跟踪绘图时间并处理框架:

代码语言:javascript
代码运行次数:0
运行
复制
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值来激活:

代码语言:javascript
代码运行次数:0
运行
复制
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以移动对象。谢谢兹科德!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-27 12:58:48

所以,从本质上说,你现在谈论的情况是一个物理线程(“逻辑线程”)和一个图形线程。我认为你想问自己的第一个问题是,是否值得把它们分成不同的线程;你的逻辑/物理实际上是否计算密集到足以对你的框架产生负面影响?对于一个简单的游戏,您将保存bug和努力,保持他们在一个循环。对于每个功能类别,代码肯定应该使用不同的文件进行分解,但是它们都可以在同一个线程上运行(步骤逻辑一次,绘制,重复)。

采用单线程方法的原因之一是现在看来你的物理运行速度越快越好,这实际上不是个好主意。你会因为小的精度增加而消耗大量的能量--可能是精度下降,这取决于游戏代码的外观。除非你的物理非常复杂,而且需要很高的精度,否则你的物理框架要比你的图形框架高得多。

我喜欢您的动画对象的想法;您如何做到这一点在很大程度上取决于GameObjects可以包含什么或者您的动画对象可能想要改变什么。我建议编写GameObject以符合动画对象可以用来对其进行变异的协议;如果您在C++中,最简单的实现方法是让所有GameObjects继承根GameObject类。然后,您的动画对象可以包含有关如何修改GameObject的信息。

如果我们在C++,我建议:

根GameObject类方法:

其他状态游戏对象所拥有的position

  • set/get orientation

  • set/get设置/获取
  • ;大小?颜色?速度?

根动画类是一个具有一个(虚拟)方法的虚拟类:

  • 将动画应用于对象

然后子类动画根类来执行单独的动画,例如AnimationTranslate可以在对象的位置和角度上添加一个偏移量,或者AnimationScale可以改变大小,或者AnimationGravity可以将对象加速到屏幕底部。

类似的设计可以在任何面向对象的语言中完成。你也可以用直截了当的C来完成它;如果你这样做了,你可能会想要把函数指针成员放入你的结构中。如果您使用的语言具有sum类型,则可以使用sum类型代替继承层次结构用于动画;同样的想法也适用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9464470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档