main.cpp
コード:
#include <DxLib.h>
#include <memory>
#include "JoypadInput.h"
#include "KeyboardInput.h"
using namespace std;
auto WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow ) -> int
{
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
{
auto pPad = make_unique< CJoypadInput >();
auto pKey = make_unique< CKeyboardInput >();
while( !ProcessMessage() && !CheckHitKey( KEY_INPUT_ESCAPE ) ) {
ClearDrawScreen();
pKey->Proc();
pPad->Proc();
ScreenFlip();
}
}
DxLib_End();
return 0;
}
JoypadInput.h
コード:
#pragma once
#include "InterfaceInput.h"
class CJoypadInput : public IJoypad
{
public:
CJoypadInput();
~CJoypadInput();
virtual bool Proc();
virtual bool IsInput( int buttonNo ) const override;
};
JoypadInput.cpp
コード:
#include <DxLib.h>
#include "DebugUtility.h"
#include "InterfaceInput.h"
#include "JoypadInput.h"
namespace
{
const static int BUTTON_NUM = 28; // ゲームパッド一つの最大ボタン数
static bool bInput[ BUTTON_NUM ]; // 入力状態
}
CJoypadInput::CJoypadInput()
{
for( int i = 0 ; i < BUTTON_NUM ; i++ ) {
bInput[i] = false;
}
}
CJoypadInput::~CJoypadInput()
{
}
bool CJoypadInput::Proc()
{
// Joypad1 の入力状態を得る
auto padState = GetJoypadInputState( DX_INPUT_PAD1 );
for( int i = 0 ; i < BUTTON_NUM ; i++ ) {
if( ( padState & ( 1 << i ) ) != 0 ) {
bInput[i] = true;
} else {
bInput[i] = false;
}
}
return true;
}
bool CJoypadInput::IsInput( int buttonNo ) const
{
DBG_ASSERT( ( 0 <= buttonNo ) && ( buttonNo < BUTTON_NUM ) );
return bInput[ buttonNo ];
}
KeyboardInput.h
コード:
#pragma once
#include "InterfaceInput.h"
class CKeyboardInput : public IKeyboard
{
public:
CKeyboardInput();
~CKeyboardInput();
virtual bool Proc();
virtual bool IsInput( int keyCode ) const override;
};
KeyboardInput.cpp
コード:
#include <DxLib.h>
#include "KeyboardInput.h"
#include "DebugUtility.h"
namespace
{
static const int KEY_NUM = 256;
static char keyBuff[ KEY_NUM ];
}
CKeyboardInput::CKeyboardInput()
{
for( int i = 0 ; i < KEY_NUM ; i++ ) {
keyBuff[i] = 0;
}
}
CKeyboardInput::~CKeyboardInput()
{
}
bool CKeyboardInput::Proc()
{
GetHitKeyStateAll( keyBuff );
return true;
}
bool CKeyboardInput::IsInput( int keyCode ) const
{
DBG_ASSERT( ( 0 <= keyCode ) && ( keyCode < KEY_NUM ) );
return keyBuff[ keyCode ] != 0;
}
InterfaceInput.h
コード:
#pragma once
/*
* 複数の入力装置に対応できるようにインターフェースを作っておく.
*/
class IJoypad
{
public:
virtual ~IJoypad() {}
// 現在入力をしているかどうか( ゲームパッド )
// @param buttonNo ボタン番号
virtual bool IsInput( int buttonNo ) const = 0;
};
class IKeyboard
{
public:
virtual ~IKeyboard() {}
// 現在入力をしているかどうか( キーボード )
// @param keyCode キーコード
virtual bool IsInput( int keyCode ) const = 0;
};
DebugUtility.h
コード:
#pragma once
/*
* デバッグ用のマクロを置いておく場所
*
* !!! ヘッダファイルにはインクルードしないこと !!!
*/
#if _DEBUG
# include <cassert>
# define DBG_ASSERT assert
#else
# define DBG_ASSERT ( void )0
#endif