こんにちは。ゲームプログラミングの館をいつも拝見させてもらってます。
独学でゲーム作成をがんばってるんですが、分からない所があるので教えてください。
ゲーム基本編の35章で「画面を段々暗く & 段々明るく」
するやり方が書いてありますが、(SetDrawBrightを使用)これだと、画面全体が指定されてしまいます。
左側は普通通りの輝度で、右側だけ段々暗く or 段々明るくするのをやりたいのですが、
どうすれば、出来ますか?分かる方ご教授お願いします。では、よろしくお願いします。
指定した部分だけ輝度を設定するやり方
Re:指定した部分だけ輝度を設定するやり方
SetDrawArea( int x1 , int y1 , int x2 , int y2 ) ;
で描画可能領域のセットしてあげれば良いです。処理した後は、可能領域を元に戻します。
SetDrawArea( 0 , 0 , 640 , 480 ) ;
で描画可能領域のセットしてあげれば良いです。処理した後は、可能領域を元に戻します。
SetDrawArea( 0 , 0 , 640 , 480 ) ;
Re:指定した部分だけ輝度を設定するやり方
SetDrawBrightを指定してから描画した画像のみその輝度になります。
つまり以下簡略化してかくと
DrawGraph(1);
SetDrawBright(128,128,128);
DrawGraph(2);
SetDrawBright(255,255,255);
DrawGraph(3);
とかけば、2の画像のみ半分の明るさになります。
また同じ一つの画像を半分にわけて処理したい時は、
左半分を一度描画して、輝度を設定後、右半分を描画するとよいでしょう。
描画範囲を設定する関数は
SetDrawArea()
です。詳しい使い方はリファレンスをご覧下さい。
もしそれでもわからなければサンプルプログラムをお作りします。
つまり以下簡略化してかくと
DrawGraph(1);
SetDrawBright(128,128,128);
DrawGraph(2);
SetDrawBright(255,255,255);
DrawGraph(3);
とかけば、2の画像のみ半分の明るさになります。
また同じ一つの画像を半分にわけて処理したい時は、
左半分を一度描画して、輝度を設定後、右半分を描画するとよいでしょう。
描画範囲を設定する関数は
SetDrawArea()
です。詳しい使い方はリファレンスをご覧下さい。
もしそれでもわからなければサンプルプログラムをお作りします。
もう一回質問お願いします。
皆さんご指導ありがとうございます。
管理人さん
>SetDrawBrightを指定してから描画した画像のみその輝度になります。
管理人さんに教えてもらった通りにプログラムを作ってみたのですが、
どうしても全体の輝度が変わってしまいます。プログラムのミスを見てもらえませんか?
『エンドロールを作成したくて、
「左側に流れてくる文字。右側に画像が表示され、文字が一定の位置に来ると画像が消えていく。」ようにした
プログラムのつもりですが・・・。』
管理人さん
>SetDrawBrightを指定してから描画した画像のみその輝度になります。
管理人さんに教えてもらった通りにプログラムを作ってみたのですが、
どうしても全体の輝度が変わってしまいます。プログラムのミスを見てもらえませんか?
『エンドロールを作成したくて、
「左側に流れてくる文字。右側に画像が表示され、文字が一定の位置に来ると画像が消えていく。」ようにした
プログラムのつもりですが・・・。』
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定 x+=2; i+=2; { ClearDrawScreen(); // 裏画面のデータを全て削除 DrawStringToHandle(80,i, "GAME CLEAR" , Black,FH);//文字列表示 DrawStringToHandle(50,x, "MP3やMIDIをお借りしたサイト" , Black,FH);//文字列表示 if(x>=0 && x<400) //cが0~256の時 SetDrawBright(255-aaa,255-aaa,255-aaa); DrawGraph( 380 , 140 , TOPA , FALSE ) ; aaa+=1; if(x>470) function_status=10; ScreenFlip() ; // 裏画面データを表画面へ反映
Re:もう一回質問お願いします。
こんな風に描画範囲を分けて描画してみてはどうでしょうか。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更 if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定 while( 1 ){ ClearDrawScreen(); // 裏画面のデータを全て削除 SetDrawBright( 128 , 128 , 128 );//半分の輝度 SetDrawArea(0,0,320,480); DrawString(210,100,"DxライブラリDxライブラリ",GetColor(255,255,255)); DrawString(280,150,"DxライブラリDxライブラリ",GetColor(255,255,255)); SetDrawBright( 255 , 255 , 255 );//明るさ通常 SetDrawArea(320,0,640,480); DrawString(210,100,"DxライブラリDxライブラリ",GetColor(255,255,255)); DrawString(280,150,"DxライブラリDxライブラリ",GetColor(255,255,255)); if( ProcessMessage() == -1 ) break ; //エラーが起きたら終了 ScreenFlip() ; // 裏画面データを表画面へ反映 } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
解決しました。
管理人さん
>こんな風に描画範囲を分けて描画してみてはどうでしょうか。
やってみたところ、成功しました。ありがとうございました。
たぶんこのエンドロールを作る作業に4.5時間は費やしたと思いますが、やっとやり方がわかったので
先が見えました。ありがとうございます。
というか、3時間前にarrayさんが「描画可能領域のセット」のやり方を教えてくれてますね。
アフォですいません。
>あと、消えていく演出は輝度の設定ではなく、αブレンドになると思うのですが
調べてみたところ、確かに消えていく演出はαブレンドでした。
ではなぜなるんだろう?と今、ふと考えてみた所、
背景が真っ黒なんで、輝度の設定でも消えていく演出の様に見えていたんですね。
背景が黒じゃなかったら、黒く塗りつぶされてただけなんですねw
ゲーム基本編のαブレンド~透けてる感じを表現~に透けて行く感じのやり方まんま書いてありますね。うわっ恥ずかしい・・・・。重ね重ねすみません。今日はわざわざありがとうございました。
>こんな風に描画範囲を分けて描画してみてはどうでしょうか。
やってみたところ、成功しました。ありがとうございました。
たぶんこのエンドロールを作る作業に4.5時間は費やしたと思いますが、やっとやり方がわかったので
先が見えました。ありがとうございます。
というか、3時間前にarrayさんが「描画可能領域のセット」のやり方を教えてくれてますね。
アフォですいません。
>あと、消えていく演出は輝度の設定ではなく、αブレンドになると思うのですが
調べてみたところ、確かに消えていく演出はαブレンドでした。
ではなぜなるんだろう?と今、ふと考えてみた所、
背景が真っ黒なんで、輝度の設定でも消えていく演出の様に見えていたんですね。
背景が黒じゃなかったら、黒く塗りつぶされてただけなんですねw
ゲーム基本編のαブレンド~透けてる感じを表現~に透けて行く感じのやり方まんま書いてありますね。うわっ恥ずかしい・・・・。重ね重ねすみません。今日はわざわざありがとうございました。
Re:解決しました。
エンドロールは今まで作ってきたゲームをココで感動させれるかどうかのかかった部分ですから
こりたいですよね。
私もかなり時間をかけて作っている部分です。
シューティングプログラムに浸りすぎた私は、スタッフロールの字幕すら
シューティングプログラムで書いています。
字幕発射→登録、計算、そして描画という流れは扱いやすいんですよね。
館はゴミゴミして解りにくいと思うのでまた何かあればお気軽にお聞き下さいm(_ _)m
こりたいですよね。
私もかなり時間をかけて作っている部分です。
シューティングプログラムに浸りすぎた私は、スタッフロールの字幕すら
シューティングプログラムで書いています。
字幕発射→登録、計算、そして描画という流れは扱いやすいんですよね。
館はゴミゴミして解りにくいと思うのでまた何かあればお気軽にお聞き下さいm(_ _)m