無題

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

無題

#1

投稿記事 by kai » 16年前

質問です。
龍神録の館の50章を色々改造して遊んでるのですが
フリーで公開されてる龍神録本家での
魔方陣の色ってカラフルに色が変わりますよね
あんな風にしてみたいのですが、どこのcppにどんなソースを加えればいいのか
ちょっとよく分かりません><
知ってる方がいたら教えてください

yu

Re:無題

#2

投稿記事 by yu » 16年前

graph.cppのgraph_boss_effect()関数の中で魔方陣が描画されていますから
この関数の中でSetDrawBright関数を使って魔方陣の色を変化させれば良いと思います

処理をどうすればよいのか分からなかったら
一応自分で書いてみたのでどうぞ(あくまで一例ですので・・・)

kai

Re:無題

#3

投稿記事 by kai » 16年前

yuさん返答ありがとうございます!
ソースを加えてみました。

しかし、魔方陣だけでなく、
画面全体の色が変化してしまいました。
これはいったい・・?どうしたら・・

yu

Re:無題

#4

投稿記事 by yu » 16年前

>>画面全体の色が変化してしまいました

Dxライブラリで SetDrawBright()関数で設定した値は
大体のグラフィック描画に影響を及ぼします
もっと適切な説明は本家リファレンスのほうに書かれていまので
そちらも覗いてみては如何でしょうか
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html

解決策は

SetDrawBright(255,255,255);

をgraph_boss_effect()内の適当な場所に書いてください
ちなみに魔方陣は上からDrawRotaGraphFdF関数2つです
その下はボスの周りをぐるぐる回っているものです

ksi

Re:無題

#5

投稿記事 by ksi » 16年前

おお!なるほど!
SetDrawBright(255,255,255);を書くことをすっかり忘れてましたw
yuさんのアドバイスのおかげで出来ました!
猛烈に感謝です!ありがとうございました!

kai

Re:無題

#6

投稿記事 by kai » 16年前

すみません。ひとつ分からないことがあったので質問させてください。
この色を変える処理を最初からスタートした場合に初期化したいのですが
初期化がうまくいかず、2回目以降、ボスに会うと、いきなり色が変わって困ってます。
どの部分のソースを初期化すればいきなり色が変わらないようになるのか教えてほしいです。
よろしくお願いします。

ねこ

Re:無題

#7

投稿記事 by ねこ » 16年前

SetDrawBright関数やSetDrawBlendMode関数等は描画処理前に設定し、描画処理後に初期化するのが普通です。

SetDrawBright( R, G, B );
// A描画
// B描画
SetDrawBright( 255, 255, 255 );

もっとちゃんと管理したいなら、1描画処理に対してON/OFFを切り替えます。

SetDrawBright( R, G, B );
// A描画
SetDrawBright( 255, 255, 255 );
SetDrawBright( R, G, B );
// B描画
SetDrawBright( 255, 255, 255 );

と、ここまで書いてて気づいたんですがボスの情報変数のような気がしますね・・・
ボス開始時とかの初期化処理にnum=6を入れたら良さげ?

kai

Re:無題

#8

投稿記事 by kai » 16年前

というと、具体的にどのあたりにnum=6を入れたらいいんでしょうか?

yu

Re:無題

#9

投稿記事 by yu » 16年前

>>具体的にどのあたりにnum=6を入れたらいいんでしょうか?

num を 6 にしても期待した動作にならないと思います。
すみません分かりにくいプログラムで・・・

少々強引ですが
if(boss.cnt == 1 && ( boss.knd == 0 || boss.knd == boss.danmaku_num[0] + 1 ))
{
	rgb[0] = rgb[1] = rgb[2] = 255;//最初の色は白
	cnt = 0;
	num = 0;
}
これを SetDrawBright((int)rgb[0],(int)rgb[1],(int)rgb[2]);
の上に書いてやればいいかな・・・

本当はgraph_main()内で書くのは宜しくないので(後々のことを考えて)
boss_shot_main()内の方で色相の数値の処理をして
描画のみをgraph_main()内で行ったほうが良いかもしれません。

yu

Re:無題

#10

投稿記事 by yu » 16年前

って今自分のプログラムを見直てみたら
なんでこんな処理をしてるんだろう・・・ orz

すみません;
無駄な処理をしていたので修正してください・・・
まだまだ無駄があると思いますがw

Justy

Re:無題

#11

投稿記事 by Justy » 16年前

 個人的な意見ですが、

>SetDrawBright(255,255,255);を書くことをすっかり忘れてました

 一応この処理で元の輝度に戻せますが、変更前に GetDrawBright()を使い、
元の値を保存した上で、その値を使って元に戻した方がいいかと思います。

 これは XXXDrawBrightだけの話ではなく、XXXDrawBlendModeなどの環境を制御する
Set/Get系の多くに当てはまることですが

 例えば、
[color=#d0d0ff" face="monospace]
void DrawA()
{
DrawGraph(...);
}

void DrawB()
{
DrawGraph(...);
}

void MainDraw()
{
SetDrawBright(0, 255, 0); // 緑
DrawA();
DrawB();
SetDrawBright(255, 255, 255); // 白に戻す
}
[/color]

 のようなコードでは DrawA() / DrawB()は緑っぽい輝度で描画されることを
期待して、MainDraw()は書かれていますが、ここで、DrawA()を赤の輝度で描画したいと思い
[color=#d0d0ff" face="monospace]
void DrawA()
{
SetDrawBright(255, 0, 0); // 赤
DrawGraph(...);
SetDrawBright(255, 255, 255); // 白に戻す
}
[/color]

とした場合、元に戻すときに直値で白を指定指定してしまうと DrawB()が影響を
受けてしまいます。

 そこで、GetDrawBright()を使って値を取得、メモリに保存しておき、
元に戻すときはその値を使って戻すと、DrawB()は影響を受けずに済みます。
[color=#d0d0ff" face="monospace]
void DrawA()
{
int r, g, b;
GetDrawBright(&r, &g, &b); // 値を覚えておく
DrawGraph(...);
SetDrawBright(r, g, b); // その値に戻す
}[/color]

 
 さらには MainDraw()の方も同様な形にしておけば、MainDrawの呼び出し元の方で、
DrawBright値を変更されていたとしても問題なく動くことが期待できます。


 まぁ、こんな処理も毎回書くのも面倒だと思うので 
GetDrawBright()を使って値をスタック構造で保存する関数を PushEnv_DrawBright()、
最後に保存したときの値で SetDrawBrightしてくれる関数 PopEnv_DrawBright()というのを
作っておけば

[color=#d0d0ff" face="monospace]
void DrawA()
{
PushEnv_DrawBright(); // この時点の DrawBright値を保存
{
SetDrawBright(255, 0, 0); // 赤
DrawGraph(...);
}
PopEnv_DrawBright(); // 上で保存した値で元に戻す
}

void DrawB()
{
DrawGraph(...);
}

void MainDraw()
{
PushEnv_DrawBright();
{
SetDrawBright(0, 255, 0); // 緑
DrawA();
DrawB();
}
PopEnv_DrawBright();
}
[/color]

 と書け、だいぶすっきりします。

yu

Re:無題

#12

投稿記事 by yu » 16年前

>>Justy様

なるほど・・・
かなり参考になります。ありがとうございます
今見てみると実際に影響が出てしまっています・・・
ボムを打つとボスが暗くなるはずですが
上記の理由によりボスの輝度に影響が出てしまっています;

今回初めてスタック構造というものを知りましたが
非常に便利ですね
データ構造の勉強もしてみようかと思います。

ねこ

Re:無題

#13

投稿記事 by ねこ » 16年前

うぁ、すいません。配列表示でRGBをループしてたからそこの初期化ミスかと思って6とか書いてしまいました。

ちなみに僕はこんな構造体の描画ステータスで制御してます。
#define RGB_WHITE 0xFFFFFF

typedef struct {
	DWORD dwColor;
	double dAlpha;
	...//他描画ステータス
} DRAW_STATUS;

void DrawGraphSts( int x, int y, int GraphHandle, DRAW_STATUS* pStatus )
{
	// 輝度設定
	if( pStatus->dwColor != RGB_WHITE )
		SetDrawBright( pStatus->dwColor );

	// 透明度設定
	if( pStatus->dAlpha != 1.0 )
		SetDrawBlendMode( DX_BLENDMODE_ALPHA, 255 * pStatus->dAlpha );

	// 他色々設定

	// 描画
	DrawGraph( x, y, GraphHandle );

	// 輝度初期化
	if( pStatus->dwColor != RGB_WHITE )
		SetDrawBright( RGB_WHITE  );

	// 透明度設定
	if( pStatus->dAlpha != 1.0 || 他ブレンド変更してたら )
		SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );

	// 他色々設定初期化
}
※ SetDrawBright( DWORD dwColor )はRGB値を渡して中でR/G/B値に分解して設定する関数

通常は常に初期状態、ステータスで描画前に設定、描画後に初期化。
DRAW_STATUS構造体を描画対象に持たせる事で他の描画設定は絶対影響しない状態にしてます。

yu

Re:無題

#14

投稿記事 by yu » 16年前

DWORD なんて見たこともなかったのですが
unsigned long を typedef したものでした

実際にやったことはないですが8bitずつずらしてRGBの値を所得しているんでしょうか
そうだと一つの変数だけで処理できるので設定の手間が減りますね

一つ一つにステータスを設定するのもいいですね~
細かい設定が簡単にできそうです。

どちらも非常に参考になりました。ありがとうございます。

閉鎖

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