MRI: Add 'System.raw_key_states' to query full keyboard state

Returns a byte array with all key states (0 = released,
1 = pressed) indexed via SDL_SCANCODE_* enums.
This commit is contained in:
Jonas Kulla 2014-10-20 10:27:01 +02:00
parent e44a1e32fa
commit 4a8b0f30c8
3 changed files with 29 additions and 17 deletions

View File

@ -76,8 +76,9 @@ void fileIntBindingInit();
RB_METHOD(mriPrint); RB_METHOD(mriPrint);
RB_METHOD(mriP); RB_METHOD(mriP);
RB_METHOD(mriDataDirectory); RB_METHOD(mkxpDataDirectory);
RB_METHOD(mkxpPuts); RB_METHOD(mkxpPuts);
RB_METHOD(mkxpRawKeyStates);
RB_METHOD(mriRgssMain); RB_METHOD(mriRgssMain);
RB_METHOD(mriRgssStop); RB_METHOD(mriRgssStop);
@ -139,8 +140,9 @@ static void mriBindingInit()
assert(!"unreachable"); assert(!"unreachable");
VALUE mod = rb_define_module("System"); VALUE mod = rb_define_module("System");
_rb_define_module_function(mod, "data_directory", mriDataDirectory); _rb_define_module_function(mod, "data_directory", mkxpDataDirectory);
_rb_define_module_function(mod, "puts", mkxpPuts); _rb_define_module_function(mod, "puts", mkxpPuts);
_rb_define_module_function(mod, "raw_key_states", mkxpRawKeyStates);
rb_gv_set("MKXP", Qtrue); rb_gv_set("MKXP", Qtrue);
} }
@ -151,18 +153,6 @@ showMsg(const std::string &msg)
shState->eThread().showMessageBox(msg.c_str()); shState->eThread().showMessageBox(msg.c_str());
} }
RB_METHOD(mkxpPuts)
{
RB_UNUSED_PARAM;
const char *str;
rb_get_args(argc, argv, "z", &str RB_ARG_END);
Debug() << str;
return Qnil;
}
static void printP(int argc, VALUE *argv, static void printP(int argc, VALUE *argv,
const char *convMethod, const char *sep) const char *convMethod, const char *sep)
{ {
@ -199,7 +189,7 @@ RB_METHOD(mriP)
return Qnil; return Qnil;
} }
RB_METHOD(mriDataDirectory) RB_METHOD(mkxpDataDirectory)
{ {
RB_UNUSED_PARAM; RB_UNUSED_PARAM;
@ -216,6 +206,28 @@ RB_METHOD(mriDataDirectory)
return pathStr; return pathStr;
} }
RB_METHOD(mkxpPuts)
{
RB_UNUSED_PARAM;
const char *str;
rb_get_args(argc, argv, "z", &str RB_ARG_END);
Debug() << str;
return Qnil;
}
RB_METHOD(mkxpRawKeyStates)
{
RB_UNUSED_PARAM;
VALUE str = rb_str_new(0, sizeof(EventThread::keyStates));
memcpy(RSTRING_PTR(str), EventThread::keyStates, sizeof(EventThread::keyStates));
return str;
}
static VALUE rgssMainCb(VALUE block) static VALUE rgssMainCb(VALUE block)
{ {
rb_funcall2(block, rb_intern("call"), 0, 0); rb_funcall2(block, rb_intern("call"), 0, 0);

View File

@ -34,7 +34,7 @@
#include <string.h> #include <string.h>
bool EventThread::keyStates[] = { false }; uint8_t EventThread::keyStates[] = { false };
EventThread::JoyState EventThread::joyState = EventThread::JoyState EventThread::joyState =
{ {

View File

@ -42,7 +42,7 @@ struct SDL_Window;
class EventThread class EventThread
{ {
public: public:
static bool keyStates[SDL_NUM_SCANCODES]; static uint8_t keyStates[SDL_NUM_SCANCODES];
struct JoyState struct JoyState
{ {