ジョイスティック(アナログスティック)の状態(倒されている向き、傾き具合)に忠実に従い、キャラクターを移動させるシステムを完成させました。
そしてついでにジョイスティック関連の処理を簡単にする構造体(メンバ関数あり)をつくりました。
↓ソースコードです
► スポイラーを表示
↓メイン
CODE:
#include "DxLib.h"
#include "joypad.h"
double x=320, y=240;
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){
ChangeWindowMode(TRUE);
SetOutApplicationLogValidFlag(FALSE);
SetWindowText("DxLib");
if(DxLib_Init() == -1) return(-1);
SetAlwaysRunFlag(TRUE);
SetDrawScreen(DX_SCREEN_BACK);
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
ClsDrawScreen();
joypad jp;
x += 10*jp.x;
y += 10*jp.y;
DrawCircle( (int)x,(int)y, 2, 0xffffff);
ScreenFlip();
}
DxLib_End();
return(0);
}
↓"joypad.h"
CODE:
#include "DxLib.h"
#include
#ifndef _JOYPAD_
#define _JOYPAD_
struct joypad{
struct DistData{
double x, y, speed;
DistData(){}
DistData(double rx, double ry, double rspeed){ x=rx,y=ry,speed=rspeed; }
};
struct StickData{
int x, y;
StickData(){}
StickData(int rx, int ry){ x=rx, y=ry; }
};
int padx, pady;
double x, y;
double dx, dy;
int padNum;
int padState;
int keyState;
void init(int pad = 1){
padNum = GetJoypadNum();
int pads[4]={DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4};
type = pads[pad-1];
GetJoypadAnalogInput(&padx, &pady, pads[pad-1]);
padState = GetJoypadInputState(type);
keyState = GetJoypadInputState(DX_INPUT_KEY);
DistData d = GetDist(padx, pady);
dx = d.x, dy = d.y;
x = dx*d.speed;
y = dy*d.speed;
}
joypad(int pad = 1){ init(pad); }
bool check(int padInput, bool perm = true){
if(padState&padInput) return true;
if(perm){
if(keyState&padInput) return true;
return false;
}
return false;
}
void config(int PadInput, int KeyInput1, int KeyInput2 = -1, int KeyInput3 = -1, int KeyInput4 = -1){
SetJoypadInputToKeyInput(type, PadInput, KeyInput1, KeyInput2, KeyInput3, KeyInput4);
}
void vib(int time = -1, int power = 1000){ StartJoypadVibration(type, power, time); }
void stop(){ StopJoypadVibration(type); }
private:
int type;
double GetSpeed(int b, int s){
double hyp = sqrt( (double)(b*b+s*s) );
double S = s*1000/fabs( (double)b);
double HYP = sqrt( (double)(1000*1000+S*S) );
return hyp / HYP;
}
DistData GetDist(int rx, int ry){
StickData stick(rx, ry);
DistData d(0,0,0);
if(stick.x==0 && stick.y==0) return d;
double hyp_2 = stick.x*stick.x + stick.y*stick.y;
double hyp = sqrt(hyp_2);
d.x = stick.x/hyp;
d.y = stick.y/hyp;
if(fabs( (double)stick.x) >= fabs( (double)stick.y) ) d.speed = GetSpeed(stick.x, stick.y);
else d.speed = GetSpeed(stick.y, stick.y);
return d;
}
};
#endif
~解説~
1つのコントローラにつき1つの実体を持つことを想定しています。
DXライブラリのジョイパッド関連の機能を使いやすくすることが目的です。
コンストラクタの第1引数には、管理したいコントローラーの識別子(DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4の何れか)を指定します。
◎メンバ変数
padx・・・ジョイスティックのx軸の入力情報
pady・・・ジョイスティックのy軸の入力情報
x・・・最高速度の何倍で移動させればよいか(x座標)
y・・・最高速度の何倍で移動させればよいか(y座標)
dx・・・最高速度の何倍で移動させればよいか(x座標)※傾き具合を無視
dy・・・最高速度の何倍で移動させればよいか(y座標)※傾き具合を無視
padNum・・・接続されているコントローラーの数
padState・・・パッドの入力情報
keyState・・・キーボードの入力情報
x,yの使い方については、上記のソースコードを見てください。
キャラクターを一定の速度で移動させたい時に便利で、
ジョイスティックの傾き具合によって速度が調整されます。
パッドとキーボードの状態を同時にチェックしたい場合はメンバ関数を使ってください。
◎メンバ関数
bool check(int padInput, bool perm = true)
特定のパッドの入力状態を返します。
詳細はDXライブラリリファレンスの
GetJoypadInputStateの項を参照していただくとわかると思います。
返り値 ・・・ true:押されている
false:押されていない
第2引数にtrueを指定すると対応するキーボードが押された場合もtrueが返されます。
void config(int PadInput, int KeyInput1)
パッドに対応させるキーボードを設定できます。
第1引数に設定したパッドを、第2引数に対応させたいキーボードを指定します。
ちなみに1つのパッドにつき4つまで設定できます。
これについても詳細は
ここをご参照ください。
void vib(int time = -1, int power = 1000)
ジョイパッドを振動させます。
第1引数には振動させる時間(ミリ秒)を、第2引数には振動の強さ(0~1000)を指定できます。
void stop()
ジョイパッドの振動を停止させます。