二つの円の内側を透過、半透明にしたい

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

二つの円の内側を透過、半透明にしたい

#1

投稿記事 by kido » 12年前

ドーナツのような厚みのある円を作成しようと、MakeGraphで作成されるグラフィック上で
加工処理をしてみましたが、上手くいきません
どうかお知恵をお貸しください
行く行くは円の内側を半透明にしたいとも考えています
以下は透過(失敗)の処理部分の抜粋です

コード:

SetDrawValidGraphCreateFlag(true);
SetDrawValidAlphaChannelGraphCreateFlag(true);

int SCREEN_TEMP = MakeGraph(200, 200);

SetDrawValidGraphCreateFlag(false);
SetDrawValidAlphaChannelGraphCreateFlag(false);

SetDrawScreen(SCREEN_TEMP);


// 外円
DrawCircle(100, 100, 100, GetColor(255, 255, 127), true);
// 内円
DrawCircle(100, 100, 50, GetColor(0, 255, 0), true);	// この中を透過させたい


SetDrawScreen(DX_SCREEN_BACK);

SetTransColor(0, 255, 0);
DrawGraph(0, 0, SCREEN_TEMP, true);

ScreenFlip();
WaitKey() ;

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 二つの円の内側を透過、半透明にしたい

#2

投稿記事 by beatle » 12年前

kido さんが書きました:ドーナツのような厚みのある円を作成しようと、MakeGraphで作成されるグラフィック上で
加工処理をしてみましたが、上手くいきません
何がどう上手くいかないのでしょうか。具体的にご説明ください。

kido

Re: 二つの円の内側を透過、半透明にしたい

#3

投稿記事 by kido » 12年前

beatle さんが書きました:
kido さんが書きました:ドーナツのような厚みのある円を作成しようと、MakeGraphで作成されるグラフィック上で
加工処理をしてみましたが、上手くいきません
何がどう上手くいかないのでしょうか。具体的にご説明ください。
厚みのある円を作ろうと思い、外側の円から内側の円を切り抜くことで実現しようと考えました
切り抜く円(内側)を DX_SCREEN_BACK に書き込む際の透過色で塗りつぶせばよいと思い 0,255,0 を設定(15行目)
書き出す際に SetTransColor(0, 255, 0); を指定して描画(18-21行目)
しかし、内側の円は透過されず 0,255,0 で描画されます
何か考え方が間違ってるのでしょうか?

動作環境
XP / Atom330 内臓グラフィック
WIn7 / Core i5 3740 内臓グラフィック

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

Re: 二つの円の内側を透過、半透明にしたい

#4

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

すくなくともSetTransColor()はLoadGraph()などにしか効果のない関数ですね。
マスク画像を用意してマスク関係関数を使うか、隠し関数のZバッファ系を使うかですね。

参考
「キャラがダメージを受けた時の点滅について • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?t=9 ... 420#p78328

Zバッファ処理を有効にしておいて、Zバッファに小さい円を描画、その上に普通に大きい円を描きます、、その後Zバッファを無効にします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kido

Re: 二つの円の内側を透過、半透明にしたい

#5

投稿記事 by kido » 12年前

画像できるまでのつなぎと思っていたので、マスク画像を用意する方法ではなくZバッファを利用することにしました
ClearDrawScreen(); をすることに気づかず、すこし時間がかかりましたが、なんとか解決することができました
ありがとうございました

以下解決したコードです

コード:

SetDrawValidGraphCreateFlag(true);
SetDrawValidAlphaChannelGraphCreateFlag(true);
 
int SCREEN_TEMP = MakeGraph(200, 200);
 
SetDrawValidGraphCreateFlag(false);
SetDrawValidAlphaChannelGraphCreateFlag(false);
 
SetDrawScreen(SCREEN_TEMP);
ClearDrawScreen(); // クリア

SetUseZBufferFlag( TRUE );

// 内円 あらかじめマスク
DrawCircleToZBuffer(100, 100, 50, true, DX_ZWRITE_MASK);    // この中を透過させたい

// 外円
DrawCircle(100, 100, 100, GetColor(255, 255, 127), true);

SetUseZBufferFlag( FALSE );

SetDrawScreen(DX_SCREEN_BACK);

DrawGraph(0, 0, SCREEN_TEMP, true);
 
ScreenFlip();
WaitKey();

閉鎖

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