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;
}
GetHitKeyStateAll_2(Key);を使い書き直したら動かせない
Re: GetHitKeyStateAll_2(Key);を使い書き直したら動かせない
Player構造体がループの中で宣言されているのが問題だと思います。
これだとループを一周するたびにPlayerが初期化されてしまいます。
あと、コードはcodeタグで囲んでいただけるとありがたいです。
よろしくお願いします。
これだとループを一周するたびにPlayerが初期化されてしまいます。
あと、コードはcodeタグで囲んでいただけるとありがたいです。
よろしくお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: GetHitKeyStateAll_2(Key);を使い書き直したら動かせない
ありがとうございます。
…構造体と初期化の位置を変えてみたらとりあえず動かすことができるようになったのですが、
画面がカクカクして動作が重くなってしまいました。
裏画面処理と表画面への反映の位置は合ってると思うんですが、どこがおかしいのでしょうか…
あとcodeで囲むのを忘れていました…すいません
…構造体と初期化の位置を変えてみたらとりあえず動かすことができるようになったのですが、
画面がカクカクして動作が重くなってしまいました。
裏画面処理と表画面への反映の位置は合ってると思うんですが、どこがおかしいのでしょうか…
あと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;
}
Re: GetHitKeyStateAll_2(Key);を使い書き直したら動かせない
画像のロードをループ内に入れないでください。
一回だけロードすればOKです。
一回だけロードすればOKです。
Re: GetHitKeyStateAll_2(Key);を使い書き直したら動かせない
言われた通り、画像のロードをwhileより前に動かしたら
スムーズに移動もジャンプもできました!ありがとうございます。解決です。
スムーズに移動もジャンプもできました!ありがとうございます。解決です。