blob: 5133e27e9a0ad56a61a340d558c38eb3dda04745 (
plain) (
blame)
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
118
119
120
121
122
123
124
125
126
127
|
#include "input_system.h"
#include "game.h"
#include "character_system.h"
#include "message_system.h"
#include "script_system.h"
#include "transform_system.h"
#include "animation_system.h"
struct Input {
bool left = false;
bool right = false;
bool up = false;
bool down = false;
};
void InputSystem::tick(double dt) {
SDL_Event e;
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT || (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE)) {
game_.quit();
return;
} else if (e.type == SDL_KEYDOWN) {
if (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT) {
for (int spriteId : game_.getSprites()) {
Sprite& sprite = game_.getSprite(spriteId);
if (sprite.controllable) {
game_.getSystem<CharacterSystem>().beginCrouch(spriteId);
}
}
} else if (e.key.keysym.sym == SDLK_SPACE) {
// If there is text on screen, try to advance it.
if (game_.getSystem<MessageSystem>().getCutsceneBarsProgress() != 0.0) {
game_.getSystem<MessageSystem>().advanceText();
} else {
// Otherwise, check if there is a sprite in front of the player.
for (int spriteId : game_.getSprites()) {
Sprite& sprite = game_.getSprite(spriteId);
if (sprite.controllable) {
vec2i checkLoc = sprite.loc + (unitVecInDirection(sprite.dir) * MOVEMENT_SPEED);
CollisionResult collision = game_.getSystem<TransformSystem>().checkCollision(spriteId, checkLoc, sprite.dir);
// If there is a sprite to be interacted with, rotate that sprite so it is facing the player.
// Then, run its interaction script if present.
if (collision.horiz.colliderSprite != -1) {
game_.getSystem<AnimationSystem>().setSpriteDirection(collision.horiz.colliderSprite, oppositeDirection(sprite.dir));
Sprite& collider = game_.getSprite(collision.horiz.colliderSprite);
if (collider.interactionScript != "") {
game_.getSystem<ScriptSystem>().runScript(collider.interactionScript);
}
} else if (collision.vert.colliderSprite != -1) {
game_.getSystem<AnimationSystem>().setSpriteDirection(collision.vert.colliderSprite, oppositeDirection(sprite.dir));
Sprite& collider = game_.getSprite(collision.vert.colliderSprite);
if (collider.interactionScript != "") {
game_.getSystem<ScriptSystem>().runScript(collider.interactionScript);
}
}
}
}
}
}
} else if (e.type == SDL_KEYUP && (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT)) {
for (int spriteId : game_.getSprites()) {
Sprite& sprite = game_.getSprite(spriteId);
if (sprite.controllable) {
game_.getSystem<CharacterSystem>().endCrouch(spriteId);
}
}
}
}
Input keystate;
const Uint8* state = SDL_GetKeyboardState(NULL);
keystate.left = state[SDL_SCANCODE_LEFT];
keystate.right = state[SDL_SCANCODE_RIGHT];
keystate.up = state[SDL_SCANCODE_UP];
keystate.down = state[SDL_SCANCODE_DOWN];
for (int spriteId : game_.getSprites()) {
Sprite& sprite = game_.getSprite(spriteId);
if (sprite.controllable) {
bool directed = false;
Direction dir = Direction::left;
if (keystate.up)
{
directed = true;
dir = Direction::up;
} else if (keystate.down)
{
directed = true;
dir = Direction::down;
}
if (keystate.left)
{
directed = true;
if (dir == Direction::up) {
dir = Direction::up_left;
} else if (dir == Direction::down) {
dir = Direction::down_left;
} else {
dir = Direction::left;
}
} else if (keystate.right)
{
directed = true;
if (dir == Direction::up) {
dir = Direction::up_right;
} else if (dir == Direction::down) {
dir = Direction::down_right;
} else {
dir = Direction::right;
}
}
if (directed) {
game_.getSystem<CharacterSystem>().moveInDirection(spriteId, dir);
} else {
game_.getSystem<CharacterSystem>().stopDirecting(spriteId);
}
}
}
}
|