mirror of
https://github.com/jpd002/Play-.git
synced 2025-04-28 13:47:57 +03:00
Add basic input support.
This commit is contained in:
parent
4b3a64e193
commit
1216f3a1a4
5 changed files with 128 additions and 2 deletions
|
@ -25,9 +25,11 @@ endif()
|
|||
list(APPEND PROJECT_LIBS gsh_opengl)
|
||||
|
||||
add_executable(Play
|
||||
Main.cpp
|
||||
GSH_OpenGLJs.cpp
|
||||
GSH_OpenGLJs.h
|
||||
InputProviderEmscripten.cpp
|
||||
InputProviderEmscripten.h
|
||||
Main.cpp
|
||||
Ps2VmJs.cpp
|
||||
Ps2VmJs.h
|
||||
)
|
||||
|
|
59
Source/ui_js/InputProviderEmscripten.cpp
Normal file
59
Source/ui_js/InputProviderEmscripten.cpp
Normal file
|
@ -0,0 +1,59 @@
|
|||
#include "InputProviderEmscripten.h"
|
||||
#include "string_format.h"
|
||||
|
||||
#define PROVIDER_ID 'EmSc'
|
||||
|
||||
enum
|
||||
{
|
||||
INPUT_ARROW_UP = 0xFF80,
|
||||
INPUT_ARROW_DOWN,
|
||||
INPUT_ARROW_LEFT,
|
||||
INPUT_ARROW_RIGHT,
|
||||
INPUT_ENTER,
|
||||
INPUT_BACKSPACE,
|
||||
INPUT_SHIFT_RIGHT,
|
||||
INPUT_KEY_A,
|
||||
INPUT_KEY_S,
|
||||
INPUT_KEY_Z,
|
||||
INPUT_KEY_X,
|
||||
};
|
||||
|
||||
uint32 CInputProviderEmscripten::GetId() const
|
||||
{
|
||||
return PROVIDER_ID;
|
||||
}
|
||||
|
||||
std::string CInputProviderEmscripten::GetTargetDescription(const BINDINGTARGET& target) const
|
||||
{
|
||||
return std::string();
|
||||
}
|
||||
|
||||
BINDINGTARGET CInputProviderEmscripten::MakeBindingTarget(const EM_UTF8* code)
|
||||
{
|
||||
uint32 keyCode = 0;
|
||||
if(!strcmp(code, "ArrowUp")) keyCode = INPUT_ARROW_UP;
|
||||
else if(!strcmp(code, "ArrowDown")) keyCode = INPUT_ARROW_DOWN;
|
||||
else if(!strcmp(code, "ArrowLeft")) keyCode = INPUT_ARROW_LEFT;
|
||||
else if(!strcmp(code, "ArrowRight")) keyCode = INPUT_ARROW_RIGHT;
|
||||
else if(!strcmp(code, "Enter")) keyCode = INPUT_ENTER;
|
||||
else if(!strcmp(code, "ShiftRight")) keyCode = INPUT_SHIFT_RIGHT;
|
||||
else if(!strcmp(code, "Backspace")) keyCode = INPUT_BACKSPACE;
|
||||
else if(!strcmp(code, "KeyA")) keyCode = INPUT_KEY_A;
|
||||
else if(!strcmp(code, "KeyS")) keyCode = INPUT_KEY_S;
|
||||
else if(!strcmp(code, "KeyZ")) keyCode = INPUT_KEY_Z;
|
||||
else if(!strcmp(code, "KeyX")) keyCode = INPUT_KEY_X;
|
||||
else keyCode = code[0];
|
||||
return BINDINGTARGET(PROVIDER_ID, DeviceIdType{{0}}, keyCode, BINDINGTARGET::KEYTYPE::BUTTON);
|
||||
}
|
||||
|
||||
void CInputProviderEmscripten::OnKeyDown(const EM_UTF8* code)
|
||||
{
|
||||
if(!OnInput) return;
|
||||
OnInput(MakeBindingTarget(code), 1);
|
||||
}
|
||||
|
||||
void CInputProviderEmscripten::OnKeyUp(const EM_UTF8* code)
|
||||
{
|
||||
if(!OnInput) return;
|
||||
OnInput(MakeBindingTarget(code), 0);
|
||||
}
|
16
Source/ui_js/InputProviderEmscripten.h
Normal file
16
Source/ui_js/InputProviderEmscripten.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
#pragma once
|
||||
|
||||
#include "input/InputProvider.h"
|
||||
#include <emscripten/html5.h>
|
||||
|
||||
class CInputProviderEmscripten : public CInputProvider
|
||||
{
|
||||
public:
|
||||
uint32 GetId() const override;
|
||||
std::string GetTargetDescription(const BINDINGTARGET&) const override;
|
||||
|
||||
static BINDINGTARGET MakeBindingTarget(const EM_UTF8* code);
|
||||
|
||||
void OnKeyDown(const EM_UTF8*);
|
||||
void OnKeyUp(const EM_UTF8*);
|
||||
};
|
|
@ -4,15 +4,36 @@
|
|||
#include "GSH_OpenGLJs.h"
|
||||
#include "PS2VM_Preferences.h"
|
||||
#include "AppConfig.h"
|
||||
#include "input/PH_GenericInput.h"
|
||||
#include "InputProviderEmscripten.h"
|
||||
|
||||
CPs2VmJs* g_virtualMachine = nullptr;
|
||||
EMSCRIPTEN_WEBGL_CONTEXT_HANDLE g_context = 0;
|
||||
std::shared_ptr<CInputProviderEmscripten> g_inputProvider;
|
||||
|
||||
int main(int argc, const char** argv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
EM_BOOL keyboardCallback(int eventType, const EmscriptenKeyboardEvent* keyEvent, void* userData)
|
||||
{
|
||||
if(keyEvent->repeat)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
switch(eventType)
|
||||
{
|
||||
case EMSCRIPTEN_EVENT_KEYDOWN:
|
||||
g_inputProvider->OnKeyDown(keyEvent->code);
|
||||
break;
|
||||
case EMSCRIPTEN_EVENT_KEYUP:
|
||||
g_inputProvider->OnKeyUp(keyEvent->code);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
extern "C" void initVm()
|
||||
{
|
||||
EmscriptenWebGLContextAttributes attr;
|
||||
|
@ -27,6 +48,34 @@ extern "C" void initVm()
|
|||
g_virtualMachine->Initialize();
|
||||
g_virtualMachine->CreateGSHandler(CGSH_OpenGLJs::GetFactoryFunction(g_context));
|
||||
|
||||
{
|
||||
g_virtualMachine->CreatePadHandler(CPH_GenericInput::GetFactoryFunction());
|
||||
auto padHandler = static_cast<CPH_GenericInput*>(g_virtualMachine->GetPadHandler());
|
||||
auto& bindingManager = padHandler->GetBindingManager();
|
||||
|
||||
g_inputProvider = std::make_shared<CInputProviderEmscripten>();
|
||||
bindingManager.RegisterInputProvider(g_inputProvider);
|
||||
|
||||
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::START, CInputProviderEmscripten::MakeBindingTarget("Enter"));
|
||||
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::SELECT, CInputProviderEmscripten::MakeBindingTarget("Backspace"));
|
||||
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::DPAD_LEFT, CInputProviderEmscripten::MakeBindingTarget("ArrowLeft"));
|
||||
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::DPAD_RIGHT, CInputProviderEmscripten::MakeBindingTarget("ArrowRight"));
|
||||
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::DPAD_UP, CInputProviderEmscripten::MakeBindingTarget("ArrowUp"));
|
||||
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::DPAD_DOWN, CInputProviderEmscripten::MakeBindingTarget("ArrowDown"));
|
||||
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::SQUARE, CInputProviderEmscripten::MakeBindingTarget("KeyA"));
|
||||
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::CROSS, CInputProviderEmscripten::MakeBindingTarget("KeyZ"));
|
||||
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::TRIANGLE, CInputProviderEmscripten::MakeBindingTarget("KeyS"));
|
||||
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::CIRCLE, CInputProviderEmscripten::MakeBindingTarget("KeyX"));
|
||||
}
|
||||
|
||||
EMSCRIPTEN_RESULT result = EMSCRIPTEN_RESULT_SUCCESS;
|
||||
|
||||
result = emscripten_set_keydown_callback("#outputCanvas", nullptr, false, &keyboardCallback);
|
||||
assert(result == EMSCRIPTEN_RESULT_SUCCESS);
|
||||
|
||||
result = emscripten_set_keyup_callback("#outputCanvas", nullptr, false, &keyboardCallback);
|
||||
assert(result == EMSCRIPTEN_RESULT_SUCCESS);
|
||||
|
||||
//g_virtualMachine->Reset();
|
||||
printf("Reset VM\r\n");
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div>
|
||||
<canvas id="outputCanvas" width="640" height="480"/>
|
||||
<canvas id="outputCanvas" width="640" height="480" tabindex="-1"/>
|
||||
</div>
|
||||
<div id="root"></div>
|
||||
<!--
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue