無題
Re:無題
>>画面全体の色が変化してしまいました
Dxライブラリで SetDrawBright()関数で設定した値は
大体のグラフィック描画に影響を及ぼします
もっと適切な説明は本家リファレンスのほうに書かれていまので
そちらも覗いてみては如何でしょうか
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
解決策は
SetDrawBright(255,255,255);
をgraph_boss_effect()内の適当な場所に書いてください
ちなみに魔方陣は上からDrawRotaGraphFdF関数2つです
その下はボスの周りをぐるぐる回っているものです
Dxライブラリで SetDrawBright()関数で設定した値は
大体のグラフィック描画に影響を及ぼします
もっと適切な説明は本家リファレンスのほうに書かれていまので
そちらも覗いてみては如何でしょうか
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
解決策は
SetDrawBright(255,255,255);
をgraph_boss_effect()内の適当な場所に書いてください
ちなみに魔方陣は上からDrawRotaGraphFdF関数2つです
その下はボスの周りをぐるぐる回っているものです
Re:無題
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を入れたら良さげ?
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:無題
>>具体的にどのあたりにnum=6を入れたらいいんでしょうか?
num を 6 にしても期待した動作にならないと思います。
すみません分かりにくいプログラムで・・・
少々強引ですが
の上に書いてやればいいかな・・・
本当はgraph_main()内で書くのは宜しくないので(後々のことを考えて)
boss_shot_main()内の方で色相の数値の処理をして
描画のみをgraph_main()内で行ったほうが良いかもしれません。
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:無題
個人的な意見ですが、
>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]
と書け、だいぶすっきりします。
>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:無題
うぁ、すいません。配列表示でRGBをループしてたからそこの初期化ミスかと思って6とか書いてしまいました。
ちなみに僕はこんな構造体の描画ステータスで制御してます。
通常は常に初期状態、ステータスで描画前に設定、描画後に初期化。
DRAW_STATUS構造体を描画対象に持たせる事で他の描画設定は絶対影響しない状態にしてます。
ちなみに僕はこんな構造体の描画ステータスで制御してます。
#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構造体を描画対象に持たせる事で他の描画設定は絶対影響しない状態にしてます。