与开罗和Allegro合作5

时间:2012-07-21 06:11:29

标签: c++ cairo allegro5

新手程序员,

我正在使用Allegro 5设计一款2D游戏,我注意到当使用allegro中的位图(实际上从photoshop导出的png文件......)时,旋转的图像看起来不如恒星:rotated meteor

左边的那个是原始方向,右边的那个是旋转10度。它们有点小,但边缘质量的差异很明显。

首先,我会真的喜欢避免创建包含所有不同旋转位置的精灵表,原因如下:

我对流星和我正在创建的所有其他对象发生了不同的'效果',需要围绕对象发光。我将在每个物体周围应用至少6种不同的发光颜色。现在这些流星中的每一个都需要有30帧旋转才能显得平滑。让我们说我想在游戏中使用一个非常小的10个不同的对象,就像这样工作;这是1800个文件只是为了那些对象!

我宁愿专注于寻找一种更好的方式来显示旋转的图像,而不是花时间去做。

我已经尝试过研究各种Photoshop技术,但我能想到的最好的方法是让Photoshop中的圆圈稍微小一些,然后让它“发光”同样的灰色阴影,这样可以解决旋转问题,但它会使流星看起来很模糊。

然后我做了一些研究,发现Allegro 5中提供了各种混合选项。我在al_set_blender中尝试了所有可能的选项 - 它们都没有解决锯齿状边缘的问题。

最后,我再次搜索了如何处理这个问题,并在Allegro 5中发现this post关于抗锯齿的问题。正如答案中指出的那样,有一个抗锯齿选项可用,但主要限制仅在将基元绘制到后台缓冲区时工作。实际上实现这一点将是大量的工作,并且每次绘制所有必需的原语似乎效率很低。

然而,在另一篇文章引起我注意的是这条评论:

  

顺便说一句,如果你不需要游戏的实时性能,你也可以挂钩到libcairo来绘制漂亮的矢量图形。将它挂钩到Allegro非常简单,但那是一个不同的主题。

所以我再次对图形库进行了研究,以及它们如何解决我的问题。我看了开罗,SDL,Qt,ImageMagic等,但最后我同意开罗似乎是这项工作的正确工具。

最后我们得出了这篇文章的原因:

我的问题是:我怎样才能“将Cairo挂钩”进入Allegro 5?

现在,我还没有与开罗做过任何工作,所以我没有被束缚,但我想继续使用Allegro,除非有很好的理由转换到别的东西。

Allegro有一种简单直接的方法,可以使用allegro命令创建显示和绘图。但开罗有自己的做事方式,而且开罗似乎根本没有管理显示器。我可以想象两个合作的唯一方法是开罗接收绘图命令,绘制图像,将图像保存为png文件,然后打开allegro功能并在该文件中读取1帧。这不是评论者所得到的。

无论如何,随意批评我的思考过程。我不会被冒犯。如果有一些简单的你认为我还没有理解,请赐教。

1 个答案:

答案 0 :(得分:1)

Cairo可以渲染到一块内存,可以将其转换为Allegro位图。但是,对于实时游戏来说,性能是不可接受的。这对于绘制图表,将SVG图像加载到静态位图等更有用。除了性能之外,我还没有看到它如何帮助旋转位图。

您所说的“抗锯齿”仅适用于原语。因此,您链接的问题无关紧要。如果在创建/加载旋转位图之前使用这些选项可能会有所帮助:

al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR | ALLEGRO_MIPMAP);

它们通常适用于缩放位图,但您的轮换可能符合条件。

最后,使用预乘alpha(默认的混合器)可以获得更好的效果。

我刚用你的图片测试了这个:

#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>

int main()
{
  ALLEGRO_BITMAP *circle;

  al_init();
  al_init_image_addon();

  al_create_display(640, 480);

  al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR);

  circle = al_load_bitmap("circle.png");
  if (!circle) return 0;

  al_clear_to_color(al_map_rgb(0,0,0));
  al_draw_bitmap(circle, 100, 100, 0);

  al_draw_rotated_bitmap(circle, 25, 25, 200, 200, 0.174, 0);

  al_flip_display();

  al_rest(5);

  return 0;
}

我相信它会给你理想的外观。