右キーを押して右に歩かせるプログラムだけだと、右に歩くアニメーションの後、停止したときに右に歩いた画像のままとまりますよね。
それを止まったときにその方向を向いた立ち止まった画像にするのがうまくいかないのです。
GetHitKeyStateAll_2をつかって組んでみたのですが、キーを離すと数値が0になるといっても離している間はずっと0のままですよね?
それだと右に動いた後と左に動いた後が重なってしまいます…。
『キーを離した瞬間』というきっかけを組みたいのですが、検索してもなかなか出てきませんでした。
どう組めば良いのでしょうか…
このままでは重なって左に向けません…
#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;//初期化と裏画面化
// 画像をロード
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配列に保存
Player.X = 0 , Player.Y = 288 ;
int JumpPower = 0 ;
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
//ココから
// ジャンプボタンを押していて、地面についていたらジャンプ
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;
}