keyup sends cancel to command subscribers
This commit is contained in:
parent
daa7945c89
commit
c71635e5d6
|
@ -129,8 +129,8 @@ struct Demo : Game
|
||||||
Mix_PlayMusic(music, -1);
|
Mix_PlayMusic(music, -1);
|
||||||
load_gl_context();
|
load_gl_context();
|
||||||
delegate.subscribe(&Demo::respond, this);
|
delegate.subscribe(&Demo::respond, this);
|
||||||
Input* l = new Input(this);
|
// Input* l = new Input(this);
|
||||||
delete l;
|
// delete l;
|
||||||
// input.print_branch();
|
// input.print_branch();
|
||||||
// mushroom.print_branch();
|
// mushroom.print_branch();
|
||||||
// Input* i = new Input(this);
|
// Input* i = new Input(this);
|
||||||
|
@ -424,22 +424,22 @@ struct Demo : Game
|
||||||
roundedBoxColor(renderer, 300, 200, 500, 300, 10, 0x8f8fdfff);
|
roundedBoxColor(renderer, 300, 200, 500, 300, 10, 0x8f8fdfff);
|
||||||
aacircleColor(renderer, 300, 200, 30, 0xffef3fff);
|
aacircleColor(renderer, 300, 200, 30, 0xffef3fff);
|
||||||
int speed = 2;
|
int speed = 2;
|
||||||
if (up_active)
|
// if (up_active)
|
||||||
{
|
// {
|
||||||
// grass.move(0, -speed);
|
// grass.move(0, -speed);
|
||||||
}
|
// }
|
||||||
if (right_active)
|
// if (right_active)
|
||||||
{
|
// {
|
||||||
// grass.move(speed);
|
// grass.move(speed);
|
||||||
}
|
// }
|
||||||
if (down_active)
|
// if (down_active)
|
||||||
{
|
// {
|
||||||
// grass.move(0, speed);
|
// grass.move(0, speed);
|
||||||
}
|
// }
|
||||||
if (left_active)
|
// if (left_active)
|
||||||
{
|
// {
|
||||||
// grass.move(-speed, 0);
|
// grass.move(-speed, 0);
|
||||||
}
|
// }
|
||||||
// grass.update();
|
// grass.update();
|
||||||
// mushroom.update();
|
// mushroom.update();
|
||||||
SDL_RenderPresent(renderer);
|
SDL_RenderPresent(renderer);
|
||||||
|
|
|
@ -6,7 +6,7 @@ GLEW_DIR = $(SFW_LIB_DIR)glew/
|
||||||
CC_LINUX = clang-7
|
CC_LINUX = clang-7
|
||||||
CPPC_LINUX = clang++-7
|
CPPC_LINUX = clang++-7
|
||||||
SDLCONFIG = /home/frank/local/sdl/bin/sdl2-config
|
SDLCONFIG = /home/frank/local/sdl/bin/sdl2-config
|
||||||
CFLAGS = -Wall -O2 -c -I$(SFW_LIB_DIR) -I$(SFW_SRC_DIR)
|
CFLAGS = -Wall -O0 -c -I$(SFW_LIB_DIR) -I$(SFW_SRC_DIR) -g
|
||||||
CPP_FLAGS = $(CFLAGS) --std=c++17
|
CPP_FLAGS = $(CFLAGS) --std=c++17
|
||||||
SDL_FLAGS = $(shell $(SDLCONFIG) --cflags)
|
SDL_FLAGS = $(shell $(SDLCONFIG) --cflags)
|
||||||
LFLAGS = $(shell $(SDLCONFIG) --libs) -lpthread
|
LFLAGS = $(shell $(SDLCONFIG) --libs) -lpthread
|
||||||
|
|
|
@ -28,11 +28,26 @@ void Delegate::dispatch()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (event.type == command_event_type)
|
||||||
|
{
|
||||||
|
delete static_cast<bool*>(event.user.data2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Delegate::compare(SDL_Event& event, std::string command)
|
bool Delegate::compare(SDL_Event& event, std::string command, bool neutral, bool cancel)
|
||||||
{
|
{
|
||||||
return event.type == command_event_type and
|
return event.type == command_event_type and
|
||||||
*static_cast<std::string*>(event.user.data1) == command;
|
(command == "" or command == *static_cast<std::string*>(event.user.data1)) and
|
||||||
|
(neutral or (cancel == *static_cast<bool*>(event.user.data2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Delegate::compare_cancel(SDL_Event& event, std::string command)
|
||||||
|
{
|
||||||
|
return compare(event, command, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Delegate::compare_neutral(SDL_Event& event, std::string command)
|
||||||
|
{
|
||||||
|
return compare(event, command, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,9 @@ struct Delegate : Node
|
||||||
Delegate(Node*);
|
Delegate(Node*);
|
||||||
void add_subscriber(Subscriber, int);
|
void add_subscriber(Subscriber, int);
|
||||||
void dispatch();
|
void dispatch();
|
||||||
bool compare(SDL_Event&, std::string);
|
bool compare(SDL_Event&, std::string = "", bool = false, bool = false);
|
||||||
|
bool compare_cancel(SDL_Event&, std::string = "");
|
||||||
|
bool compare_neutral(SDL_Event&, std::string = "");
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void subscribe(void(T::*f)(SDL_Event&), T* o, int type = command_event_type)
|
void subscribe(void(T::*f)(SDL_Event&), T* o, int type = command_event_type)
|
||||||
|
|
|
@ -4,6 +4,7 @@ Input::Input(Node *parent) : Node(parent)
|
||||||
{
|
{
|
||||||
load_key_map();
|
load_key_map();
|
||||||
get_delegate().subscribe(&Input::respond, this, SDL_KEYDOWN);
|
get_delegate().subscribe(&Input::respond, this, SDL_KEYDOWN);
|
||||||
|
get_delegate().subscribe(&Input::respond, this, SDL_KEYUP);
|
||||||
for (KeyCombination& combination : key_map)
|
for (KeyCombination& combination : key_map)
|
||||||
{
|
{
|
||||||
print_key_combination(combination);
|
print_key_combination(combination);
|
||||||
|
@ -74,21 +75,23 @@ void Input::add_to_key_map(
|
||||||
|
|
||||||
void Input::respond(SDL_Event &event)
|
void Input::respond(SDL_Event &event)
|
||||||
{
|
{
|
||||||
if (event.type == SDL_KEYDOWN)
|
// if (event.type == SDL_KEYDOWN)
|
||||||
{
|
// {
|
||||||
SDL_Keymod mod = SDL_GetModState();
|
SDL_Keymod mod = SDL_GetModState();
|
||||||
for (KeyCombination &combination : key_map)
|
for (KeyCombination& combination : key_map)
|
||||||
{
|
{
|
||||||
if (event.key.keysym.sym == combination.key and
|
if (event.key.keysym.sym == combination.key and
|
||||||
(not combination.ctrl || mod & KMOD_CTRL) and
|
(not combination.ctrl || mod & KMOD_CTRL) and
|
||||||
(not combination.shift || mod & KMOD_SHIFT) and
|
(not combination.shift || mod & KMOD_SHIFT) and
|
||||||
(not combination.alt || mod & KMOD_ALT))
|
(not combination.alt || mod & KMOD_ALT))
|
||||||
{
|
{
|
||||||
SDL_Event event;
|
SDL_Event relay;
|
||||||
event.type = Delegate::command_event_type;
|
bool* cancel = new bool(event.type == SDL_KEYDOWN ? false : true);
|
||||||
event.user.data1 = &combination.command;
|
relay.type = Delegate::command_event_type;
|
||||||
SDL_PushEvent(&event);
|
relay.user.data1 = &combination.command;
|
||||||
|
relay.user.data2 = cancel;
|
||||||
|
SDL_PushEvent(&relay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ Display& Node::get_display()
|
||||||
|
|
||||||
void Node::print_branch()
|
void Node::print_branch()
|
||||||
{
|
{
|
||||||
Node *current = this;
|
Node* current = this;
|
||||||
while (current != NULL)
|
while (current != NULL)
|
||||||
{
|
{
|
||||||
std::cout << current->get_class_name() << " @ " << current;
|
std::cout << current->get_class_name() << " @ " << current;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "Sprite.hpp"
|
#include "Sprite.hpp"
|
||||||
|
#include "Game.hpp"
|
||||||
|
|
||||||
Sprite::Sprite(Node *parent) : Node(parent) {}
|
Sprite::Sprite(Node *parent) : Node(parent) {}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue