-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgamepad.hpp
More file actions
executable file
·87 lines (74 loc) · 2.34 KB
/
gamepad.hpp
File metadata and controls
executable file
·87 lines (74 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#pragma once
#include <stddef.h>
#include <thread>
#include <memory>
#include <stdint.h>
#include <functional>
enum class AxisNames{
LSX=0,LSY=1,RSX=2,RSY=3,RT=4,LT=5,DX=6,DY=7
};
static inline const char* GetAxisName(AxisNames name){
const char* names[]= {"LSX","LSY","RSX","RSY","RT","LT","DX","DY"};
int idx=(int)name;
const int cnt=sizeof(names)/sizeof(names[0]);
return idx<cnt?names[idx]:"Unknown";
}
enum class ButtonNames{
A=0,B=1,X=2,Y=3,LB=4,RB=5,BACK=6,START=7,CROSS=8,AXISL=9,AXISR=10
};
static inline const char* GetButtonName(ButtonNames name){
const char* names[]= {"A","B","X","Y","LB","RB","BACK","START","CROSS","AXISL","AXISR"};
int idx=(int)name;
const int cnt=sizeof(names)/sizeof(names[0]);
return idx<cnt?names[idx]:"Unkwnown";
}
class GamePad{
private:
int fd;//ゲームパッドのファイル識別子
std::unique_ptr<std::thread> task{nullptr};
int button_num{0},axis_num{0};
bool *buttons{nullptr};
int *axises{nullptr};
typedef std::function<void(const GamePad*,ButtonNames,bool)> button_event_t;
typedef std::function<void(const GamePad*,AxisNames,float)> axis_event_t;
button_event_t button_event{nullptr};
axis_event_t axis_event{nullptr};
void Update ();//ここで非同期で値を取得する。
public:
GamePad(const char* filename);
virtual ~GamePad();
void Status()const;//標準入出力へ状態を表示
//イベント関数設定
inline void SetButtonChangedEvent(const button_event_t& event=nullptr){
button_event=event;
}
inline void SetAxisChangedEvent(const axis_event_t& event=nullptr){
axis_event=event;
}
//状態確認
inline bool GetButton(int id)const{
return id<button_num?buttons[id]:false;
}
inline bool GetButton(ButtonNames name)const{
return GetButton((int)name);
}
inline int GetAxisRaw(int id)const{
return id<axis_num?axises[id]:0;
}
inline int GetAxisRaw(AxisNames name)const{
return GetAxisRaw((int)name);
}
inline float GetAxis(int id)const{
return (float)GetAxisRaw(id)/INT16_MAX;
}
inline float GetAxis(AxisNames name)const{
return GetAxis((int)name);
}
//ボタンの個数
inline int GetButtonNum()const{
return button_num;
}
inline int GetAxisNum()const{
return axis_num;
}
};