feat: PlayerInput now supports mouse motion through _mouse_* actions
parent
2246409a79
commit
d5ee438080
|
@ -2,6 +2,7 @@
|
||||||
#include "godot_macros.h"
|
#include "godot_macros.h"
|
||||||
#include "godot_cpp/classes/input.hpp"
|
#include "godot_cpp/classes/input.hpp"
|
||||||
#include "godot_cpp/classes/input_event.hpp"
|
#include "godot_cpp/classes/input_event.hpp"
|
||||||
|
#include "godot_cpp/classes/input_event_mouse_motion.hpp"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
namespace godot {
|
namespace godot {
|
||||||
|
@ -11,15 +12,40 @@ PlayerInput::Listener::Listener(String positive, String negative, Node *object,
|
||||||
: actionNegative{negative}
|
: actionNegative{negative}
|
||||||
, actionPositive{positive}
|
, actionPositive{positive}
|
||||||
, methodName{method}
|
, methodName{method}
|
||||||
, object{object} {}
|
, object{object}
|
||||||
|
, isMouseEvent{positive.begins_with("_mouse_") || negative.begins_with("_mouse_")} {}
|
||||||
|
|
||||||
|
float PlayerInput::Listener::evaluate_event(Ref<InputEvent> const &event, String const &action) {
|
||||||
|
Input *input = Input::get_singleton();
|
||||||
|
if(!action.begins_with("_mouse_")) {
|
||||||
|
return float(input->is_action_pressed(action));
|
||||||
|
} else {
|
||||||
|
InputEventMouseMotion *motion = Object::cast_to<InputEventMouseMotion>(*event);
|
||||||
|
if(motion == nullptr)
|
||||||
|
return 0.f;
|
||||||
|
if(action.ends_with("_up") || action.ends_with("_right")) {
|
||||||
|
return motion->get_relative().x;
|
||||||
|
} if(action.ends_with("_right") || action.ends_with("_left")) {
|
||||||
|
return motion->get_relative().y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0.f;
|
||||||
|
}
|
||||||
|
|
||||||
bool PlayerInput::Listener::has_changed(Ref<InputEvent> const &event) {
|
bool PlayerInput::Listener::has_changed(Ref<InputEvent> const &event) {
|
||||||
return event->is_action(this->actionNegative) || event->is_action(this->actionPositive);
|
return (
|
||||||
|
(!event->is_class("InputEventMouseMotion") ||
|
||||||
|
this->isMouseEvent
|
||||||
|
) ||
|
||||||
|
event->is_action(this->actionNegative) ||
|
||||||
|
event->is_action(this->actionPositive)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
float PlayerInput::Listener::evaluate(Ref<InputEvent> const &event) {
|
float PlayerInput::Listener::evaluate(Ref<InputEvent> const &event) {
|
||||||
Input *input = Input::get_singleton();
|
float positive = PlayerInput::Listener::evaluate_event(event, this->actionPositive);
|
||||||
float newest = static_cast<float>(input->is_action_pressed(this->actionPositive))
|
float negative = PlayerInput::Listener::evaluate_event(event, this->actionNegative);
|
||||||
- static_cast<float>(input->is_action_pressed(this->actionNegative));
|
float newest = positive - negative;
|
||||||
if(lastCached != newest)
|
if(lastCached != newest)
|
||||||
this->object->call(this->methodName, event, newest);
|
this->object->call(this->methodName, event, newest);
|
||||||
return (lastCached = newest);
|
return (lastCached = newest);
|
||||||
|
|
|
@ -12,13 +12,18 @@ class PlayerInput : public Node {
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
public:
|
public:
|
||||||
struct Listener {
|
struct Listener {
|
||||||
|
friend class PlayerInput;
|
||||||
|
private:
|
||||||
String actionNegative{""};
|
String actionNegative{""};
|
||||||
String actionPositive{""};
|
String actionPositive{""};
|
||||||
float lastCached{0.f};
|
float lastCached{0.f};
|
||||||
String methodName{""};
|
String methodName{""};
|
||||||
Node *object;
|
Node *object{nullptr};
|
||||||
|
bool isMouseEvent{false};
|
||||||
|
|
||||||
|
public:
|
||||||
Listener(String positive, String negative, Node *object, String method);
|
Listener(String positive, String negative, Node *object, String method);
|
||||||
|
static float evaluate_event(Ref<InputEvent> const &event, String const &action);
|
||||||
bool has_changed(Ref<InputEvent> const &event);
|
bool has_changed(Ref<InputEvent> const &event);
|
||||||
float evaluate(Ref<InputEvent> const &event);
|
float evaluate(Ref<InputEvent> const &event);
|
||||||
bool operator==(godot::PlayerInput::Listener const& b);
|
bool operator==(godot::PlayerInput::Listener const& b);
|
||||||
|
|
Loading…
Reference in New Issue