1

基本的なプログラムの UI をより迅速に作成できるように、2D オブジェクト エディターを作成しています。私はビットマップをまったく使用していません。代わりに、ゲーム ループで関数呼び出しを使用してプリミティブを描画しているだけです。これまでのところすべて問題ありませんが、実行時にオブジェクトの色を変更する方法を知りたいです。

基本的な概念は、色に変数を使用し、ユーザーがその変数の値を変更する関数を呼び出すと、色が変更されるというものです。単純。何かのようなもの:

void runColor(){
  ALLEGRO_COLOR color = NULL;

   if(event.mouse.button&1)
      color = al_map_rgb(255, 0, 0);
   else
      color = al_map_rgb(0, 255, 0);

   al_draw_filled_rectangle(firstXval, firstYval, secondXval, secondYval, color);
 }

残念ながら、これは機能しません。同様のコードを使用すると、オブジェクトが作成されません。コンパイル エラーも実行時エラーも何もありません。代わりに、オブジェクトに色がないため見えませんが、実際に作成されることは確認済みです。すっごくそれは、色変数がどういうわけか正しい型であることを意味すると思いますが、al_map_rgb()その関数が返すものと等しく設定されているときの値を保持しません。何かを返さなければならないことはわかっています。そうしないと、al_draw関数の引数にならないからです。

さまざまな描画関数につながる if else if ステートメントを書き出すこともできますが、単純であるべき何かを解決するための冗長なものの束よりも、上記のようなコードの単純な小さなバンドルを使用したいと考えています。ダクトテープに相当するコードを使用したくないだけです。

al_map_rgb()したがって、問題はおそらくの値を返す私の仮定に関係していると確信していますがALLEGRO_COLOR、わかりません。皆さん、何か提案をしていただけませんか?

4

1 に答える 1

0

まず、仮定を立てる必要はありません。マニュアルでわかるように、al_map_rgb()実際にALLEGRO_COLORオブジェクトを返します。

そのコードには何も問題はありません。値が正しくないかx,y、ターゲット ビットマップが予期したものではないか、または を呼び出していませんal_flip_display()。すべてのフレーム (つまり、各al_flip_display()) 呼び出しでシーン全体を必ず再描画してください。

また、プリミティブを描画するときは、座標の仕組みを理解していることを確認してください。塗りつぶされた長方形を描くときは、外側の点を指定します(x1,y1)-(x1+w,y1+h)

于 2012-06-07T19:26:57.807 に答える