ページ 11

キー

Posted: 2008年1月25日(金) 11:24
by ぜt
http://dixq.net/g/#33
のキー処理の部分だけ関数にして使いたいですけど、動作が速くなって使えません。
どこか加えないといけないものがあるのでしょうか?

Re:キー

Posted: 2008年1月25日(金) 12:49
by やそ
while文でループさせている中で、タイマーを使ってwaitを置けばよろしいのではないでしょうか?

Re:キー

Posted: 2008年1月25日(金) 13:44
by 管理人
恐らく裏画面処理をしていないからだと思います。
ループ処理する時は、裏画面処理をしてください。
そうしないと画面がチラチラすると思いますし、モニタのリフレッシュレートにあわせるべきでしょう。

裏画面処理については別途お読み下さい。

そして、先ほどのサンプルの中で
if( DownOshita==1 || DownPusingCounter>30){ // たった今押したか、30カウンター以上押しっぱなしなら
            if(DownPusingCounter>30)              // 30カウンター以上押しっぱなしならカウンターを27へ
                    DownPusingCounter=27;         // オートの場合4回に1回下に下がる。
 
と、あったと思いますが、>30の数字を増やせば遅くなりますし、オートで動く最中の動きを遅くするには
> DownPusingCounter=27; // オートの場合4回に1回下に下がる。
この数字を小さくすれば遅くなります。

Re:キー

Posted: 2008年1月25日(金) 15:03
by ぜt
何処から何処までを関数に入れたらいいですか?
すいませんうまくいきませんでした。

Re:キー

Posted: 2008年1月25日(金) 18:01
by 管理人
もし、グローバル変数を用いるなら使っている変数をグローバル変数へ、
関数へ値受け渡しをするなら任意の場所で宣言しなおしてください。
そして、メインでループしているところを任意の関数を作って置き換えてください。

その前に裏画面処理をしていないのでしたら、おつくりになっている裏画面処理をしていないプログラムを裏画面処理をするものに変更されたほうがいいと思います。

Re:キー

Posted: 2008年1月27日(日) 15:51
by ぜt
関数にしてみたけどやっぱりうまくいきません。
#include "DxLib.h"

void char_disp(int White,int y){
        DrawString( 150 , y   , "■"            , White );
        DrawString( 170 , 100 , "NEW GAME"  , White );
        DrawString( 170 , 120 , "CONTINUE1" , White );
        DrawString( 170 , 140 , "CONTINUE2" , White );
        DrawString( 170 , 160 , "CONTINUE3" , White );
        DrawString( 170 , 180 , "CONTINUE4" , White );
        DrawString( 170 , 200 , "CONTINUE5" , White );
        DrawString( 170 , 220 , "CONTINUE6" , White );
        DrawString( 170 , 240 , "LOG OUT"   , White );
}

void Key(void);

int White,y=100;
char KeyBuf[ 256 ] ;                                     

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
        ChangeWindowMode( TRUE ) ;

        if( DxLib_Init() == -1 ) return -1;                      
         
        White = GetColor( 255 , 255 , 255 ) ;                    
          
        SetDrawScreen( DX_SCREEN_BACK ) ;                        
           
        while( 1 )
		{
                ClearDrawScreen(); 

                GetHitKeyStateAll( KeyBuf ) ;  

                if( KeyBuf[ KEY_INPUT_ESCAPE ] == 1 ) break ;    
                                
                char_disp(White,y); 

				Key();
      
                if( ProcessMessage() == -1 ) break ;          
                        ScreenFlip() ;                          
        }

        DxLib_End() ;
        return 0 ;   
}
void Key(void)
{
	int DownOshita=0,NewDown=0,OldDown=0,DownPusingCounter=0;

	GetHitKeyStateAll( KeyBuf ) ;  

    if( KeyBuf[ KEY_INPUT_DOWN ] == 1 )              
         NewDown=1;                                
    else                                             
        NewDown=0;                                  
                                
    if( OldDown==0 && NewDown==1 )                   
        DownOshita=1;                              
    else                                             
        DownOshita=0;                               
                                
    if( OldDown==1 && NewDown==1 )                   
        DownPusingCounter++;                        
    else
        DownPusingCounter=0;

    if( DownOshita==1 || DownPusingCounter>30)
	{
		if(DownPusingCounter>30)              
            DownPusingCounter=27;         
             y+=20;                                           
             if(y==260)                            
                  y=100;                        
    }
    OldDown=NewDown;                       
}
キー処理が早くなります。
どこが間違っているのでしょうか?

Re:キー

Posted: 2008年1月28日(月) 04:57
by 管理人
それはローカル変数が毎回0で初期化されているからです。
Key関数が呼ばれるたびに
int DownOshita=0,NewDown=0,OldDown=0,DownPusingCounter=0;
で全部0になってしまってカウントされていません。
変数の値を保存するには、グローバル変数を使うか、staticにするかなど、しないといけません。

例えばこちらを

void Key(void)
{
	int DownOshita=0,NewDown=0,OldDown=0,DownPusingCounter=0;

これを

int DownOshita=0,NewDown=0,OldDown=0,DownPusingCounter=0;
void Key(void)
{

こうしてグローバル変数にするとうまくいきますよ。
なお、グローバル変数は宣言すると0で初期化されます。

後、コードを投稿するときは<pre></pre>タグで挟んで投稿してください(<>は半角)

Re:キー

Posted: 2008年1月28日(月) 09:14
by ぜt
分かりました。ありがとうございます。
今度コードを投稿するときは、気をつけます。