做2D动画的最佳方法是什么?

时间:2010-01-17 16:39:14

标签: c++ graphics

我正在写一个2D动画类,我有TGA张照片,其中存储了播放器动画。这些图片是8x8图块(因此每行有8帧移动字符)

但是,我没有关于如何在代码中设置动画的线索。

我正在考虑通过移动每帧的u-v坐标并仅返回当前帧来更新它。我怎么能这样做?

6 个答案:

答案 0 :(得分:3)

您的问题非常广泛,因此广泛回应;)

自Qt4.6(一个月前)以来,有一个动画框架。看起来非常有趣(还没有时间真正用它编码)。

因为它是Qt,它意味着很好的API,多平台,良好的文档和可能不错的性能。

http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Utilities/qtanimationframework

当然,也许你不想依赖Qt。

答案 1 :(得分:3)

Sup dawg。

当您使用包含所有动画状态的纹理的UV坐标时,您需要将像素坐标转换为UV坐标。

如果您的精灵宽32像素且纹理宽256像素(因此包含8帧),您需要将精灵的宽度除以纹理的宽度,在...之间给出一个数字。 0和1!这是你的抵消。要从条带中获取框架,只需执行以下操作:

float step_size_x = (float)(width) / (float)(texture_width);
float step_size_y = (float)(height) / (float)(texture_height);

float begin_u = step_size_x * step_current_x;
float begin_v = step_size_y * step_current_y;
float end_u = begin_x + step_size_x; // basically, if you want sprite 0, you go from 0 to the x of sprite 1
float end_v = begin_y + step_size_y;

就是这样!现在,如果你想复制纹理的一部分,那将是OpenGL中的以下内容:

glBindTexture(GL_TEXTURE_2D, texture_id);
glBegin(GL_TRIANGLE_STRIP);
    glTexCoord2f(begin_u, begin_v);   glVertex3f(x - (width / 2), y - (height / 2), 0);
    glTexCoord2f(end_u, begin_v);     glVertex3f(x + (width / 2), y - (height / 2), 0);
    glTexCoord2f(begin_u, end_u);     glVertex3f(x - (width / 2), y + (height / 2), 0);
    glTexCoord2f(end_u, end_u);       glVertex3f(x + (width / 2), y + (height / 2), 0);
glEnd(); 

既然我已经为您提供了完整的代码示例,那么请您继续打扰我的游戏吗? :P

答案 2 :(得分:2)

如果您使用的是Windows Direct2D,那么现在就可以了。

答案 3 :(得分:2)

您没有提供足够的有关环境,计划的游戏设计和当前引擎结构的信息来提出具体的建议,所以这里是一般建议:

没有一种最佳解决方案。获取绘图然后使用它直到它开始破碎,然后迭代;这是一个非常与游戏设计相关的问题,游戏设计是以迭代为基础的,因此将迭代降低到引擎级别(而不是烦恼并尝试在门外提出“完美解决方案”)最终成为探索游戏玩法这一方面的最佳方式。您的解决方案可能有多大差异的一些示例:

如果在“玩家实体”处于某种状态(例如,步行,跳跃,空闲)时只有循环框架的动画,那么你保留一个帧计数器,用游戏的时间步长递增它,并绘制根据柜台的框架。

如果您的动画需要大量的上下文信息才能正确显示,比如转向不同的面板,抓住壁架等,那么您需要添加额外的状态检查以及帧计数器​​,如果有足够的您可能希望将其形式化为每个帧运行的有限状态机的状态形式。您可能还有一些与实体状态相关的程序效果:旋转,闪烁,缩放,着色器......

如果动画触发游戏事件(比如挥拳)你将不得不决定是将这些信息直接放在动画代码中,还是引入一个数据驱动机制来“立即触发此事件,生成此对象,转向在这个碰撞卷上......“

然后有一些细节,如原点,图像大小(某些动画的大小可能随时间而变化),可变的播放速度....

像我前面说过的那样,不要尝试完美的解决方案。这取决于游戏需要什么。

答案 4 :(得分:1)

就实际绘制到屏幕而言,如果这是您在问题中所要求的,那么SDL使用起来相对简单,功能非常强大。
此外,Lazy Foo's教程在文档方面非常好。

答案 5 :(得分:0)

您所描述的内容听起来比2D动画更接近视频,您可能更善于研究某些视频编解码器。

但是,OpenGL也是一个很好的起点。