-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjoypad.cpp
More file actions
117 lines (100 loc) · 3.46 KB
/
Copy pathjoypad.cpp
File metadata and controls
117 lines (100 loc) · 3.46 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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "joypad.h"
#include <SDL2/SDL.h>
#include "cpu.h"
#include <iostream>
#include "gpu.h"
namespace Joypad
{
bool mousedown = false;
bool mouseup = false;
bool control = false;
bool pressed[512];
std::deque<char> typeStack;
void update()
{
mouseup = false;
SDL_Event event;
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
CPU::quit();
break;
case SDL_KEYDOWN:
{
// Control type stack size
if (typeStack.size() >= 256) typeStack.pop_front();
SDL_Keycode key = event.key.keysym.sym;
// Typing buffer
if (key < 256) {
// Shifting
if(event.key.keysym.mod & KMOD_SHIFT) {
if (isalpha(key)) key -= 32;
switch (key)
{
case '-': key = '_'; break;
}
}
typeStack.push_back(key);
}
if (control && !CPU::tasplayer.isRunning())
pressed[event.key.keysym.scancode] = true;
}
break;
case SDL_KEYUP:
if (control && !CPU::tasplayer.isRunning())
pressed[event.key.keysym.scancode] = false;
break;
case SDL_WINDOWEVENT:
switch (event.window.event) {
case SDL_WINDOWEVENT_CLOSE:
if (event.window.windowID == CPU::debugger.getWindowID())
{
CPU::debugger.close();
}
else if (event.window.windowID == GPU::getWindowID())
{
CPU::quit();
}
break;
case SDL_WINDOWEVENT_FOCUS_GAINED:
if (event.window.windowID == GPU::getWindowID())
control = true;
break;
case SDL_WINDOWEVENT_FOCUS_LOST:
if (event.window.windowID == GPU::getWindowID())
control = false;
break;
}
break;
case SDL_MOUSEBUTTONDOWN:
mousedown = true;
break;
case SDL_MOUSEBUTTONUP:
mouseup = true;
mousedown = false;
break;
}
}
}
uint8_t getButtons()
{
return (!pressed[SDL_SCANCODE_X]) |
(!pressed[SDL_SCANCODE_Z] << 1) |
(!pressed[SDL_SCANCODE_RSHIFT] << 2) |
(!pressed[SDL_SCANCODE_RETURN] << 3);
}
uint8_t getDirections()
{
uint8_t value = (!pressed[SDL_SCANCODE_RIGHT]) |
(!pressed[SDL_SCANCODE_LEFT] << 1) |
(!pressed[SDL_SCANCODE_UP] << 2) |
(!pressed[SDL_SCANCODE_DOWN] << 3);
if (pressed[SDL_SCANCODE_RIGHT] && pressed[SDL_SCANCODE_LEFT])
value |= 0x3;
if (pressed[SDL_SCANCODE_UP] && pressed[SDL_SCANCODE_DOWN])
value |= 0xC;
return value;
}
}