2

初心者プログラマーはこちら

Allegro 5 を使用して 2D ゲームを設計していますが、allegro でビットマップ (実際には Photoshop からエクスポートされた png ファイル...) を操作すると、回転した画像が恒星よりも小さく見えることに気付きました:回転した流星

左側が元の向きで、右側が 10 度回転したものです。少し小さいですが、エッジ品質の違いは明らかです。

まず、次の理由から、さまざまな回転位置をすべて含むスプライト シートを作成することは避けたいと思います。

私は流星と私が作成している他のすべてのオブジェクトにさまざまな「効果」が起こっており、オブジェクトの周りにグローが必要です。各オブジェクトの周りに少なくとも 6 つの異なる光る色を適用します。これらの各流星が滑らかに見えるようにするには、おそらく 30 フレームの回転が必要です。ゲーム内で、このように機能するわずか 10 個の異なるオブジェクトが必要だとしましょう。これらのオブジェクトだけで 1800 ファイルになります。

時間をかけるよりも、回転した画像を表示するためのより良い方法を見つけることに集中したいと思います。

私はさまざまなフォトショップのテクニックを研究してみましたが、私が思いつくことができる最善の方法は、フォトショップで円をわずかに小さくしてから、回転の問題を解決するのと同じ灰色の色合いを「光らせる」ことですが、流星がぼやけて見えるようにします.

その後、さらに調査を行ったところ、Allegro 5 でさまざまなブレンド オプションが利用できることがわかりました。al_set_blender で可能なすべてのオプションを試しましたが、ギザギザのエッジの問題に対処するものはありませんでした。

最後に、これに対処する方法を再度検索し、Allegro 5 のアンチエイリアシングに関するこの投稿を発見しました。回答で指摘されたように、アンチエイリアシング オプションが利用可能ですが、プリミティブを描画するときにのみ機能するという大きな制限があります。バックバッファへ。これを実際に実装するのは大変な作業であり、必要なすべてのプリミティブを毎回描画するのは非常に非効率的です。

しかし、他の投稿で私の注意を引いたのは、次のコメントでした。

余談ですが、ゲームにリアルタイム パフォーマンスが必要ない場合は、libcairo にフックして見栄えの良いベクター グラフィックスを描画することもできます。それを Allegro に接続するのは非常に簡単ですが、それは別のトピックです。

もう一度、グラフィック ライブラリと、それらが問題を解決する方法について調査しました。Cairo、SDL、Qt、ImageMagic などを検討しましたが、最終的には Cairo がこの仕事に適したツールであることに同意しました。

最後に、この投稿の理由にたどり着きます。

私の質問は、「Cairo を Allegro 5 に接続する」にはどうすればよいですか?

現在、私は Cairo で作業を行っていないので、カイロに縛られているわけではありませんが、他のものに切り替える本当に正当な理由がない限り、Allegro を使い続けたいと考えています。

Allegro には、allegro コマンドを使用してディスプレイを作成し、それに描画するためのシンプルで直接的な方法があります。しかし、カイロには独自のやり方があり、カイロは表示をまったく管理していないようです。この 2 つが連携して動作していると想像できる唯一の方法は、Cairo が描画コマンドを受け取り、画像を描画し、画像を png ファイルとして保存し、次に allegro 関数を開いてそのファイルを 1 フレーム読み込むことです。これは、コメンターが得ていたものではありません。

とにかく、私の思考過程を自由に批判してください。私は気分を害することはありません。私が理解していないと思われる簡単なことがあれば、教えてください。

4

1 に答える 1

1

Cairo は、Allegro ビットマップに転送できるメモリ ブロックにレンダリングできます。ただし、リアルタイム ゲームのパフォーマンスは受け入れられません。グラフの描画、SVG 画像の静的ビットマップへの読み込みなどに便利です。パフォーマンスはさておき、とにかくビットマップの回転にどのように役立つかわかりません。

あなたが話す「アンチエイリアシング」は、プリミティブにのみ適用されます。リンク先の質問は関係ありません。これらのオプションは、回転ビットマップを作成/ロードする前に使用すると役立つ場合があります。

al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR | ALLEGRO_MIPMAP);

これらは通常ビットマップのスケーリングに適用されますが、ローテーションが適用される場合があります。

最後に、あらかじめ乗算されたアルファ (デフォルトのブレンダー) を使用すると、より良い結果が得られます。

私はちょうどあなたのイメージでこれをテストしました:

#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;
}

希望通りの仕上がりになると思います。

于 2012-07-21T16:37:29.703 に答える