gpt4 book ai didi

c++ - 使用 Cairo 和 Allegro 5

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:31:20 25 4
gpt4 key购买 nike

这里是新手程序员,

我正在使用 Allegro 5 设计一个 2d 游戏,我注意到在 allegro 中处理位图时(实际上是从 photoshop 导出的 png 文件...),旋转后的图像看起来不够清晰:rotated meteor

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

首先,我真的想避免创建包含所有不同旋转位置的 Sprite 表,原因如下:

我对 meteor 和我正在创建的所有其他物体产生了不同的“效果”,这些物体需要在物体周围发光。我将在每个对象周围应用至少 6 种不同的发光颜色。现在,这些 meteor 中的每一个都需要旋转 30 帧才能显得平滑。比方说,我想要在游戏中像这样工作的区区 10 个不同的对象;仅这些对象就有 1800 个文件!

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

我已经尝试研究各种 photoshop 技术,但我能想到的最好方法是在 photoshop 中将圆圈稍微变小,然后让它“发光”相同的灰色阴影,这在某种程度上解决了旋转问题,但它使 meteor 看起来很模糊。

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

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

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

As an aside, if you don't need realtime performance for a game, you could also hook into libcairo to draw nice looking vector graphics. It's extremely simple to hook it into Allegro, but that's a different topic.

所以我再次研究了图形库以及它们如何解决我的问题。我查看了 Cairo、SDL、Qt、ImageMagic 等,但最后我同意 Cairo 似乎是完成这项工作的合适工具。

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

我的问题是:如何将 Cairo 连接到 Allegro 5?

现在,我没有用 Cairo 做过任何工作,所以我没有被它束缚,但我想继续使用 Allegro,除非有充分的理由切换到其他东西。

Allegro 有一种简单直接的方法来使用 allegro 命令创建显示并向其绘图。但是cairo有自己的一套做事方式,好像cairo根本不管理显示器。我可以想象两者一起工作的唯一方法是 Cairo 接收绘图命令,绘制图像,将图像保存为 png 文件,然后打开 allegro 函数并在该文件中读取 1 帧。这不可能是评论者的意思。

无论如何,请随意批评我的思维过程。我不会生气的。如果有什么简单的地方你认为我没有理解,请赐教。

最佳答案

Cairo 可以渲染到一 block 内存,可以将其传输到 Allegro 位图中。然而,性能对于实时游戏来说是 Not Acceptable 。它对于绘制图表、将 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;
}

我相信它会给您带来理想的外观。

关于c++ - 使用 Cairo 和 Allegro 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11589929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com