2012-07-21 69 views
2

新手程序员在这里工作,与开罗和快板5

我设计用快板5 2D游戏,我已经注意到,在快板位图工作时(从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,等等,但最后我同意开罗似乎是这份工作的合适工具。

最后,我们到达了原因后:

我的问题是:我怎样才能“勾开罗”到Allegro 5?

现在,我还没有和开罗做过任何工作,所以我没有拘束于此,但是我想继续使用Allegro,除非真的有很好的理由去切换别的东西。

Allegro有一个简单而直接的方式来创建显示并使用allegro命令对其进行绘制。但是开罗有自己的做事方式,而开罗似乎根本不管理展示。我可以想象两者协同工作的唯一方式是开罗接收绘图命令,绘制图像,将图像保存为png文件,然后打开allegro功能并在该文件中读取1帧。这不可能是评论者所掌握的。

反正,随意批评我的思维过程。我不会被冒犯。如果有一些简单的事情你觉得我还没有明白,请赐教。

+0

“只有在绘制原始图像到后台缓冲区时才会工作的主要限制”嗯,你还会在哪里绘制它?你是否对位图进行了大量的传输,然后你对其他位图进行传输?如果是这样,你不应该。 – 2012-07-21 09:11:29

+0

你需要问如何解决你原来的问题(在一个单独的问题)。要做到这一点,我们需要看看你用来渲染的实际代码是什么。你把马车放在马前。 – 2012-07-21 09:14:05

+0

对不起,我想我不应该直接批评原始图片。我只是觉得没人会这么做,因为它效率低下。我想我只是假设你有A)每个可能的旋转角度都有大量的精灵片B)有边缘混合方法来平滑粗糙的边缘,但我仍然不知道。 – NauticalMile 2012-07-21 18:37:21

回答

1

开罗可以渲染到一块内存,可以将其转移到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; 
} 

我相信它给你想要的样子。

+0

感谢您的回复。尽管我没有看到改进,但我实现了这个代码。也许我不清楚:我上传的图片只是我截取的截图中的一部分。我使用的实际图像只有50X50像素,而形状(角落)以外的区域是透明的。 – NauticalMile 2012-07-21 18:27:17

+0

似乎我可能对如何获得我正在寻找的东西有错误的想法(请参见上面的注释),但感谢您的帮助 – NauticalMile 2012-07-21 18:55:56

+0

是的,我使用了圆圈的50x50 PNG图像。您可能还想添加'ALLEGRO_MAG_LINEAR'和'ALLEGRO_MIPMAP'。上面的代码在OpenGL(Ubuntu)上进行了测试,并提供了非常明显的质量改进。如果你在Windows上,你会默认D3D,这可能会有点不同。 – Matthew 2012-07-21 19:05:15