指定した部分だけ輝度を設定するやり方

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

指定した部分だけ輝度を設定するやり方

#1

投稿記事 by ツリー » 17年前

こんにちは。ゲームプログラミングの館をいつも拝見させてもらってます。
独学でゲーム作成をがんばってるんですが、分からない所があるので教えてください。

ゲーム基本編の35章で「画面を段々暗く & 段々明るく」
するやり方が書いてありますが、(SetDrawBrightを使用)これだと、画面全体が指定されてしまいます。

左側は普通通りの輝度で、右側だけ段々暗く or 段々明るくするのをやりたいのですが、
どうすれば、出来ますか?分かる方ご教授お願いします。では、よろしくお願いします。

array

Re:指定した部分だけ輝度を設定するやり方

#2

投稿記事 by array » 17年前

SetDrawArea( int x1 , int y1 , int x2 , int y2 ) ;

で描画可能領域のセットしてあげれば良いです。処理した後は、可能領域を元に戻します。

SetDrawArea( 0 , 0 , 640 , 480 ) ;

バグ

Re:指定した部分だけ輝度を設定するやり方

#3

投稿記事 by バグ » 17年前

マスク画像を用意して、アルファブレンドすればいいんではないでしょうか?

管理人

Re:指定した部分だけ輝度を設定するやり方

#4

投稿記事 by 管理人 » 17年前

SetDrawBrightを指定してから描画した画像のみその輝度になります。
つまり以下簡略化してかくと

DrawGraph(1);
SetDrawBright(128,128,128);
DrawGraph(2);
SetDrawBright(255,255,255);
DrawGraph(3);

とかけば、2の画像のみ半分の明るさになります。
また同じ一つの画像を半分にわけて処理したい時は、
左半分を一度描画して、輝度を設定後、右半分を描画するとよいでしょう。

描画範囲を設定する関数は
SetDrawArea()
です。詳しい使い方はリファレンスをご覧下さい。

もしそれでもわからなければサンプルプログラムをお作りします。

ツリー

もう一回質問お願いします。

#5

投稿記事 by ツリー » 17年前

皆さんご指導ありがとうございます。
管理人さん
>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:もう一回質問お願いします。

#6

投稿記事 by 管理人 » 17年前

こんな風に描画範囲を分けて描画してみてはどうでしょうか。

#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 ;                        // ソフトの終了
}
 

管理人

Re:もう一回質問お願いします。

#7

投稿記事 by 管理人 » 17年前

あと、消えていく演出は輝度の設定ではなく、αブレンドになると思うのですが、
輝度の設定でいいのでしょうか?

ツリー

解決しました。

#8

投稿記事 by ツリー » 17年前

管理人さん
>こんな風に描画範囲を分けて描画してみてはどうでしょうか。
やってみたところ、成功しました。ありがとうございました。
たぶんこのエンドロールを作る作業に4.5時間は費やしたと思いますが、やっとやり方がわかったので
先が見えました。ありがとうございます。
というか、3時間前にarrayさんが「描画可能領域のセット」のやり方を教えてくれてますね。
アフォですいません。


>あと、消えていく演出は輝度の設定ではなく、αブレンドになると思うのですが
調べてみたところ、確かに消えていく演出はαブレンドでした。
ではなぜなるんだろう?と今、ふと考えてみた所、
背景が真っ黒なんで、輝度の設定でも消えていく演出の様に見えていたんですね。
背景が黒じゃなかったら、黒く塗りつぶされてただけなんですねw

ゲーム基本編のαブレンド~透けてる感じを表現~に透けて行く感じのやり方まんま書いてありますね。うわっ恥ずかしい・・・・。重ね重ねすみません。今日はわざわざありがとうございました。

管理人

Re:解決しました。

#9

投稿記事 by 管理人 » 17年前

エンドロールは今まで作ってきたゲームをココで感動させれるかどうかのかかった部分ですから
こりたいですよね。
私もかなり時間をかけて作っている部分です。
シューティングプログラムに浸りすぎた私は、スタッフロールの字幕すら
シューティングプログラムで書いています。
字幕発射→登録、計算、そして描画という流れは扱いやすいんですよね。

館はゴミゴミして解りにくいと思うのでまた何かあればお気軽にお聞き下さいm(_ _)m

閉鎖

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