続「12.画像を動かす」の初期化

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

続「12.画像を動かす」の初期化

#1

投稿記事 by kusen » 16年前

先ほど「12.画像を動かす」の初期化 のタイトルで質問したものです。
SCIさんのおかげで、二回目のプレイ時x=0からできるようになりましたが、
二回目のプレイ時、画面が明るく暗くなり次の画面にいけません。拙い文章
また続けて質問ですみませんが、どなたかよろしくお願いします。
環境 windoes vc2008 DXライブラリです。
#include "DxLib.h"
 
int function_status=0,White,Yellow,G_Blue,Red,c;
        
char KeyBuf[ 256 ] ;
int PointX = 0;
 
void Opening(){
	SetFontSize( 30 ) ;                             //サイズを20に変更
        SetFontThickness( 1 ) ;                         //太さを1に変更
        ChangeFont( "HGS創英角ポップ体" ) ;              //HGS創英角ポップ体に変更
        ChangeFontType( DX_FONTTYPE_ANTIALIASING_EDGE );//アンチエイリアス&エッジ付きフォントに変更
	DrawString(50,300,"             PUSH Z KEY",GetColor(255,255,255));
        if(KeyBuf[KEY_INPUT_Z]==1)
		function_status=1;
		
                
}
 
void Menu(){
	LoadGraphScreen( PointX , 350 , "囚人.png" , TRUE ); 	
	Yellow     = GetColor( 255 ,   255 ,   0 ) ; // 赤色の値を取得
        G_Blue  = GetColor( 128 , 128 , 128 ) ; // 緑と青の混合色の値を取得
		White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
       
        DrawBox   ( 400 , 200 , 440 , 700 , G_Blue , TRUE ) ;   // 四角形を描画(塗りつぶし)
        DrawCircle( 550 , 30 , 30 , Yellow , TRUE) ;             // 円を描画(塗りつぶし)
        DrawString(  0,  0, "level 1" , White);            //文字列表示
	PointX++;

	
        
        if(PointX==290)
                function_status=2;
}
void Danjon(){
	LoadGraphScreen( PointX , 350 , "囚人.png" , TRUE );
                
                if(c>=0 && c<256)                    //cが0~256の時
                        SetDrawBright( c , c , c );        //段々あかるく(c= 0->255)
                if(c>=256 && c<400)                  //cが256~400の時
                        SetDrawBright( 255 , 255 , 255 );  //通常の明るさ
                if(c>=400 && c<400+256)              //cが400~400+256の時
                        SetDrawBright( 255-(c-400) , 255-(c-400) , 255-(c-400) );//段々暗く(c= 255->0)
 
                DrawBox( 0 , 0 , 640 , 480 , White , TRUE) ;  //画面全体に白い四角形を描画
				
                c+=3; 
				PointX++;
		
                if(PointX==410)                
                function_status=3;
}
void attack(){
		SetFontSize( 30 ) ;                             //サイズを20に変更
        SetFontThickness( 1 ) ;                         //太さを1に変更
        ChangeFont( "HGS創英角ポップ体" ) ;              //HGS創英角ポップ体に変更
        ChangeFontType( DX_FONTTYPE_ANTIALIASING_EDGE );//アンチエイリアス&エッジ付きフォントに変更
		DrawString(50,300,"             PUSH X KEY",GetColor(255,255,255));
        if(KeyBuf[KEY_INPUT_X]==1)
		function_status=0;
		PointX=0;
}
 

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;                                   //ウィンドウモードに変更
        if( DxLib_Init() == -1 ) return -1;                      // DXライブラリ初期化処理 エラーが起きたら終了 
         
        White = GetColor( 255 , 255 , 255 ) ;                    //色の取得
          
        SetDrawScreen( DX_SCREEN_BACK ) ;                                // 描画先を裏画面に設定
           
        while( 1 ){
                ClearDrawScreen();                                                               // 裏画面のデータを全て削除
                GetHitKeyStateAll( KeyBuf ) ;                                    // すべてのキーの状態を得る
 
                switch(function_status){
                        case 0:
                                Opening();
                                break;
                        case 1:
                                Menu();
                                break;
                        case 2:
                                Danjon();
                                break;
						case 3:
                                attack();
                                break;
                        default:
                                DxLib_End() ;                                // DXライブラリ使用の終了処理
                                return 0;
                                break;
                }
 
                if( ProcessMessage() == -1 ) break ;                 //エラーが起きたら終了
                
                ScreenFlip() ;                                   // 裏画面データを表画面へ反映
        }
 
        DxLib_End() ;                                            // DXライブラリ使用の終了処理
        return 0 ;                                               // ソフトの終了
}

SCI

Re:続「12.画像を動かす」の初期化

#2

投稿記事 by SCI » 16年前

まず、
if(KeyBuf[KEY_INPUT_X]==1)
        function_status=0;
        PointX=0;
この部分、中括弧をつけるべきです(今回はなくてもたまたま上手くいきますが)。
それで、今回は、
if(KeyBuf[KEY_INPUT_X]==1) {
        function_status=0;
        PointX=0;
        c = 0;
}
のように付け加えてみてください。
今回の件で薄々気づくかもしれませんが、「最初」に戻るときには使った変数の値は「最初」の状態に戻す必要があります。
変数は宣言時に初期化が出来ますが、今回のように何度も最初から繰り返す場合、初期化は初期化で実行できるようにするといいでしょう。

kazuoni

Re:続「12.画像を動かす」の初期化

#3

投稿記事 by kazuoni » 16年前

>画面が明るく暗くなり次の画面にいけません。

void Danjon()で使用しているcとは何ですか?
まずコンパイルすら通らないと思いますが・・・?

まず、しっかり宣言されているとしてですが。
Danjon()のSetDrawBright()で、暗→明→暗
として、最後Color(0,0,0)で終わっています。
これでは次の描写は真っ暗です。
輝度のデフォルトは255なので、
if(PointX==410)
{
   function_status=3;
   SetDrawBright(255,255,255)
}
としてみてください。

kazuoni

Re:続「12.画像を動かす」の初期化

#4

投稿記事 by kazuoni » 16年前

見当違いだったかもしれないです^^;失礼しました。。

kusen

Re:続「12.画像を動かす」の初期化

#5

投稿記事 by kusen » 16年前

SCIさんkazuoniさん返答ありがとうございました。
問題解決しましたまた、勉強になりました。冷静に考えれば。。。という話しで恥ずかしい限りです。
今回は諸事情ではやく作りたかったので、みなさんの力をかりさしていただきました。
特にSCIさんありがとうございます。これからは、みなさんに頼るだけでなく、自分で解決できるよう
力をつけたいと思います。ありがとうございます。

閉鎖

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