2012-07-21 96 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