summaryrefslogtreecommitdiff
path: root/source/presentation/KeyboardHandler.cpp
blob: b588cbe95e92836da8b42a2d60136465ace03a3e (plain)
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
#include "KeyboardHandler.h"

KeyboardHandler::KeyboardHandler(Maze::Direction currentFacing)
    :_up(false),
    _down(false),
    _left(false),
    _right(false),
    _smokescreen(false),
    _previousFacing(currentFacing)
{
    _keyboardEvents = al_create_event_queue();
    al_register_event_source(_keyboardEvents, al_get_keyboard_event_source());
}

KeyboardHandler::KeyboardHandler(const KeyboardHandler& ref)
    :_up(ref._up),
    _down(ref._down),
    _left(ref._left),
    _right(ref._right),
    _smokescreen(ref._smokescreen),
    _previousFacing(ref._previousFacing)
{
    _keyboardEvents = al_create_event_queue();
    al_register_event_source(_keyboardEvents, al_get_keyboard_event_source());
}

KeyboardHandler& KeyboardHandler::operator=(const KeyboardHandler& rhs)
{
    _up = rhs._up;
    _down = rhs._down;
    _left = rhs._left;
    _right = rhs._right;
    _smokescreen = rhs._smokescreen;
    _previousFacing = rhs._previousFacing;

    if (_keyboardEvents!=rhs._keyboardEvents) al_destroy_event_queue(_keyboardEvents);

    _keyboardEvents = al_create_event_queue();
    al_register_event_source(_keyboardEvents, al_get_keyboard_event_source());

    return *this;
}

KeyboardHandler::~KeyboardHandler()
{
    al_destroy_event_queue(_keyboardEvents);
}

void KeyboardHandler::updateFlags()
{
    ALLEGRO_EVENT event;
    while (al_get_next_event(_keyboardEvents, &event))
    {
        if (event.type==ALLEGRO_EVENT_KEY_DOWN)
        {
            switch (event.keyboard.keycode)
            {
                case UP_KEY:
                    _up = true;
                    break;
                case DOWN_KEY:
                    _down = true;
                    break;
                case LEFT_KEY:
                    _left = true;
                    break;
                case RIGHT_KEY:
                    _right = true;
                    break;
                case SMOKESCREEN_KEY:
                    _smokescreen = true;
                    break;
            }
        }
        else if (event.type==ALLEGRO_EVENT_KEY_UP)
        {
            switch (event.keyboard.keycode)
            {
                case UP_KEY:
                    _up = false;
                    break;
                case DOWN_KEY:
                    _down = false;
                    break;
                case LEFT_KEY:
                    _left = false;
                    break;
                case RIGHT_KEY:
                    _right = false;
                    break;
                case SMOKESCREEN_KEY:
                    _smokescreen = false;
                    break;
            }
        }
    }
}

Maze::Direction KeyboardHandler::getFacing()
{
    updateFlags();

    if (_up) _previousFacing = Maze::UP;
    else if (_down) _previousFacing = Maze::DOWN;
    else if (_left) _previousFacing = Maze::LEFT;
    else if (_right) _previousFacing = Maze::RIGHT;

    return _previousFacing;
}

bool KeyboardHandler::getSmokescreen()
{
    return _smokescreen;
}