ページ 11

文字点滅中の入力

Posted: 2008年1月27日(日) 08:39
by オークヒイロ
#include "DxLib.h"


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;              //ウィンドウモードにする。通常はX639 Y479
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 

	while(1){
		int White,Brack;
		int MouseInput= GetMouseInput() ;
	
		White   = GetColor( 255 , 255 , 255 ) ;
		Brack   = GetColor(   0, 0,0);

		SetDrawScreen( DX_SCREEN_BACK ) ;
		SetFontSize( 30 );	
		DrawFormatString(235,410, White ,"EXIT" );
		ScreenFlip() ;
	
		WaitTimer( 1000 ) ;
	
		DrawBox(235,410,298,438,Brack,TRUE);
		ScreenFlip() ;
	
		WaitTimer( 1000 ) ;

		if(( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )break;

		if( ProcessMessage() == -1 )
		{
			break ;	// エラーが起きたらループを抜ける
		}
	}
		
		                    
        DxLib_End() ;                   // DXライブラリ使用の終了処理
        return 0 ;                      // ソフトの終了
}
 
上記だと左クリック押しっぱなしでしか終了できません。
左クリック一回押しで終了させるにはどうしたらよいのでしょうか?

Re:文字点滅中の入力

Posted: 2008年1月28日(月) 04:37
by 管理人
そして、今回修正しておきましたが、コードを投稿するときは<pre>と</pre>のタグで囲ってください。(<>は半角)字下げされますので。

ライブラリの使い方として、ちょっと書き方がおかしいです。
基本的なことについては、ゲームプログラミングの館にて紹介していますので、参考にしてください。


まず、

SetDrawScreen( DX_SCREEN_BACK ) ;

は最初に一度だけ呼ぶ関数です。

SetFontSize( 30 );

も出来るだけ最初に一度だけしか呼ばない関数です。
何度も呼ぶときには他の関数を使います。
何度もサイズを変更したいのならゲームプログラミングの館で紹介している方法で行ってください。

int MouseInput= GetMouseInput() ;

は後で使って無いので無意味です。

ScreenFlip() ;

は書いたものを画面に反映させる関数ですので、ループのうち一度しか書きません。
出来るだけ

WaitTimer( 1000 ) ;

で待たせて時間を合わせるプログラムはやめましょう。
サンプルのようにカウンタを使ってカウンタで条件分岐すべきです。
そうじゃないとおっしゃるように、プログラムが機能していない間にクリックされてしまっては処理出来ないからです。

最低1秒間に30回はループを一周するように心がけたいものです。

以上を理解した上で、下にサンプルを書いたので見てください。
こういう感じでいいでしょうか。

描いてあるものを消す関数

ClearDrawScreen();//描いてあるものを消す

を呼べば書いてあるものは消えるので、黒で塗りつぶす必要はありません。
#include "DxLib.h"


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode( TRUE ) ;			  //ウィンドウモードにする。通常はX639 Y479
	if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 
	int White,Brack,MouseInput= GetMouseInput(),count=0;
	White   = GetColor( 255 , 255 , 255 ) ;
	Brack   = GetColor(   0, 0,0);
	SetDrawScreen( DX_SCREEN_BACK ) ;
	SetFontSize( 30 );	

	while(1){
		if( ProcessMessage() == -1 )break ;	// エラーが起きたらループを抜ける
		ClearDrawScreen();//描いてあるものを消す
		if( count%120 < 60 )//2秒のうち最初の1秒なら
			DrawFormatString(235,410, White ,"EXIT" );
		if(( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )break;
		count++;
		ScreenFlip() ;
	}
	DxLib_End() ;				   // DXライブラリ使用の終了処理
	return 0 ;					  // ソフトの終了
}

続きです

Posted: 2008年1月29日(火) 08:18
by オークヒイロ
ありがとうございました。
とりあえず前回のことは理解したつもりで、次に進んでみたのですが
#include "DxLib.h"


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;              //ウィンドウモードにする。通常はX639 Y479
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 

		int White,Brack,MouseX , MouseY,count=0,count2=0;
              
		White   = GetColor( 255 , 255 , 255 ) ;// 白色の値を取得
		Brack   =GetColor( 0, 0 , 0 ) ;
		SetDrawScreen( DX_SCREEN_BACK ) ;// 描画先を裏画面に設定
		SetMouseDispFlag( TRUE ) ;
		SetFontSize( 30 );
		LoadGraphScreen( 0 , 0 , "back.bmp" , FALSE ) ;//DXライブラリサンプルプログラムより
		
		SetMouseDispFlag( TRUE ) ;
		
		ScreenFlip() ;// 裏画面データを表画面へ反映


		while(1){
			if( ProcessMessage() == -1 )break ;// エラーが起きたらループを抜ける
			GetMousePoint( &MouseX , &MouseY ) ;//MouseXとMouseY変数に座標を与える
			   								
			
			DrawFormatString(235,290, White , "GAME START");
			DrawFormatString(235,350, White , "CONFING");
			DrawFormatString(235,410, White , "EXIT");
			
			if(MouseX>235&&MouseX<391&&MouseY>290&&MouseY<317){
				if( count%120 < 60 )//2秒のうち最初の1秒なら
					DrawBox( 235,290,395,317 , Brack , TRUE) ;
				
			}else if(MouseX>235&&MouseX<341&&MouseY>350&&MouseY<375){
				if( count%120 < 60 )//2秒のうち最初の1秒なら
					DrawBox( 235,350,345,378 , Brack , TRUE) ;

			}else if(MouseX>235&&MouseX<294&&MouseY>410&&MouseY<438){
				if( count%120 < 60 )//2秒のうち最初の1秒なら			
					DrawBox( 235,410,298,438 , Brack , TRUE) ;

				if(( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )break;
													
			}
			DrawBox( 0,0,200,100 , Brack , TRUE) ;
			count++;
			count2=count%120;
			DrawFormatString( 0, 0, White , "%d", count2 ) ;
			DrawFormatString( 100, 0, White , "%d", count ) ;
			ScreenFlip() ;			
			

		}			
		
		                    
        DxLib_End() ;                   // DXライブラリ使用の終了処理
        return 0 ;                      // ソフトの終了
}
ClearDrawScreen()関数だと全部消えてしまうため、DrawBox関数をしようしたのですがそうすると背景も消えて
しまうのでうまくいきません。

Re:続きです

Posted: 2008年1月30日(水) 01:04
by 管理人
基本的に描画は「不必要な部分を隠す」ようにプログラムするのではなく、
「毎回全部消して、毎回必要な描画を全て行う」というスタンスを取ります。
もちろん、違う方法もありますが、最初はその方法の方がいいでしょう。

今、

LoadGraphScreen( 0 , 0 , "back.bmp" , FALSE ) ;//DXライブラリサンプルプログラムより

ここで描画した画像が必要なら消した後で毎回書きましょう。これを毎回描いた位では、全体の処理速度はほとんど変わりません。

解決しました

Posted: 2008年2月03日(日) 19:53
by オークヒイロ
管理人さんのおかげで解決しました。ありがとうございます。