New InputBag, not used yet.
This commit is contained in:
parent
68ebc16422
commit
383ea0c17b
4 changed files with 142 additions and 0 deletions
|
@ -45,6 +45,7 @@ add_executable(${PROJECT_NAME}
|
||||||
src/moversine.cpp
|
src/moversine.cpp
|
||||||
src/gameplaysceneclassic.cpp
|
src/gameplaysceneclassic.cpp
|
||||||
src/moverrelative.cpp
|
src/moverrelative.cpp
|
||||||
|
src/inputbag.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME}
|
target_link_libraries(${PROJECT_NAME}
|
||||||
|
|
69
src/inputbag.cpp
Normal file
69
src/inputbag.cpp
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
#include "inputbag.hpp"
|
||||||
|
#include "key.hpp"
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
namespace cloonel {
|
||||||
|
struct Action {
|
||||||
|
Key key;
|
||||||
|
const std::string name;
|
||||||
|
InputBag::ActionStateType state;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InputBag::LocalData {
|
||||||
|
std::vector<Action> actions;
|
||||||
|
std::map<int, Action*> mappings;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
///----------------------------------------------------------------------
|
||||||
|
///When actions vector is reallocated, update pointers in mappings.
|
||||||
|
///----------------------------------------------------------------------
|
||||||
|
void UpdatePointers (Action* parOldAddrStart, Action* parNewAddress, std::map<int, Action*>& parUpdate, int parOffset) {
|
||||||
|
for (auto itMap : parUpdate) {
|
||||||
|
if (itMap.second >= parOldAddrStart) {
|
||||||
|
itMap.second = parNewAddress + (itMap.second - parOldAddrStart) + parOffset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} //unnamed namespace
|
||||||
|
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
InputBag::InputBag() :
|
||||||
|
m_localdata(new LocalData)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
InputBag::~InputBag() {
|
||||||
|
}
|
||||||
|
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
void InputBag::AddAction (int parAction, const Key& parKey, std::string&& parName) {
|
||||||
|
Action* const oldBuff = m_localdata->actions.data();
|
||||||
|
m_localdata->actions.push_back(Action({parKey, parName, ActionState_Released}));
|
||||||
|
Action* const newBuff = m_localdata->actions.data();
|
||||||
|
if (oldBuff != newBuff) {
|
||||||
|
UpdatePointers(oldBuff, newBuff, m_localdata->mappings, 0);
|
||||||
|
}
|
||||||
|
m_localdata->mappings[parAction] = &m_localdata->actions.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
InputBag::ActionStateType InputBag::ActionState (int parAction) const {
|
||||||
|
assert(m_localdata->mappings.find(parAction) != m_localdata->mappings.end());
|
||||||
|
return m_localdata->mappings[parAction]->state;
|
||||||
|
}
|
||||||
|
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
void InputBag::Clear() {
|
||||||
|
m_localdata->actions.clear();
|
||||||
|
m_localdata->mappings.clear();
|
||||||
|
}
|
||||||
|
} //namespace cloonel
|
32
src/inputbag.hpp
Normal file
32
src/inputbag.hpp
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#ifndef idF4E67FC292A5480DA4305B806170F520
|
||||||
|
#define idF4E67FC292A5480DA4305B806170F520
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace cloonel {
|
||||||
|
struct Key;
|
||||||
|
|
||||||
|
class InputBag {
|
||||||
|
public:
|
||||||
|
enum ActionStateType {
|
||||||
|
ActionState_Released,
|
||||||
|
ActionState_Pressed,
|
||||||
|
ActionState_JustPressed,
|
||||||
|
ActionState_JustReleased
|
||||||
|
};
|
||||||
|
|
||||||
|
InputBag ( void );
|
||||||
|
~InputBag ( void ) noexcept;
|
||||||
|
|
||||||
|
void AddAction ( int parAction, const Key& parKey, std::string&& parName );
|
||||||
|
ActionStateType ActionState ( int parAction ) const;
|
||||||
|
void Clear ( void );
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct LocalData;
|
||||||
|
|
||||||
|
const std::unique_ptr<LocalData> m_localdata;
|
||||||
|
};
|
||||||
|
} //namespace cloonel
|
||||||
|
|
||||||
|
#endif
|
40
src/key.hpp
Normal file
40
src/key.hpp
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#ifndef id8F6145D6CFBA40338C5804DEC032CE16
|
||||||
|
#define id8F6145D6CFBA40338C5804DEC032CE16
|
||||||
|
|
||||||
|
#include <ciso646>
|
||||||
|
|
||||||
|
namespace cloonel {
|
||||||
|
struct Key {
|
||||||
|
enum KeyDevice {
|
||||||
|
KeyDevice_Keyboard
|
||||||
|
};
|
||||||
|
|
||||||
|
Key ( void ) = default;
|
||||||
|
Key ( KeyDevice parDev, int parScancode, const char parLabel[4] ) :
|
||||||
|
srcdevice(parDev),
|
||||||
|
scancode(parScancode)
|
||||||
|
{
|
||||||
|
label[0] = parLabel[0];
|
||||||
|
label[1] = parLabel[1];
|
||||||
|
label[2] = parLabel[2];
|
||||||
|
label[3] = parLabel[3];
|
||||||
|
}
|
||||||
|
~Key ( void ) noexcept = default;
|
||||||
|
|
||||||
|
bool operator== ( const Key& parOther ) const {
|
||||||
|
return srcdevice == parOther.srcdevice and scancode == parOther.srcdevice;
|
||||||
|
}
|
||||||
|
bool operator!= ( const Key& parOther ) const {
|
||||||
|
return not this->operator==(parOther);
|
||||||
|
}
|
||||||
|
bool operator< ( const Key& parOther ) const {
|
||||||
|
return (srcdevice == parOther.srcdevice and scancode < parOther.scancode) or (srcdevice < parOther.srcdevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyDevice srcdevice;
|
||||||
|
int scancode;
|
||||||
|
char label[4];
|
||||||
|
};
|
||||||
|
} //namespace cloonel
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue