円形の描画領域を作るには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
コレジャナイ

円形の描画領域を作るには

#1

投稿記事 by コレジャナイ » 13年前

あけましておめでとう御座います。

タイトル通り、円形の描画領域を作成するにはどのようにすれば宜しいのでしょうか?

色々調べては見たのですが、

SetUseZBufferFlag( TRUE );
DrawCircleToZBuffer( x, y, RADIUS, TRUE, DX_ZWRITE_MASK );

この二つの関数を用いる事により、特定の円形範囲内を描画させないようにする事は出来ました。

これにより
円の中に描画したい画像を画像A
背景を画像B
とした時、画像Aを先に描画してから上記のマスクを作成し、画像Bを描画する事で円の中に描画する事は出来ます。

ただ理想としては、背景の画像Bの上に画像Aを透過して描画したいため困っております。


画像Bを描画

透過設定した後画像Aを描画

マスクを作成

画像Bを描画


これで理想通りに出来るんじゃないかという気もするのですが、スマートじゃないというか二度手間感が凄いです。
(処理も遅くなりそうな気がします)
もし他にもっとシンプルな方法がありましたら、教えて下さると助かりますm(_ _)m

コレジャナイ

Re: 円形の描画領域を作るには

#2

投稿記事 by コレジャナイ » 13年前

【追記】
上記の方法で一応理想通りには表示されている事を確認しました。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 円形の描画領域を作るには

#3

投稿記事 by みけCAT » 13年前

あなたがなさっていることの逆をすればよいのではないでしょうか?

コード:

SetUseZBufferFlag( TRUE );
DrawBoxToZBuffer(0,0,640,480,TRUE,DX_ZWRITE_MASK); // 画面全体を描画しないようにする
DrawCircleToZBuffer( x, y, RADIUS, TRUE, DX_ZWRITE_CLEAR ); // 円形の部分を描画するようにする
未確認です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

コレジャナイ

Re: 円形の描画領域を作るには

#4

投稿記事 by コレジャナイ » 13年前

無事出来ました。すみません、有難う御座います。

コレジャナイ

Re: 円形の描画領域を作るには

#5

投稿記事 by コレジャナイ » 13年前

解決を押してしまいましたが、同じトピックのためこちらで失礼させて頂きます。

Zバッファを使用した方法で理想通り表示出来ましたが、処理落ちが発生してしまいますorz

解決策や他に円形の描画領域を作る方法を探っていたのですが、どうにも発見出来ませんでした・・・。

何か別に処理の軽い方法はありますでしょうか?

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 円形の描画領域を作るには

#6

投稿記事 by へにっくす » 13年前

処理落ちするソースを貼らないで、何で別の処理を聞いてるのでしょうか?
そこが不思議です。
written by へにっくす

コレジャナイ

Re: 円形の描画領域を作るには

#7

投稿記事 by コレジャナイ » 13年前

ソースコード自体は長くなってしまうので割愛させて頂いておりました。

該当部分(原因)はみけCAT様が貼って下さった処理を1フレーム内で4回呼び出しております。
この部分をコメントアウトした所正常に動いておりましたので、確実に4回呼び出しが原因です。

何故4回も呼び出しているのかというと同時に別座標の4つの円を画面上に表示させるためです。

擬似コードですと

コード:

int i;

// Zバッファを使用する
SetUseZBufferFlag( TRUE );
//半透明処理
SetDrawBlendMode( DX_BLENDMODE_ALPHA,  105 );

for( i = 0; i < 4; i++){
     DrawBoxToZBuffer(0,0,640,480,TRUE,DX_ZWRITE_MASK); // 画面全体を描画しないようにする
     DrawCircleToZBuffer( x*i, y*i, RADIUS, TRUE, DX_ZWRITE_CLEAR ); // 円形の部分を描画するようにする
}

//マスクの解除
DrawBoxToZBuffer(0,0,640,480,TRUE,DX_ZWRITE_CLEAR);
//描画モードを元に戻す
SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 120);

このような形となります。
すみません、擬似コードくらい貼るべきなのにすっかり失念しておりました。

※座標に関しては擬似コードでは適当ですが、現実では別の数値を代入しております。

コレジャナイ

Re: 円形の描画領域を作るには

#8

投稿記事 by コレジャナイ » 13年前

「追記」
DrawCircleToZBufferの下にDrawGraphが入ります。
書き忘れておりました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 円形の描画領域を作るには

#9

投稿記事 by softya(ソフト屋) » 13年前

えーと、4回DrawBoxToZBufferで塗りつぶす意味がわかりません。そんな重い処理は1回で良いのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 円形の描画領域を作るには

#10

投稿記事 by コレジャナイ » 13年前

すみません書き間違いです。
DrawBoxToZBuffer(0,0,640,480,TRUE,DX_ZWRITE_MASK); // 画面全体を描画しないようにする
は半透明処理の下にあるものとしてお考え下さい。

コレジャナイ

Re: 円形の描画領域を作るには

#11

投稿記事 by コレジャナイ » 13年前

ノートPCでのみ処理落ちが発生する程度なので無視も可能ですし、自分で解決策を考えてみます。
ご返答下さって有難う御座いましたm(_ _)m

閉鎖

“C言語何でも質問掲示板” へ戻る