GetHitKeyStateAll_2(Key);を使い書き直したら動かせない

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

GetHitKeyStateAll_2(Key);を使い書き直したら動かせない

#1

投稿記事 by jlok » 14年前

DXライブラリを始めたばっかりで初歩的な質問ですみませんが…
アクションゲームを作ろうとして、GetHitKeyStateAll(Key);を使いキャラクターが左右にうごけてジャンプもできるプログラムを組みました。
しかし、作り上げた後にGetHitKeyStateAll_2(Key);の存在を知り、プログラムを書き直すことになりました。
そこで、ゲームプログラミングの館の『ゲームプログラムの基本骨格(キー入力監視付)』の部分を使わせてもらい、
完成していた部分だけそっちにコピーしました。
GetHitKeyStateAll_2(Key);は押している間数値を増やすものだということで少し書き変えてみたのですが、
左右移動、ジャンプをしようとしたらキーを押した瞬間ちょっとだけ動いて止まり、離したらもとに戻ってしまいます。
たぶん押した瞬間しか反応していないんだと思うのですが、

if( Key[ KEY_INPUT_RIGHT ] >= 1 )
Player.X+=3 ;
と書けば1以上の間動き続けるのではないのでしょうか?

作ったのははこちらです…汚くてすいません。


#include "DxLib.h"

int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない

//ここから書く

struct Playerdata{
int X, Y, img;
}Player;


Player.X = 0 , Player.Y = 288 ; //キャラの座標
int JumpPower = 0 ;

// 画像をロード
int lenga1 = LoadGraph( "image/map/lenga1.png" );
int sea1 = LoadGraph( "image/map/sea1.png" );
int statesbar = LoadGraph( "image/statesbar.png" );
int haikei1 = LoadGraph( "image/haikei1.png" );
int chara[12];
LoadDivGraph( "image/chara.png" , 12 , 6 , 2 , 64 , 64 , chara );//画像を分割してimage配列に保存


// ジャンプボタンを押していて、地面についていたらジャンプ
if ((Key[KEY_INPUT_SPACE] >= 1 ) && Player.Y == 288 ){
JumpPower = 18 ;
}

//地面より高かったらジャンプの画像
if ( Player.Y < 288 ){
Player.img=chara[5];
}


if( Key[ KEY_INPUT_RIGHT ] >= 1 ) // 右キーが押されていたら
Player.X+=3 ; //右に動く

if(( Key[ KEY_INPUT_RIGHT ] >= 1 ) && Player.Y == 288 ) // 右キーが押されていて地面についていたら
Player.img=chara[(Player.X%96)/24 +1]; //右に歩くアニメ

if(( Key[ KEY_INPUT_RIGHT ] == 0 ) && Player.Y == 288 )// 右キーが離されて地面についてたら
Player.img=chara[0]; //右を向く


if( Key[ KEY_INPUT_LEFT ] >= 1 ) // 左キーが押されていたら
Player.X-=3 ; //左に動く

if(( Key[ KEY_INPUT_LEFT ] >= 1 ) && Player.Y == 288 ){ // 左キーが押されていて地面についていたら
Player.img=chara[(Player.X%96)/24 +7]; //左に歩くアニメ
}


// 落下処理
Player.Y -= JumpPower ;

// 落下加速度を加える
JumpPower -= 1 ;


// もし地面についていたら止まる
if( Player.Y > 288 )
{
Player.Y = 288 ;
JumpPower = 0 ;
}


DrawGraph( 0, 0, haikei1, FALSE ); // 背景


//マップ画像
//レンガ
for(int y=0 ; y<4 ; y++){
for(int x=0 ; x<20 ; x++){
DrawGraph(x*32+0,y*32+352,lenga1,FALSE);
}
}

//海
for(int y=0 ; y<1 ; y++){
for(int x=0 ; x<20 ; x++){
DrawGraph(x*32+0,y*32+388,sea1,TRUE);
}
}

//ステータスバー背景
for(int y=0 ; y<1 ; y++){
for(int x=0 ; x<20 ; x++){
DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
}
}

DrawGraph( Player.X, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画


ScreenFlip();
}

DxLib_End();
return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: GetHitKeyStateAll_2(Key);を使い書き直したら動かせない

#2

投稿記事 by みけCAT » 14年前

Player構造体がループの中で宣言されているのが問題だと思います。
これだとループを一周するたびにPlayerが初期化されてしまいます。

あと、コードはcodeタグで囲んでいただけるとありがたいです。
よろしくお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

jlok

Re: GetHitKeyStateAll_2(Key);を使い書き直したら動かせない

#3

投稿記事 by jlok » 14年前

ありがとうございます。
…構造体と初期化の位置を変えてみたらとりあえず動かすことができるようになったのですが、
画面がカクカクして動作が重くなってしまいました。
裏画面処理と表画面への反映の位置は合ってると思うんですが、どこがおかしいのでしょうか…
あとcodeで囲むのを忘れていました…すいません

コード:

#include "DxLib.h"


//構造体
		struct Playerdata{
			int X, Y, img;
	}Player;

 
int Key[256];
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}


 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

		Player.X = 0 , Player.Y = 288 ;
	int JumpPower = 0 ;
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
 
        //ココから




	// 画像をロード
	int lenga1 = LoadGraph( "image/map/lenga1.png" );
	int sea1 = LoadGraph( "image/map/sea1.png" );
	int statesbar = LoadGraph( "image/statesbar.png" ); 
	int haikei1 = LoadGraph( "image/haikei1.png" ); 
	int chara[12];
    LoadDivGraph( "image/chara.png" , 12 , 6 , 2 , 64 , 64 , chara );//画像を分割してimage配列に保存


			// ジャンプボタンを押していて、地面についていたらジャンプ
		if ((Key[KEY_INPUT_SPACE] >=1 ) && Player.Y == 288 ){
			JumpPower = 18 ;
		}

		//地面より高かったらジャンプの画像
		if ( Player.Y < 288 ){
			Player.img=chara[5];
		}


        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) // 右キーが押されていたら
			Player.X+=3 ;	//右に動く

        if(( Key[ KEY_INPUT_RIGHT ] >= 1 ) && Player.Y == 288 ) // 右キーが押されていて地面についていたら
			Player.img=chara[(Player.X%96)/24 +1];          //右に歩くアニメ

       if(( Key[ KEY_INPUT_RIGHT ] == 0 ) && Player.Y == 288 )// 右キーが離されて地面についてたら
		   Player.img=chara[0];		//右を向く
		

		if( Key[ KEY_INPUT_LEFT  ] >= 1 ) // 左キーが押されていたら
			Player.X-=3 ;	//左に動く

		if(( Key[ KEY_INPUT_LEFT  ] >= 1 ) && Player.Y == 288 ){ // 左キーが押されていて地面についていたら
			Player.img=chara[(Player.X%96)/24 +7];          //左に歩くアニメ
		}


	// 落下処理
	Player.Y -= JumpPower ;

	// 落下加速度を加える
	JumpPower -= 1 ;


	// もし地面についていたら止まる	
	if( Player.Y > 288 )
	{
		Player.Y = 288 ;
		JumpPower = 0 ;
	}


	DrawGraph( 0, 0, haikei1, FALSE ); // 背景


	//マップ
	//レンガ
	for(int y=0 ; y<4 ; y++){
		for(int x=0 ; x<20 ; x++){
			DrawGraph(x*32+0,y*32+352,lenga1,FALSE);
			}
	}

	//海
	for(int y=0 ; y<1 ; y++){
		for(int x=0 ; x<20 ; x++){
			DrawGraph(x*32+0,y*32+388,sea1,TRUE);
			}
	}

	//ステータスバー背景
	for(int y=0 ; y<1 ; y++){
		for(int x=0 ; x<20 ; x++){
			DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
			}
	}

	DrawGraph( Player.X, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画



 
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}




アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: GetHitKeyStateAll_2(Key);を使い書き直したら動かせない

#4

投稿記事 by h2so5 » 14年前

画像のロードをループ内に入れないでください。
一回だけロードすればOKです。

jlok

Re: GetHitKeyStateAll_2(Key);を使い書き直したら動かせない

#5

投稿記事 by jlok » 14年前

言われた通り、画像のロードをwhileより前に動かしたら
スムーズに移動もジャンプもできました!ありがとうございます。解決です。

閉鎖

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