From 741f662bb0732b89a82526d064e316c0414450c7 Mon Sep 17 00:00:00 2001 From: "wrenczes@gmail.com" Date: Wed, 15 Jun 2011 09:52:11 +0000 Subject: [PATCH] Tied in my recent Android flick gesture addition to a Scroll() function. GameState now has a virtual function OnScroll() call that, by default is a no-op; each game state can choose to override how to respond to flick gestures. I've added one such override in the Deck Editor so that a flick up/down acts like the psp button up/down for scrolling between color filters. --- JGE/include/JApp.h | 2 + JGE/include/JGE.h | 4 + JGE/src/JGE.cpp | 487 +++++++++++---------- JGE/src/SDLmain.cpp | 20 +- projects/mtg/include/GameApp.h | 2 + projects/mtg/include/GameState.h | 4 + projects/mtg/include/GameStateDeckViewer.h | 2 + projects/mtg/src/GameApp.cpp | 8 + projects/mtg/src/GameStateDeckViewer.cpp | 9 + 9 files changed, 298 insertions(+), 240 deletions(-) diff --git a/JGE/include/JApp.h b/JGE/include/JApp.h index 136ec751e..47cc08803 100644 --- a/JGE/include/JApp.h +++ b/JGE/include/JApp.h @@ -82,6 +82,8 @@ public: /// ////////////////////////////////////////////////////////////////////////// virtual void Resume() = 0; + + virtual void OnScroll(int inXVelocity, int inYVelocity) = 0; }; diff --git a/JGE/include/JGE.h b/JGE/include/JGE.h index d858fb2c3..5fbf25ca3 100644 --- a/JGE/include/JGE.h +++ b/JGE/include/JGE.h @@ -319,6 +319,10 @@ class JGE // Returns false if nothing has been clicked, true otherwise bool GetLeftClickCoordinates(int& x, int& y); + + // Scroll events - currently triggered by SDL JOYBALL events + void Scroll(int inXVelocity, int inYVelocity); + ////////////////////////////////////////////////////////////////////////// /// Get if the system is ended/paused or not. /// diff --git a/JGE/src/JGE.cpp b/JGE/src/JGE.cpp index fda3ca660..3f16856f6 100644 --- a/JGE/src/JGE.cpp +++ b/JGE/src/JGE.cpp @@ -29,17 +29,17 @@ u8 JGE::GetAnalogX() { - if (GetButtonState(JGE_BTN_LEFT)) return 0; - if (GetButtonState(JGE_BTN_RIGHT)) return 0xff; - return 0x80; + if (GetButtonState(JGE_BTN_LEFT)) return 0; + if (GetButtonState(JGE_BTN_RIGHT)) return 0xff; + return 0x80; } u8 JGE::GetAnalogY() { - if (GetButtonState(JGE_BTN_UP)) return 0; - if (GetButtonState(JGE_BTN_DOWN)) return 0xff; - return 0x80; + if (GetButtonState(JGE_BTN_UP)) return 0; + if (GetButtonState(JGE_BTN_DOWN)) return 0xff; + return 0x80; } #elif defined (LINUX) // Unix specific code @@ -49,17 +49,17 @@ u8 JGE::GetAnalogY() u8 JGE::GetAnalogX() { - if (GetButtonState(JGE_BTN_LEFT)) return 0; - if (GetButtonState(JGE_BTN_RIGHT)) return 0xff; - return 0x80; + if (GetButtonState(JGE_BTN_LEFT)) return 0; + if (GetButtonState(JGE_BTN_RIGHT)) return 0xff; + return 0x80; } u8 JGE::GetAnalogY() { - if (GetButtonState(JGE_BTN_UP)) return 0; - if (GetButtonState(JGE_BTN_DOWN)) return 0xff; - return 0x80; + if (GetButtonState(JGE_BTN_UP)) return 0; + if (GetButtonState(JGE_BTN_DOWN)) return 0xff; + return 0x80; } #endif @@ -75,240 +75,255 @@ static inline pair, bool> triplet(pair rng = keyBinds.equal_range(sym); - if (rng.first == rng.second) - keyBuffer.push(triplet(sym, JGE_BTN_NONE, false)); - else for (keycodes_it it = rng.first; it != rng.second; ++it) { + const pair rng = keyBinds.equal_range(sym); + if (rng.first == rng.second) + keyBuffer.push(triplet(sym, JGE_BTN_NONE, false)); + else for (keycodes_it it = rng.first; it != rng.second; ++it) + { #if defined (WIN32) || defined (LINUX) - if (JGE_BTN_FULLSCREEN == it->second) JGEToggleFullscreen(); + if (JGE_BTN_FULLSCREEN == it->second) JGEToggleFullscreen(); #endif - keyBuffer.push(triplet(*it, held(it->second))); + keyBuffer.push(triplet(*it, held(it->second))); } } void JGE::PressKey(const JButton sym) { #if defined (WIN32) || defined (LINUX) - if (sym == JGE_BTN_FULLSCREEN) JGEToggleFullscreen(); + if (sym == JGE_BTN_FULLSCREEN) JGEToggleFullscreen(); #endif - keyBuffer.push(triplet(LOCAL_KEY_NONE, sym, held(sym))); + keyBuffer.push(triplet(LOCAL_KEY_NONE, sym, held(sym))); } void JGE::HoldKey(const LocalKeySym sym) { - const pair rng = keyBinds.equal_range(sym); - if (rng.first == rng.second) - keyBuffer.push(triplet(sym, JGE_BTN_NONE, false)); - else for (keycodes_it it = rng.first; it != rng.second; ++it) + const pair rng = keyBinds.equal_range(sym); + if (rng.first == rng.second) + keyBuffer.push(triplet(sym, JGE_BTN_NONE, false)); + else for (keycodes_it it = rng.first; it != rng.second; ++it) { #if defined (WIN32) || defined (LINUX) - if (JGE_BTN_FULLSCREEN == it->second) JGEToggleFullscreen(); + if (JGE_BTN_FULLSCREEN == it->second) JGEToggleFullscreen(); #endif - if (!held(it->second)) + if (!held(it->second)) { - keyBuffer.push(triplet(*it, false)); - holds[it->second] = REPEAT_DELAY; + keyBuffer.push(triplet(*it, false)); + holds[it->second] = REPEAT_DELAY; } - else keyBuffer.push(triplet(*it, true)); + else keyBuffer.push(triplet(*it, true)); } } void JGE::HoldKey_NoRepeat(const LocalKeySym sym) { - const pair rng = keyBinds.equal_range(sym); - if (rng.first == rng.second) - keyBuffer.push(triplet(sym, JGE_BTN_NONE, false)); - else for (keycodes_it it = rng.first; it != rng.second; ++it) + const pair rng = keyBinds.equal_range(sym); + if (rng.first == rng.second) + keyBuffer.push(triplet(sym, JGE_BTN_NONE, false)); + else for (keycodes_it it = rng.first; it != rng.second; ++it) { #if defined (WIN32) || defined (LINUX) - if (JGE_BTN_FULLSCREEN == it->second) - { - JGEToggleFullscreen(); - return; - } + if (JGE_BTN_FULLSCREEN == it->second) + { + JGEToggleFullscreen(); + return; + } #endif - keyBuffer.push(triplet(*it, true)); - if (!held(it->second)) - holds[it->second] = std::numeric_limits::quiet_NaN(); + keyBuffer.push(triplet(*it, true)); + if (!held(it->second)) + holds[it->second] = std::numeric_limits::quiet_NaN(); } } void JGE::HoldKey(const JButton sym) { #if defined (WIN32) || defined (LINUX) - if (JGE_BTN_FULLSCREEN == sym) JGEToggleFullscreen(); + if (JGE_BTN_FULLSCREEN == sym) JGEToggleFullscreen(); #endif - if (!held(sym)) + if (!held(sym)) { - keyBuffer.push(triplet(LOCAL_KEY_NONE, sym, false)); - holds[sym] = REPEAT_DELAY; + keyBuffer.push(triplet(LOCAL_KEY_NONE, sym, false)); + holds[sym] = REPEAT_DELAY; } - else keyBuffer.push(triplet(LOCAL_KEY_NONE, sym, true)); + else keyBuffer.push(triplet(LOCAL_KEY_NONE, sym, true)); } void JGE::HoldKey_NoRepeat(const JButton sym) { #if defined (WIN32) || defined (LINUX) - if (JGE_BTN_FULLSCREEN == sym) JGEToggleFullscreen(); + if (JGE_BTN_FULLSCREEN == sym) JGEToggleFullscreen(); #endif - keyBuffer.push(triplet(LOCAL_KEY_NONE, sym, true)); - if (!held(sym)) - holds[sym] = std::numeric_limits::quiet_NaN(); + keyBuffer.push(triplet(LOCAL_KEY_NONE, sym, true)); + if (!held(sym)) + holds[sym] = std::numeric_limits::quiet_NaN(); } void JGE::ReleaseKey(const LocalKeySym sym) { - set s; - const pair rng = keyBinds.equal_range(sym); - for (keycodes_it it = rng.first; it != rng.second; ++it) + set s; + const pair rng = keyBinds.equal_range(sym); + for (keycodes_it it = rng.first; it != rng.second; ++it) { - s.insert(it->second); - holds.erase(it->second); + s.insert(it->second); + holds.erase(it->second); } - queue< pair, bool> > r; - while (!keyBuffer.empty()) + queue< pair, bool> > r; + while (!keyBuffer.empty()) { - pair, bool> q = keyBuffer.front(); - keyBuffer.pop(); - if ((!q.second) || (s.end() == s.find(q.first.second))) r.push(q); + pair, bool> q = keyBuffer.front(); + keyBuffer.pop(); + if ((!q.second) || (s.end() == s.find(q.first.second))) r.push(q); } - keyBuffer = r; + keyBuffer = r; } void JGE::ReleaseKey(const JButton sym) { - holds.erase(sym); - queue< pair, bool> > r; - while (!keyBuffer.empty()) + holds.erase(sym); + queue< pair, bool> > r; + while (!keyBuffer.empty()) { - pair, bool> q = keyBuffer.front(); - keyBuffer.pop(); - if ((!q.second) || (q.first.second != sym)) r.push(q); + pair, bool> q = keyBuffer.front(); + keyBuffer.pop(); + if ((!q.second) || (q.first.second != sym)) r.push(q); } - keyBuffer = r; + keyBuffer = r; } void JGE::Update(float dt) { - for (map::iterator it = holds.begin(); it != holds.end(); ++it) + for (map::iterator it = holds.begin(); it != holds.end(); ++it) { - if (it->second < 0) { keyBuffer.push(triplet(LOCAL_KEY_NONE, it->first, true)); it->second = REPEAT_PERIOD; } - it->second -= dt; + if (it->second < 0) + { + keyBuffer.push(triplet(LOCAL_KEY_NONE, it->first, true)); + it->second = REPEAT_PERIOD; + } + it->second -= dt; } - if (mApp != NULL) mApp->Update(); - oldHolds = holds; + + if (mApp != NULL) + mApp->Update(); + + oldHolds = holds; } bool JGE::GetButtonState(JButton button) { - return (holds.end() != holds.find(button)); + return (holds.end() != holds.find(button)); } bool JGE::GetButtonClick(JButton button) { - return ((holds.end() != holds.find(button)) && (oldHolds.end() == oldHolds.find(button))); + return ((holds.end() != holds.find(button)) && (oldHolds.end() == oldHolds.find(button))); } JButton JGE::ReadButton() { - if (keyBuffer.empty()) return JGE_BTN_NONE; - JButton val = keyBuffer.front().first.second; - keyBuffer.pop(); - return val; + if (keyBuffer.empty()) return JGE_BTN_NONE; + JButton val = keyBuffer.front().first.second; + keyBuffer.pop(); + return val; } LocalKeySym JGE::ReadLocalKey() { - if (keyBuffer.empty()) return LOCAL_KEY_NONE; - LocalKeySym val = keyBuffer.front().first.first; - keyBuffer.pop(); - return val; + if (keyBuffer.empty()) return LOCAL_KEY_NONE; + LocalKeySym val = keyBuffer.front().first.first; + keyBuffer.pop(); + return val; } u32 JGE::BindKey(LocalKeySym sym, JButton button) { - keyBinds.insert(make_pair(sym, button)); - return keyBinds.size(); + keyBinds.insert(make_pair(sym, button)); + return keyBinds.size(); } u32 JGE::UnbindKey(LocalKeySym sym, JButton button) { - for (keycodes_it it = keyBinds.begin(); it != keyBinds.end(); ) - if (sym == it->first && button == it->second) - { - keycodes_it er = it; - ++it; - keyBinds.erase(er); - } - else ++it; - return keyBinds.size(); + for (keycodes_it it = keyBinds.begin(); it != keyBinds.end(); ) + if (sym == it->first && button == it->second) + { + keycodes_it er = it; + ++it; + keyBinds.erase(er); + } + else ++it; + return keyBinds.size(); } u32 JGE::UnbindKey(LocalKeySym sym) { - pair rng = keyBinds.equal_range(sym); - keyBinds.erase(rng.first, rng.second); - return keyBinds.size(); + pair rng = keyBinds.equal_range(sym); + keyBinds.erase(rng.first, rng.second); + return keyBinds.size(); } void JGE::ClearBindings() { - keyBinds.clear(); + keyBinds.clear(); } void JGE::ResetBindings() { - keyBinds.clear(); - JGECreateDefaultBindings(); + keyBinds.clear(); + JGECreateDefaultBindings(); } -JGE::keybindings_it JGE::KeyBindings_begin() { return keyBinds.begin(); } -JGE::keybindings_it JGE::KeyBindings_end() { return keyBinds.end(); } +JGE::keybindings_it JGE::KeyBindings_begin() +{ + return keyBinds.begin(); +} + +JGE::keybindings_it JGE::KeyBindings_end() +{ + return keyBinds.end(); +} void JGE::ResetInput() { - while (!keyBuffer.empty()) keyBuffer.pop(); - holds.clear(); - LeftClickedProcessed(); + while (!keyBuffer.empty()) keyBuffer.pop(); + holds.clear(); + LeftClickedProcessed(); } void JGE::LeftClicked(int x, int y) { - mLastLeftClickX = x; - mlastLeftClickY = y; + mLastLeftClickX = x; + mlastLeftClickY = y; } void JGE::LeftClickedProcessed() { - mLastLeftClickX = -1; - mlastLeftClickY = -1; + mLastLeftClickX = -1; + mlastLeftClickY = -1; } bool JGE::GetLeftClickCoordinates(int& x, int& y) { - if(mLastLeftClickX != -1 || mlastLeftClickY != -1) - { - x = mLastLeftClickX; - y = mlastLeftClickY; - return true; - } - return false; + if(mLastLeftClickX != -1 || mlastLeftClickY != -1) + { + x = mLastLeftClickX; + y = mlastLeftClickY; + return true; + } + return false; } JGE::JGE() { - mApp = NULL; + mApp = NULL; #if defined (WIN32) || defined (LINUX) - strcpy(mDebuggingMsg, ""); - mCurrentMusic = NULL; + strcpy(mDebuggingMsg, ""); + mCurrentMusic = NULL; #endif - Init(); + Init(); } JGE::~JGE() { - JRenderer::Destroy(); - JFileSystem::Destroy(); - JSoundSystem::Destroy(); + JRenderer::Destroy(); + JFileSystem::Destroy(); + JSoundSystem::Destroy(); } @@ -319,102 +334,102 @@ JGE::~JGE() void JGE::Init() { #ifdef DEBUG_PRINT - mDebug = true; + mDebug = true; #else - mDebug = false; + mDebug = false; #endif - if (mDebug) - pspDebugScreenInit(); // do this so that we can use pspDebugScreenPrintf + if (mDebug) + pspDebugScreenInit(); // do this so that we can use pspDebugScreenPrintf - strcpy(mDebuggingMsg, ""); + strcpy(mDebuggingMsg, ""); - sceCtrlSetSamplingCycle(0); - sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); + sceCtrlSetSamplingCycle(0); + sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); - JRenderer::GetInstance(); - JFileSystem::GetInstance(); - //JSoundSystem::GetInstance(); let's do lazy loading + JRenderer::GetInstance(); + JFileSystem::GetInstance(); + //JSoundSystem::GetInstance(); let's do lazy loading - mDone = false; - mPaused = false; - mCriticalAssert = false; + mDone = false; + mPaused = false; + mCriticalAssert = false; } u8 JGE::GetAnalogX() { - return JGEGetAnalogX(); + return JGEGetAnalogX(); } u8 JGE::GetAnalogY() { - return JGEGetAnalogY(); + return JGEGetAnalogY(); } static SceCtrlData gCtrlPad; void JGE::Run() { - static const int keyCodeList[] = { - PSP_CTRL_SELECT, // Select button. - PSP_CTRL_START, // Start button. - PSP_CTRL_UP, // Up D-Pad button. - PSP_CTRL_RIGHT, // Right D-Pad button. - PSP_CTRL_DOWN, // Down D-Pad button. - PSP_CTRL_LEFT, // Left D-Pad button. - PSP_CTRL_LTRIGGER, // Left trigger. - PSP_CTRL_RTRIGGER, // Right trigger. - PSP_CTRL_TRIANGLE, // Triangle button. - PSP_CTRL_CIRCLE, // Circle button. - PSP_CTRL_CROSS, // Cross button. - PSP_CTRL_SQUARE, // Square button. - PSP_CTRL_HOLD, // Hold button. - }; - u64 curr; - long long int nextInput = 0; - u64 lastTime; - u32 oldButtons; - u32 veryOldButtons; - u32 gTickFrequency = sceRtcGetTickResolution(); + static const int keyCodeList[] = { + PSP_CTRL_SELECT, // Select button. + PSP_CTRL_START, // Start button. + PSP_CTRL_UP, // Up D-Pad button. + PSP_CTRL_RIGHT, // Right D-Pad button. + PSP_CTRL_DOWN, // Down D-Pad button. + PSP_CTRL_LEFT, // Left D-Pad button. + PSP_CTRL_LTRIGGER, // Left trigger. + PSP_CTRL_RTRIGGER, // Right trigger. + PSP_CTRL_TRIANGLE, // Triangle button. + PSP_CTRL_CIRCLE, // Circle button. + PSP_CTRL_CROSS, // Cross button. + PSP_CTRL_SQUARE, // Square button. + PSP_CTRL_HOLD, // Hold button. + }; + u64 curr; + long long int nextInput = 0; + u64 lastTime; + u32 oldButtons; + u32 veryOldButtons; + u32 gTickFrequency = sceRtcGetTickResolution(); - sceRtcGetCurrentTick(&lastTime); - oldButtons = veryOldButtons = 0; - JGECreateDefaultBindings(); - while (!mDone) + sceRtcGetCurrentTick(&lastTime); + oldButtons = veryOldButtons = 0; + JGECreateDefaultBindings(); + while (!mDone) { - if (!mPaused) - { - sceRtcGetCurrentTick(&curr); - float dt = (curr - lastTime) / (float)gTickFrequency; - mDeltaTime = dt; - sceCtrlPeekBufferPositive(&gCtrlPad, 1); - for (signed int i = sizeof(keyCodeList)/sizeof(keyCodeList[0]) - 1; i >= 0; --i) - { - if (keyCodeList[i] & gCtrlPad.Buttons) + if (!mPaused) + { + sceRtcGetCurrentTick(&curr); + float dt = (curr - lastTime) / (float)gTickFrequency; + mDeltaTime = dt; + sceCtrlPeekBufferPositive(&gCtrlPad, 1); + for (signed int i = sizeof(keyCodeList)/sizeof(keyCodeList[0]) - 1; i >= 0; --i) + { + if (keyCodeList[i] & gCtrlPad.Buttons) { - if (!(keyCodeList[i] & oldButtons)) - HoldKey(keyCodeList[i]); + if (!(keyCodeList[i] & oldButtons)) + HoldKey(keyCodeList[i]); } - else - if (keyCodeList[i] & oldButtons) - ReleaseKey(keyCodeList[i]); - } - oldButtons = gCtrlPad.Buttons; - Update(dt); - Render(); - if (mDebug) - { - if (strlen(mDebuggingMsg)>0) - { - pspDebugScreenSetXY(0, 0); - pspDebugScreenPrintf(mDebuggingMsg); - } + else + if (keyCodeList[i] & oldButtons) + ReleaseKey(keyCodeList[i]); } - veryOldButtons = gCtrlPad.Buttons; + oldButtons = gCtrlPad.Buttons; + Update(dt); + Render(); + if (mDebug) + { + if (strlen(mDebuggingMsg)>0) + { + pspDebugScreenSetXY(0, 0); + pspDebugScreenPrintf(mDebuggingMsg); + } + } + veryOldButtons = gCtrlPad.Buttons; } - else - sceKernelDelayThread(1); - lastTime = curr; + else + sceKernelDelayThread(1); + lastTime = curr; } } @@ -423,13 +438,13 @@ void JGE::Run() #else ///// Non PSP code void JGE::Init() { - mDone = false; - mPaused = false; - mCriticalAssert = false; - JRenderer::GetInstance(); - JFileSystem::GetInstance(); - JSoundSystem::GetInstance(); - LeftClickedProcessed(); + mDone = false; + mPaused = false; + mCriticalAssert = false; + JRenderer::GetInstance(); + JFileSystem::GetInstance(); + JSoundSystem::GetInstance(); + LeftClickedProcessed(); } #endif ///// Non PSP code @@ -441,107 +456,115 @@ JGE* JGE::mInstance = NULL; // returns number of milliseconds since game started int JGE::GetTime() { - return JGEGetTime(); + return JGEGetTime(); } void JGE::SetDelta(float delta) { - mDeltaTime = delta; + mDeltaTime = delta; } float JGE::GetDelta() { - return mDeltaTime; + return mDeltaTime; } float JGE::GetFPS() { - return mDeltaTime > 0 ? 1.0f / mDeltaTime : 0; + return mDeltaTime > 0 ? 1.0f / mDeltaTime : 0; } JGE* JGE::GetInstance() { - if (mInstance == NULL) mInstance = new JGE(); - return mInstance; + if (mInstance == NULL) mInstance = new JGE(); + return mInstance; } void JGE::Destroy() { - if (mInstance) + if (mInstance) { - delete mInstance; - mInstance = NULL; + delete mInstance; + mInstance = NULL; } } -void JGE::SetARGV(int argc, char * argv[]){ +void JGE::SetARGV(int argc, char * argv[]) +{ for (int i = 0; i < argc; ++i){ string s = argv[i]; mArgv.push_back(s); } } -std::vector JGE::GetARGV() { +std::vector JGE::GetARGV() +{ return mArgv; } void JGE::SetApp(JApp *app) { - mApp = app; + mApp = app; } void JGE::Render() { - JRenderer* renderer = JRenderer::GetInstance(); + JRenderer* renderer = JRenderer::GetInstance(); - renderer->BeginScene(); - if (mApp != NULL) mApp->Render(); - renderer->EndScene(); + renderer->BeginScene(); + if (mApp != NULL) mApp->Render(); + renderer->EndScene(); } void JGE::End() { - mDone = true; + mDone = true; } void JGE::printf(const char *format, ...) { - va_list list; - - va_start(list, format); - vsprintf(mDebuggingMsg, format, list); - va_end(list); + va_list list; + va_start(list, format); + vsprintf(mDebuggingMsg, format, list); + va_end(list); } void JGE::Pause() { - if (mPaused) return; + if (mPaused) return; - mPaused = true; - if (mApp != NULL) mApp->Pause(); + mPaused = true; + if (mApp != NULL) mApp->Pause(); } - void JGE::Resume() { - if (mPaused) + if (mPaused) { - mPaused = false; - if (mApp != NULL) - mApp->Resume(); + mPaused = false; + if (mApp != NULL) + mApp->Resume(); } } void JGE::Assert(const char *filename, long lineNumber) { - mAssertFile = filename; - mAssertLine = lineNumber; - mCriticalAssert = true; + mAssertFile = filename; + mAssertLine = lineNumber; + mCriticalAssert = true; +} + +void JGE::Scroll(int inXVelocity, int inYVelocity) +{ + if (mApp != NULL) + { + mApp->OnScroll(inXVelocity, inYVelocity); + } } std::queue< pair< pair, bool> > JGE::keyBuffer; diff --git a/JGE/src/SDLmain.cpp b/JGE/src/SDLmain.cpp index f3861e29b..1ee67b543 100644 --- a/JGE/src/SDLmain.cpp +++ b/JGE/src/SDLmain.cpp @@ -45,6 +45,17 @@ const int kHitzonePliancy = 50; // tick value equates to ms const int kTapEventTimeout = 250; + +uint64_t lastTickCount; +JGE* g_engine = NULL; +JApp* g_app = NULL; +JGameLauncher* g_launcher = NULL; + +class SdlApp; + +SdlApp *g_SdlApp = NULL; + + class SdlApp { public: /* For easy interfacing with JGE static functions */ @@ -215,6 +226,7 @@ public: case SDL_JOYBALLMOTION: DebugTrace("Flick gesture detected, x: " << Event->jball.xrel << ", y: " << Event->jball.yrel); + g_engine->Scroll(Event->jball.xrel, Event->jball.yrel); break; } } @@ -228,14 +240,6 @@ public: } }; -uint64_t lastTickCount; -JGE* g_engine = NULL; -JApp* g_app = NULL; -JGameLauncher* g_launcher = NULL; -SdlApp *g_SdlApp = NULL; - - - static const struct { LocalKeySym keysym; JButton keycode; } gDefaultBindings[] = { /* windows controls */ diff --git a/projects/mtg/include/GameApp.h b/projects/mtg/include/GameApp.h index ea5e9d4c8..0c1245ddc 100644 --- a/projects/mtg/include/GameApp.h +++ b/projects/mtg/include/GameApp.h @@ -89,6 +89,8 @@ public: virtual void Pause(); virtual void Resume(); + virtual void OnScroll(int inXVelocity, int inYVelocity); + void LoadGameStates(); void SetNextState(int state); void DoTransition(int trans, int tostate, float dur = -1, bool animonly = false); diff --git a/projects/mtg/include/GameState.h b/projects/mtg/include/GameState.h index 5e2908022..c5ff82161 100644 --- a/projects/mtg/include/GameState.h +++ b/projects/mtg/include/GameState.h @@ -55,6 +55,10 @@ public: virtual void Start(){} virtual void End(){} + virtual void OnScroll(int inXVelocity, int inYVelocity) + { + } + virtual void Update(float dt) = 0; virtual void Render() = 0; diff --git a/projects/mtg/include/GameStateDeckViewer.h b/projects/mtg/include/GameStateDeckViewer.h index f815ecb72..fbf845bb9 100644 --- a/projects/mtg/include/GameStateDeckViewer.h +++ b/projects/mtg/include/GameStateDeckViewer.h @@ -141,6 +141,8 @@ public: int loadDeck(int deckid); void LoadDeckStatistics(int deckId); + void OnScroll(int inXVelocity, int inYVelocity); + void buildEditorMenu(); virtual void ButtonPressed(int controllerId, int controlId); }; diff --git a/projects/mtg/src/GameApp.cpp b/projects/mtg/src/GameApp.cpp index 1372ab537..b29f7a47f 100644 --- a/projects/mtg/src/GameApp.cpp +++ b/projects/mtg/src/GameApp.cpp @@ -424,6 +424,14 @@ void GameApp::Render() } +void GameApp::OnScroll(int inXVelocity, int inYVelocity) +{ + if (mCurrentState != NULL) + { + mCurrentState->OnScroll(inXVelocity, inYVelocity); + } +} + void GameApp::SetNextState(int state) { mNextState = mGameStates[state]; diff --git a/projects/mtg/src/GameStateDeckViewer.cpp b/projects/mtg/src/GameStateDeckViewer.cpp index 4390fa57f..1b97e0e49 100644 --- a/projects/mtg/src/GameStateDeckViewer.cpp +++ b/projects/mtg/src/GameStateDeckViewer.cpp @@ -1668,3 +1668,12 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId) } } +void GameStateDeckViewer::OnScroll(int inXVelocity, int inYVelocity) +{ + if (abs(inYVelocity) > 300) + { + bool flickUpwards = (inYVelocity < 0); + mEngine->HoldKey_NoRepeat(flickUpwards ? JGE_BTN_DOWN : JGE_BTN_UP); + + } +}