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.

This commit is contained in:
wrenczes@gmail.com
2011-06-15 09:52:11 +00:00
parent e1dc1afa74
commit 741f662bb0
9 changed files with 298 additions and 240 deletions

View File

@@ -82,6 +82,8 @@ public:
///
//////////////////////////////////////////////////////////////////////////
virtual void Resume() = 0;
virtual void OnScroll(int inXVelocity, int inYVelocity) = 0;
};

View File

@@ -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.
///

View File

@@ -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<pair<LocalKeySym, JButton>, bool> triplet(pair<LocalKeySym, J
void JGE::PressKey(const LocalKeySym sym)
{
const pair<keycodes_it, keycodes_it> 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<keycodes_it, keycodes_it> 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<keycodes_it, keycodes_it> 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<keycodes_it, keycodes_it> 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<keycodes_it, keycodes_it> 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<keycodes_it, keycodes_it> 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<float>::quiet_NaN();
keyBuffer.push(triplet(*it, true));
if (!held(it->second))
holds[it->second] = std::numeric_limits<float>::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<float>::quiet_NaN();
keyBuffer.push(triplet(LOCAL_KEY_NONE, sym, true));
if (!held(sym))
holds[sym] = std::numeric_limits<float>::quiet_NaN();
}
void JGE::ReleaseKey(const LocalKeySym sym)
{
set<JButton> s;
const pair<keycodes_it, keycodes_it> rng = keyBinds.equal_range(sym);
for (keycodes_it it = rng.first; it != rng.second; ++it)
set<JButton> s;
const pair<keycodes_it, keycodes_it> 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<pair<LocalKeySym, JButton>, bool> > r;
while (!keyBuffer.empty())
queue< pair<pair<LocalKeySym, JButton>, bool> > r;
while (!keyBuffer.empty())
{
pair<pair<LocalKeySym, JButton>, bool> q = keyBuffer.front();
keyBuffer.pop();
if ((!q.second) || (s.end() == s.find(q.first.second))) r.push(q);
pair<pair<LocalKeySym, JButton>, 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<pair<LocalKeySym, JButton>, bool> > r;
while (!keyBuffer.empty())
holds.erase(sym);
queue< pair<pair<LocalKeySym, JButton>, bool> > r;
while (!keyBuffer.empty())
{
pair<pair<LocalKeySym, JButton>, bool> q = keyBuffer.front();
keyBuffer.pop();
if ((!q.second) || (q.first.second != sym)) r.push(q);
pair<pair<LocalKeySym, JButton>, 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<JButton, float>::iterator it = holds.begin(); it != holds.end(); ++it)
for (map<JButton, float>::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<keycodes_it, keycodes_it> rng = keyBinds.equal_range(sym);
keyBinds.erase(rng.first, rng.second);
return keyBinds.size();
pair<keycodes_it, keycodes_it> 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<std::string> JGE::GetARGV() {
std::vector<std::string> 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<LocalKeySym, JButton>, bool> > JGE::keyBuffer;

View File

@@ -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 */

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);
};

View File

@@ -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];

View File

@@ -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);
}
}