今回お聞きしたいことは、中抜きの円(ドーナツの形)を複数描く方法です。
現状それっぽいものができましたが、まだまだ問題点が多いです。
それっぽいものは以下のソースコードです。
FieldManagerEX::FieldManagerEX(){
SetDrawValidAlphaChannelGraphCreateFlag(TRUE);
this->graph = MakeScreen(GAME_WINDOW_WIDTH + GAME_WINDOW_OFFSET_X, GAME_WINDOW_HEIGHT + GAME_WINDOW_OFFSET_Y, TRUE);
SetDrawValidAlphaChannelGraphCreateFlag(FALSE);
}
void FieldManagerEX::draw(){
SetDrawScreen(this->graph);//円を描くバッファ
ClearDrawScreen();
for (list<FieldEX*>::iterator it = this->field.begin(); it != this->field.end(); ++it){
SetDrawBlendMode(DX_BLENDGRAPHTYPE_ALPHA, 100);//ドーナツの外側部分を塗りつぶす
DrawCircle((*it)->getPosition().x + GAME_WINDOW_OFFSET_X, (*it)->getPosition().y + GAME_WINDOW_OFFSET_Y, (*it)->getHeadR(), GetColor(255, 0, 0);
SetDrawBlendMode(DX_BLENDGRAPHTYPE_NORMAL,0);//内側部分を黒で上書き
DrawCircle((*it)->getPosition().x + GAME_WINDOW_OFFSET_X, (*it)->getPosition().y + GAME_WINDOW_OFFSET_Y, (*it)->getTailR(), GetColor(0, 0, 0));
SetDrawScreen(DX_SCREEN_BACK);//ゲームプレイ用のバッファへコピー
SetDrawBlendMode(DX_BLENDGRAPHTYPE_ALPHA, 100);
DrawGraph(0, 0, this->graph, TRUE);
}
}
1・黒を透過色にしたい。(現在の状態ですと、外側円の外側、内側円の内側は黒で塗りつぶすのですが、その黒色をゲームプレイ用のバッファにまでもってきてしまう。)
試しにmain関数で背景を白く塗りつぶすように設定したら、結果はドーナツを描くときだけ背景が真っ黒になりました。それ以外では白になりました。
2・ドーナツが重なる個所では、後で書いた方のドーナツ(上に書いたドーナツ)がその内側円を塗りつぶしてしまうため、先に書いたドーナツ(下のドーナツ)が欠けてしまう。
つまり、先に書いたドーナツが"○"から"C"のようになってしまう。"C"の欠けた部分が、別のドーナツによって黒く上書きされているという状態です。
アルファチャンネル自体は有効のようで、赤いドーナツが薄い色になって描画されます。この点は維持しつつ上記の問題点を解決したいです。
個人的に考えた解決方法は、
for(ドーナツの個数分){
・円バッファをクリア。
・円バッファにドーナツを一つ書く。
・ゲームプレイ用バッファにコピー。
}
ですが、1の問題があるため、結局画面全体が黒く塗りつぶされてしまうため、意味がありませんでした。
別の方法として、ドーナツ円の書かれた画像を使ってしまうという手も考えましたが、内側円と外側円の半径は独立しているため、画像戦法も難しいかなと思います。(単純な拡大縮小では対応できない。)
外側円を塗りつぶした画像と、内側円を塗りつぶした画像を用意して、マスク処理でドーナツにしてしまうという方法もあるとは思うのですが、処理が重いからおすすめしないという記述が多く困っております。
問題ではありませんが、挙動がおかしい部分があります。
DrawGraph(0, 0, this->graph, TRUE);の個所について、座標を(0,0)にしようが、(1000,1000)にしようが円の書かれる場所が変わりません。
考えられる理由がありましたら、教えていただけると幸いです。
注文が多く申し訳ありませんが、皆様のアイデアをいただけると幸いです。
どうかよろしくお願いします。