You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
3.4 KiB

#ifndef INPUTCONVERTGAME_H
#define INPUTCONVERTGAME_H
#include <QPointF>
#include <QQueue>
#include "inputconvertnormal.h"
#include "keymap.h"
#define MULTI_TOUCH_MAX_NUM 10
class InputConvertGame : public InputConvertNormal
{
Q_OBJECT
public:
InputConvertGame(Controller *controller);
virtual ~InputConvertGame();
virtual void mouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize);
virtual void wheelEvent(const QWheelEvent *from, const QSize &frameSize, const QSize &showSize);
virtual void keyEvent(const QKeyEvent *from, const QSize &frameSize, const QSize &showSize);
virtual bool isCurrentCustomKeymap();
void loadKeyMap(const QString &json);
protected:
void updateSize(const QSize &frameSize, const QSize &showSize);
void sendTouchDownEvent(int id, QPointF pos);
void sendTouchMoveEvent(int id, QPointF pos);
void sendTouchUpEvent(int id, QPointF pos);
void sendTouchEvent(int id, QPointF pos, AndroidMotioneventAction action);
QPointF calcFrameAbsolutePos(QPointF relativePos);
QPointF calcScreenAbsolutePos(QPointF relativePos);
// multi touch id
int attachTouchID(int key);
void detachTouchID(int key);
int getTouchID(int key);
// steer wheel
void processSteerWheel(const KeyMap::KeyMapNode &node, const QKeyEvent *from);
// click
void processKeyClick(const QPointF &clickPos, bool clickTwice, bool switchMap, const QKeyEvent *from);
// click mutil
void processKeyClickMulti(const KeyMap::DelayClickNode *nodes, const int count, const QKeyEvent *from);
// drag
void processKeyDrag(const QPointF &startPos, QPointF endPos, const QKeyEvent *from);
// mouse
bool processMouseClick(const QMouseEvent *from);
bool processMouseMove(const QMouseEvent *from);
void moveCursorTo(const QMouseEvent *from, const QPoint &localPosPixel);
void mouseMoveStartTouch(const QMouseEvent *from);
void mouseMoveStopTouch();
void startMouseMoveTimer();
void stopMouseMoveTimer();
bool switchGameMap();
bool checkCursorPos(const QMouseEvent *from);
void hideMouseCursor(bool hide);
void getDelayQueue(const QPointF& start, const QPointF& end,
const double& distanceStep, const double& posStepconst, const double& timerStep,
QQueue<QPointF>& queuePos, QQueue<double>& queueTimer);
protected:
void timerEvent(QTimerEvent *event);
private slots:
void onSteerWheelTimer();
private:
QSize m_frameSize;
QSize m_showSize;
bool m_gameMap = false;
bool m_needBackMouseMove = false;
int m_multiTouchID[MULTI_TOUCH_MAX_NUM] = { 0 };
KeyMap m_keyMap;
bool m_processMouseMove = true;
// steer wheel
struct
{
// the first key pressed
int touchKey = Qt::Key_unknown;
bool pressedUp = false;
bool pressedDown = false;
bool pressedLeft = false;
bool pressedRight = false;
// for delay
struct {
QPointF currentPos;
QTimer* timer = nullptr;
QQueue<QPointF> queuePos;
QQueue<double> queueTimer;
int pressedNum = 0;
} delayData;
} m_ctrlSteerWheel;
// mouse move
struct
{
QPointF lastConverPos;
QPointF lastPos = { 0.0, 0.0 };
bool touching = false;
int timer = 0;
bool smallEyes = false;
} m_ctrlMouseMove;
};
#endif // INPUTCONVERTGAME_H