キー入力に関して問題自体は解決したのですが、それがなぜ解決したのが不明でしたので質問させていただきます。キーを入力すると連続ではなく一回だけ反応するようにしました。
◯修正前(L51~L81あたり)
#include "../DxLib/DxLib.h"
#define TILE_X_NUM 8
#define TILE_Y_NUM 98
#define TILE_NUM TILE_X_NUM * TILE_Y_NUM
#define TILE_SIZE 32
#define SCREEN_W 640
#define SCREEN_H 480
#define MAP_W SCREEN_W / TILE_SIZE
#define MAP_H SCREEN_H / TILE_SIZE
int tile[ TILE_NUM ];
int map[ MAP_H ][ MAP_W ];
int pX = 5, pY = 5, pImg;
int pressingCount[ 256 ], releasingCount[ 256 ];
void load()
{
LoadDivGraph( "tile.png", TILE_NUM, TILE_X_NUM, TILE_Y_NUM, TILE_SIZE, TILE_SIZE, tile );
pImg = LoadGraph( "player.png" );
}
void put()
{
int t;
for( int y = 0; y < MAP_H; y++ ){
for( int x = 0; x < MAP_W; x++ ){
t = GetRand( 1 );
map[ y ][ x ] = t * 40;
}
}
map[ GetRand( MAP_H - 1 ) ][ GetRand( MAP_W - 1 ) ] = 3;
}
void draw(){
for( int y = 0; y < MAP_H; y++ ){
for( int x = 0; x < MAP_W; x++ ){
DrawGraph( x * TILE_SIZE, y * TILE_SIZE, tile[ map[ y ][ x ] ], TRUE );
}
}
DrawExtendGraph( pX * TILE_SIZE, pY * TILE_SIZE, pX * TILE_SIZE + TILE_SIZE, pY * TILE_SIZE + TILE_SIZE, pImg, TRUE );
}
// ここから
int getPressingCount( int k )
{
char key[ 256 ];
GetHitKeyStateAll( key );
for( int i = 0; i < 256; i++ ){
if( key[ i ] > 0 ){
if( releasingCount[ i ] > 0 ) {
releasingCount[ i ] = 0;
}
pressingCount[ i ]++;
}
else{
if( pressingCount[ i ] > 0 ){
pressingCount[ i ] = 0;
}
releasingCount[ i ]++;
}
}
return( pressingCount[ k ] );
}
void update()
{
if( getPressingCount( KEY_INPUT_UP ) == 1 ) pY--;
if( getPressingCount( KEY_INPUT_DOWN ) == 1 ) pY++;
if( getPressingCount( KEY_INPUT_LEFT ) == 1 ) pX--;
if( getPressingCount( KEY_INPUT_RIGHT ) == 1 ) pX++;
}
// ここまでが問題の部分です
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
ChangeWindowMode( TRUE );
DxLib_Init();
load();
put();
while( !ProcessMessage() && !CheckHitKey( KEY_INPUT_ESCAPE ) ){
ClearDrawScreen();
update();
draw();
ScreenFlip();
}
DxLib_End();
return 0;
}
#include "../DxLib/DxLib.h"
#define TILE_X_NUM 8
#define TILE_Y_NUM 98
#define TILE_NUM TILE_X_NUM * TILE_Y_NUM
#define TILE_SIZE 32
#define SCREEN_W 640
#define SCREEN_H 480
#define MAP_W SCREEN_W / TILE_SIZE
#define MAP_H SCREEN_H / TILE_SIZE
int tile[ TILE_NUM ];
int map[ MAP_H ][ MAP_W ];
int pX = 5, pY = 5, pImg;
int pressingCount[ 256 ], releasingCount[ 256 ];
void load()
{
LoadDivGraph( "tile.png", TILE_NUM, TILE_X_NUM, TILE_Y_NUM, TILE_SIZE, TILE_SIZE, tile );
pImg = LoadGraph( "player.png" );
}
void put()
{
int t;
for( int y = 0; y < MAP_H; y++ ){
for( int x = 0; x < MAP_W; x++ ){
t = GetRand( 1 );
map[ y ][ x ] = t * 40;
}
}
map[ GetRand( MAP_H - 1 ) ][ GetRand( MAP_W - 1 ) ] = 3;
}
void draw(){
for( int y = 0; y < MAP_H; y++ ){
for( int x = 0; x < MAP_W; x++ ){
DrawGraph( x * TILE_SIZE, y * TILE_SIZE, tile[ map[ y ][ x ] ], TRUE );
}
}
DrawExtendGraph( pX * TILE_SIZE, pY * TILE_SIZE, pX * TILE_SIZE + TILE_SIZE, pY * TILE_SIZE + TILE_SIZE, pImg, TRUE );
}
// ここから
void GetHitKeyStateAll_2()
{
char key[ 256 ];
GetHitKeyStateAll( key );
for( int i = 0; i < 256; i++ ){
if( key[ i ] > 0 ){
if( releasingCount[ i ] > 0 ) {
releasingCount[ i ] = 0;
}
pressingCount[ i ]++;
}
else{
if( pressingCount[ i ] > 0 ){
pressingCount[ i ] = 0;
}
releasingCount[ i ]++;
}
}
}
int getPressingCount( int k )
{
return( pressingCount[ k ] );
}
void update()
{
if( getPressingCount( KEY_INPUT_UP ) == 1 ) pY--;
if( getPressingCount( KEY_INPUT_DOWN ) == 1 ) pY++;
if( getPressingCount( KEY_INPUT_LEFT ) == 1 ) pX--;
if( getPressingCount( KEY_INPUT_RIGHT ) == 1 ) pX++;
}
// ここまでが問題の部分です
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
ChangeWindowMode( TRUE );
DxLib_Init();
load();
put();
while( !ProcessMessage() && !CheckHitKey( KEY_INPUT_ESCAPE ) ){
ClearDrawScreen();
GetHitKeyStateAll_2();
update();
draw();
ScreenFlip();
}
DxLib_End();
return 0;
}
なぜ修正後(キー入力を監視する関数と、押されたフレーム数を返す関数を分けた方)はうまく動作するのかよくわかりません。修正前と修正後の違いを教えていただきたいです。