Add Input::scrollV() to query vertical mouse wheel scroll events

This commit is contained in:
Amaryllis Kulla 2021-11-02 05:23:25 +01:00
parent e2bbcde85d
commit e32aa71f4b
5 changed files with 31 additions and 0 deletions

View File

@ -115,6 +115,13 @@ RB_METHOD(inputMouseY)
return rb_fix_new(shState->input().mouseY()); return rb_fix_new(shState->input().mouseY());
} }
RB_METHOD(inputScrollV)
{
RB_UNUSED_PARAM;
return rb_fix_new(shState->input().scrollV());
}
struct struct
{ {
@ -168,6 +175,7 @@ inputBindingInit()
_rb_define_module_function(module, "mouse_x", inputMouseX); _rb_define_module_function(module, "mouse_x", inputMouseX);
_rb_define_module_function(module, "mouse_y", inputMouseY); _rb_define_module_function(module, "mouse_y", inputMouseY);
_rb_define_module_function(module, "scroll_v", inputScrollV);
if (rgssVer >= 3) if (rgssVer >= 3)
{ {

View File

@ -73,6 +73,7 @@ uint8_t EventThread::keyStates[];
EventThread::JoyState EventThread::joyState; EventThread::JoyState EventThread::joyState;
EventThread::MouseState EventThread::mouseState; EventThread::MouseState EventThread::mouseState;
EventThread::TouchState EventThread::touchState; EventThread::TouchState EventThread::touchState;
SDL_atomic_t EventThread::verticalScrollDistance;
/* User event codes */ /* User event codes */
enum enum
@ -380,6 +381,11 @@ void EventThread::process(RGSSThreadData &rtData)
updateCursorState(cursorInWindow, gameScreen); updateCursorState(cursorInWindow, gameScreen);
break; break;
case SDL_MOUSEWHEEL :
/* Only consider vertical scrolling for now */
SDL_AtomicAdd(&verticalScrollDistance, event.wheel.y);
break;
case SDL_FINGERDOWN : case SDL_FINGERDOWN :
i = event.tfinger.fingerId; i = event.tfinger.fingerId;
touchState.fingers[i].down = true; touchState.fingers[i].down = true;

View File

@ -31,6 +31,7 @@
#include <SDL_joystick.h> #include <SDL_joystick.h>
#include <SDL_mouse.h> #include <SDL_mouse.h>
#include <SDL_mutex.h> #include <SDL_mutex.h>
#include <SDL_atomic.h>
#include <string> #include <string>
@ -76,6 +77,7 @@ public:
static JoyState joyState; static JoyState joyState;
static MouseState mouseState; static MouseState mouseState;
static TouchState touchState; static TouchState touchState;
static SDL_atomic_t verticalScrollDistance;
static bool allocUserEvents(); static bool allocUserEvents();

View File

@ -28,6 +28,7 @@
#include <SDL_scancode.h> #include <SDL_scancode.h>
#include <SDL_mouse.h> #include <SDL_mouse.h>
#include <SDL_atomic.h>
#include <vector> #include <vector>
#include <string.h> #include <string.h>
@ -287,6 +288,9 @@ struct InputPrivate
Input::ButtonCode repeating; Input::ButtonCode repeating;
unsigned int repeatCount; unsigned int repeatCount;
/* Cumulative vertical scroll distance since last update call */
int vScrollDistance;
struct struct
{ {
int active; int active;
@ -322,6 +326,8 @@ struct InputPrivate
dir4Data.previous = Input::None; dir4Data.previous = Input::None;
dir8Data.active = 0; dir8Data.active = 0;
vScrollDistance = 0;
} }
inline ButtonState &getStateCheck(int code) inline ButtonState &getStateCheck(int code)
@ -640,6 +646,9 @@ void Input::update()
} }
p->repeating = None; p->repeating = None;
/* Fetch new cumulative scroll distance and reset counter */
p->vScrollDistance = SDL_AtomicSet(&EventThread::verticalScrollDistance, 0);
} }
bool Input::isPressed(int button) bool Input::isPressed(int button)
@ -681,6 +690,11 @@ int Input::mouseY()
return (EventThread::mouseState.y - rtData.screenOffset.y) * rtData.sizeResoRatio.y; return (EventThread::mouseState.y - rtData.screenOffset.y) * rtData.sizeResoRatio.y;
} }
int Input::scrollV()
{
return p->vScrollDistance;
}
Input::~Input() Input::~Input()
{ {
delete p; delete p;

View File

@ -58,6 +58,7 @@ public:
/* Non-standard extensions */ /* Non-standard extensions */
int mouseX(); int mouseX();
int mouseY(); int mouseY();
int scrollV();
private: private:
Input(const RGSSThreadData &rtData); Input(const RGSSThreadData &rtData);