ページ 1 / 1
無題
Posted: 2009年6月20日(土) 08:00
by kai
質問です。
龍神録の館の50章を色々改造して遊んでるのですが
フリーで公開されてる龍神録本家での
魔方陣の色ってカラフルに色が変わりますよね
あんな風にしてみたいのですが、どこのcppにどんなソースを加えればいいのか
ちょっとよく分かりません><
知ってる方がいたら教えてください
Re:無題
Posted: 2009年6月20日(土) 09:11
by yu
graph.cppのgraph_boss_effect()関数の中で魔方陣が描画されていますから
この関数の中でSetDrawBright関数を使って魔方陣の色を変化させれば良いと思います
処理をどうすればよいのか分からなかったら
一応自分で書いてみたのでどうぞ(あくまで一例ですので・・・)
Re:無題
Posted: 2009年6月20日(土) 22:22
by kai
yuさん返答ありがとうございます!
ソースを加えてみました。
しかし、魔方陣だけでなく、
画面全体の色が変化してしまいました。
これはいったい・・?どうしたら・・
Re:無題
Posted: 2009年6月20日(土) 22:31
by yu
>>画面全体の色が変化してしまいました
Dxライブラリで SetDrawBright()関数で設定した値は
大体のグラフィック描画に影響を及ぼします
もっと適切な説明は本家リファレンスのほうに書かれていまので
そちらも覗いてみては如何でしょうか
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
解決策は
SetDrawBright(255,255,255);
をgraph_boss_effect()内の適当な場所に書いてください
ちなみに魔方陣は上からDrawRotaGraphFdF関数2つです
その下はボスの周りをぐるぐる回っているものです
Re:無題
Posted: 2009年6月20日(土) 23:12
by ksi
おお!なるほど!
SetDrawBright(255,255,255);を書くことをすっかり忘れてましたw
yuさんのアドバイスのおかげで出来ました!
猛烈に感謝です!ありがとうございました!
Re:無題
Posted: 2009年6月26日(金) 00:50
by kai
すみません。ひとつ分からないことがあったので質問させてください。
この色を変える処理を最初からスタートした場合に初期化したいのですが
初期化がうまくいかず、2回目以降、ボスに会うと、いきなり色が変わって困ってます。
どの部分のソースを初期化すればいきなり色が変わらないようになるのか教えてほしいです。
よろしくお願いします。
Re:無題
Posted: 2009年6月26日(金) 09:07
by ねこ
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を入れたら良さげ?
Re:無題
Posted: 2009年6月26日(金) 20:15
by kai
というと、具体的にどのあたりにnum=6を入れたらいいんでしょうか?
Re:無題
Posted: 2009年6月26日(金) 23:37
by yu
>>具体的にどのあたりに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()内で行ったほうが良いかもしれません。
Re:無題
Posted: 2009年6月26日(金) 23:45
by yu
って今自分のプログラムを見直てみたら
なんでこんな処理をしてるんだろう・・・ orz
すみません;
無駄な処理をしていたので修正してください・・・
まだまだ無駄があると思いますがw
Re:無題
Posted: 2009年6月27日(土) 01:08
by Justy
個人的な意見ですが、
>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]
と書け、だいぶすっきりします。
Re:無題
Posted: 2009年6月27日(土) 08:15
by yu
>>Justy様
なるほど・・・
かなり参考になります。ありがとうございます
今見てみると実際に影響が出てしまっています・・・
ボムを打つとボスが暗くなるはずですが
上記の理由によりボスの輝度に影響が出てしまっています;
今回初めてスタック構造というものを知りましたが
非常に便利ですね
データ構造の勉強もしてみようかと思います。
Re:無題
Posted: 2009年6月27日(土) 10:09
by ねこ
うぁ、すいません。配列表示で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構造体を描画対象に持たせる事で他の描画設定は絶対影響しない状態にしてます。
Re:無題
Posted: 2009年6月27日(土) 11:47
by yu
DWORD なんて見たこともなかったのですが
unsigned long を typedef したものでした
実際にやったことはないですが8bitずつずらしてRGBの値を所得しているんでしょうか
そうだと一つの変数だけで処理できるので設定の手間が減りますね
一つ一つにステータスを設定するのもいいですね~
細かい設定が簡単にできそうです。
どちらも非常に参考になりました。ありがとうございます。