feat: keymap support script

dev
rankun 6 years ago
parent a9544bb754
commit cb65678402

@ -9,7 +9,7 @@
InputConvertGame::InputConvertGame(Controller* controller) InputConvertGame::InputConvertGame(Controller* controller)
: InputConvertNormal(controller) : InputConvertNormal(controller)
{ {
m_keyMap.loadKeyMapNode(); m_keyMap.loadKeyMap("");
if (m_keyMap.enableMouseMoveMap()) { if (m_keyMap.enableMouseMoveMap()) {
m_mouseMoveLastConverPos = m_keyMap.getMouseMoveMap().startPos; m_mouseMoveLastConverPos = m_keyMap.getMouseMoveMap().startPos;
} }

@ -1,170 +1,269 @@
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QMetaEnum>
#include <QFileInfo>
#include <QCoreApplication>
#include <QDebug>
#include "keymap.h" #include "keymap.h"
KeyMap::KeyMap() QString KeyMap::s_keyMapPath = "";
KeyMap::KeyMap(QObject *parent)
: QObject(parent)
{
loadKeyMap("");
}
KeyMap::~KeyMap()
{
}
const QString& KeyMap::getKeyMapPath()
{
if (s_keyMapPath.isEmpty()) {
s_keyMapPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_KEYMAP_PATH"));
QFileInfo fileInfo(s_keyMapPath);
if (s_keyMapPath.isEmpty() || !fileInfo.isDir()) {
s_keyMapPath = QCoreApplication::applicationDirPath() + "/keymap";
}
}
return s_keyMapPath;
}
void KeyMap::loadKeyMap(const QString &json)
{
QString errorString;
QByteArray allData;
QJsonParseError jsonError;
QJsonDocument jsonDoc;
QJsonObject rootObj;
QMetaEnum metaEnumKey = QMetaEnum::fromType<Qt::Key>();
QMetaEnum metaEnumMouseButtons = QMetaEnum::fromType<Qt::MouseButtons>();
QMetaEnum metaEnumKeyMapType = QMetaEnum::fromType<KeyMap::KeyMapType>();
QFile loadFile(getKeyMapPath() + "/gameforpeace.json");
if(!loadFile.open(QIODevice::ReadOnly))
{
errorString = "json error: open file failed";
goto parseError;
}
allData = loadFile.readAll();
loadFile.close();
jsonDoc = QJsonDocument::fromJson(allData, &jsonError);
if(jsonError.error != QJsonParseError::NoError)
{ {
errorString = QString("json error: %1").arg(jsonError.errorString());
goto parseError;
}
// switchKey
rootObj = jsonDoc.object();
if (rootObj.contains("switchKey") && rootObj.value("switchKey").isString()) {
Qt::Key key = (Qt::Key)metaEnumKey.keyToValue(rootObj.value("switchKey").toString().toStdString().c_str());
if (-1 == key) {
errorString = QString("json error: switchKey invalid");
goto parseError;
}
m_switchKey = key;
} else {
errorString = QString("json error: no find switchKey");
goto parseError;
}
// mouseMoveMap
if (rootObj.contains("mouseMoveMap") && rootObj.value("mouseMoveMap").isObject()) {
QJsonObject mouseMoveMap = rootObj.value("mouseMoveMap").toObject();
if (mouseMoveMap.contains("speedRatio") && mouseMoveMap.value("speedRatio").isDouble()) {
m_mouseMoveMap.speedRatio = mouseMoveMap.value("speedRatio").toInt();
} else {
errorString = QString("json error: mouseMoveMap on find speedRatio");
goto parseError;
}
if (mouseMoveMap.contains("startPos") && mouseMoveMap.value("startPos").isObject()) {
QJsonObject startPos = mouseMoveMap.value("startPos").toObject();
if (startPos.contains("x") && startPos.value("x").isDouble()) {
m_mouseMoveMap.startPos.setX(startPos.value("x").toDouble());
}
if (startPos.contains("y") && startPos.value("y").isDouble()) {
m_mouseMoveMap.startPos.setY(startPos.value("y").toDouble());
}
} else {
errorString = QString("json error: mouseMoveMap on find startPos");
goto parseError;
}
} }
void KeyMap::loadKeyMapNode() // keyMapNodes
if (rootObj.contains("keyMapNodes") && rootObj.value("keyMapNodes").isArray()) {
QJsonArray keyMapNodes = rootObj.value("keyMapNodes").toArray();
QJsonObject node;
int size = keyMapNodes.size();
for (int i = 0; i < size; i++) {
if (!keyMapNodes.at(i).isObject()) {
errorString = QString("json error: keyMapNodes node must be json object");
goto parseError;
}
node = keyMapNodes.at(i).toObject();
if (!node.contains("type") || !node.value("type").isString()) {
errorString = QString("json error: keyMapNodes no find node type");
goto parseError;
}
KeyMap::KeyMapType type = (KeyMap::KeyMapType)metaEnumKeyMapType.keyToValue(node.value("type").toString().toStdString().c_str());
switch (type) {
case KeyMap::KMT_CLICK:
{ {
KeyMapNode node; // safe check
node.type = KMT_CLICK; if (!node.contains("key") || !node.value("key").isString()
node.click.keyNode.key = Qt::Key_Space; // 跳 || !node.contains("pos") || !node.value("pos").isObject()
node.click.keyNode.pos = QPointF(0.96f, 0.7f); || !node.value("pos").toObject().contains("x") || !node.value("pos").toObject().value("x").isDouble()
node.click.switchMap = false; || !node.value("pos").toObject().contains("y") || !node.value("pos").toObject().value("y").isDouble()
m_keyMapNodes.push_back(node); || !node.contains("switchMap") || !node.value("switchMap").isBool()
) {
node.type = KMT_CLICK; qWarning() << "json error: keyMapNodes node format error";
node.click.keyNode.key = Qt::Key_M; // 地图 break;
node.click.keyNode.pos = QPointF(0.98f, 0.03f); }
node.click.switchMap = true;
m_keyMapNodes.push_back(node); Qt::Key key = (Qt::Key)metaEnumKey.keyToValue(node.value("key").toString().toStdString().c_str());
Qt::MouseButtons btn = (Qt::MouseButtons)metaEnumMouseButtons.keyToValue(node.value("key").toString().toStdString().c_str());
node.type = KMT_CLICK; if (-1 == key && -1 == btn) {
node.click.keyNode.key = Qt::Key_Tab; // 背包 qWarning() << "json error: keyMapNodes node invalid key: " << node.value("key").toString();
node.click.keyNode.pos = QPointF(0.06f, 0.9f); break;
node.click.switchMap = true; }
m_keyMapNodes.push_back(node);
KeyMapNode keyMapNode;
node.type = KMT_CLICK; keyMapNode.type = type;
node.click.keyNode.key = Qt::Key_Z; // 趴 if (key != -1) {
node.click.keyNode.pos = QPointF(0.95f, 0.9f); keyMapNode.click.keyNode.key = key;
node.click.switchMap = false; } else {
m_keyMapNodes.push_back(node); keyMapNode.click.keyNode.key = btn;
}
node.type = KMT_CLICK; keyMapNode.click.keyNode.pos = QPointF(node.value("pos").toObject().value("x").toDouble(),
node.click.keyNode.key = Qt::Key_C; // 蹲 node.value("pos").toObject().value("y").toDouble());
node.click.keyNode.pos = QPointF(0.86f, 0.92f); keyMapNode.click.switchMap = node.value("switchMap").toBool();
node.click.switchMap = false; m_keyMapNodes.push_back(keyMapNode);
m_keyMapNodes.push_back(node); }
break;
node.type = KMT_CLICK; case KeyMap::KMT_CLICK_TWICE:
node.click.keyNode.key = Qt::Key_R; // 换弹 {
node.click.keyNode.pos = QPointF(0.795f, 0.93f); // safe check
node.click.switchMap = false; if (!node.contains("key") || !node.value("key").isString()
m_keyMapNodes.push_back(node); || !node.contains("pos") || !node.value("pos").isObject()
|| !node.value("pos").toObject().contains("x") || !node.value("pos").toObject().value("x").isDouble()
node.type = KMT_CLICK; || !node.value("pos").toObject().contains("y") || !node.value("pos").toObject().value("y").isDouble()
node.click.keyNode.key = Qt::Key_Alt; // 小眼睛 ) {
node.click.keyNode.pos = QPointF(0.8f, 0.31f); qWarning() << "json error: keyMapNodes node format error";
node.click.switchMap = false; break;
m_keyMapNodes.push_back(node); }
node.type = KMT_CLICK; Qt::Key key = (Qt::Key)metaEnumKey.keyToValue(node.value("key").toString().toStdString().c_str());
node.click.keyNode.key = Qt::Key_F; // 捡东西1 Qt::MouseButtons btn = (Qt::MouseButtons)metaEnumMouseButtons.keyToValue(node.value("key").toString().toStdString().c_str());
node.click.keyNode.pos = QPointF(0.7f, 0.34f); if (-1 == key && -1 == btn) {
node.click.switchMap = false; qWarning() << "json error: keyMapNodes node invalid key: " << node.value("key").toString();
m_keyMapNodes.push_back(node); break;
}
node.type = KMT_CLICK;
node.click.keyNode.key = Qt::Key_G; // 捡东西2 KeyMapNode keyMapNode;
node.click.keyNode.pos = QPointF(0.7f, 0.44f); keyMapNode.type = type;
node.click.switchMap = false; if (key != -1) {
m_keyMapNodes.push_back(node); keyMapNode.clickTwice.keyNode.key = key;
} else {
node.type = KMT_CLICK; keyMapNode.clickTwice.keyNode.key = btn;
node.click.keyNode.key = Qt::Key_H; // 捡东西3 }
node.click.keyNode.pos = QPointF(0.7f, 0.54f); keyMapNode.clickTwice.keyNode.pos = QPointF(node.value("pos").toObject().value("x").toDouble(),
node.click.switchMap = false; node.value("pos").toObject().value("y").toDouble());
m_keyMapNodes.push_back(node); m_keyMapNodes.push_back(keyMapNode);
}
node.type = KMT_CLICK; break;
node.click.keyNode.key = Qt::Key_1; // 换枪1 case KeyMap::KMT_STEER_WHEEL:
node.click.keyNode.pos = QPointF(0.45f, 0.9f); {
node.click.switchMap = false; // safe check
m_keyMapNodes.push_back(node); if (!node.contains("leftKey") || !node.value("leftKey").isString()
|| !node.contains("rightKey") || !node.value("rightKey").isString()
node.type = KMT_CLICK; || !node.contains("upKey") || !node.value("upKey").isString()
node.click.keyNode.key = Qt::Key_2; // 换枪2 || !node.contains("downKey") || !node.value("downKey").isString()
node.click.keyNode.pos = QPointF(0.55f, 0.9f); || !node.contains("leftOffset") || !node.value("leftOffset").isDouble()
node.click.switchMap = false; || !node.contains("rightOffset") || !node.value("rightOffset").isDouble()
m_keyMapNodes.push_back(node); || !node.contains("upOffset") || !node.value("upOffset").isDouble()
|| !node.contains("downOffset") || !node.value("downOffset").isDouble()
node.type = KMT_CLICK; || !node.contains("centerPos") || !node.value("centerPos").isObject()
node.click.keyNode.key = Qt::Key_3; // 手雷 || !node.value("centerPos").toObject().contains("x") || !node.value("centerPos").toObject().value("x").isDouble()
node.click.keyNode.pos = QPointF(0.67f, 0.92f); || !node.value("centerPos").toObject().contains("y") || !node.value("centerPos").toObject().value("y").isDouble()
node.click.switchMap = false; ) {
m_keyMapNodes.push_back(node); qWarning() << "json error: keyMapNodes node format error";
break;
node.type = KMT_CLICK; }
node.click.keyNode.key = Qt::Key_4; // 快速打药
node.click.keyNode.pos = QPointF(0.33f, 0.95f); Qt::Key leftKey = (Qt::Key)metaEnumKey.keyToValue(node.value("leftKey").toString().toStdString().c_str());
node.click.switchMap = false; Qt::MouseButtons leftBtn = (Qt::MouseButtons)metaEnumMouseButtons.keyToValue(node.value("leftKey").toString().toStdString().c_str());
m_keyMapNodes.push_back(node); Qt::Key rightKey = (Qt::Key)metaEnumKey.keyToValue(node.value("rightKey").toString().toStdString().c_str());
Qt::MouseButtons rightBtn = (Qt::MouseButtons)metaEnumMouseButtons.keyToValue(node.value("rightKey").toString().toStdString().c_str());
node.type = KMT_CLICK; Qt::Key upKey = (Qt::Key)metaEnumKey.keyToValue(node.value("upKey").toString().toStdString().c_str());
node.click.keyNode.key = Qt::Key_5; // 下车 Qt::MouseButtons upBtn = (Qt::MouseButtons)metaEnumMouseButtons.keyToValue(node.value("upKey").toString().toStdString().c_str());
node.click.keyNode.pos = QPointF(0.92f, 0.4f); Qt::Key downKey = (Qt::Key)metaEnumKey.keyToValue(node.value("downKey").toString().toStdString().c_str());
node.click.switchMap = false; Qt::MouseButtons downBtn = (Qt::MouseButtons)metaEnumMouseButtons.keyToValue(node.value("downKey").toString().toStdString().c_str());
m_keyMapNodes.push_back(node);
if ((-1 == leftKey && -1 == leftBtn)
node.type = KMT_CLICK; || (-1 == rightKey && -1 == rightBtn)
node.click.keyNode.key = Qt::Key_6; // 救人 || (-1 == upKey && -1 == upBtn)
node.click.keyNode.pos = QPointF(0.49f, 0.63f); || (-1 == downKey && -1 == downBtn)
node.click.switchMap = false; ) {
m_keyMapNodes.push_back(node); qWarning() << "json error: keyMapNodes node invalid key: " << node.value("key").toString();
break;
node.type = KMT_CLICK; }
node.click.keyNode.key = Qt::Key_Shift; // 车加速
node.click.keyNode.pos = QPointF(0.82f, 0.8f); KeyMapNode keyMapNode;
node.click.switchMap = false; keyMapNode.type = type;
m_keyMapNodes.push_back(node); if (leftKey != -1) {
keyMapNode.steerWheel.leftKey = leftKey;
node.type = KMT_CLICK; } else {
node.click.keyNode.key = Qt::Key_X; // 开关门 keyMapNode.steerWheel.leftKey = leftBtn;
node.click.keyNode.pos = QPointF(0.7f, 0.7f); }
node.click.switchMap = false; if (rightKey != -1) {
m_keyMapNodes.push_back(node); keyMapNode.steerWheel.rightKey = rightKey;
} else {
node.type = KMT_CLICK; keyMapNode.steerWheel.rightKey = rightBtn;
node.click.keyNode.key = Qt::Key_T; // 舔包 }
node.click.keyNode.pos = QPointF(0.72f, 0.26f); if (upKey != -1) {
node.click.switchMap = false; keyMapNode.steerWheel.upKey = upKey;
m_keyMapNodes.push_back(node); } else {
keyMapNode.steerWheel.upKey = upBtn;
node.type = KMT_CLICK; }
node.click.keyNode.key = Qt::LeftButton; // 开枪 if (downKey != -1) {
node.click.keyNode.pos = QPointF(0.86f, 0.72f); keyMapNode.steerWheel.downKey = downKey;
node.click.switchMap = false; } else {
m_keyMapNodes.push_back(node); keyMapNode.steerWheel.downKey = downBtn;
}
node.type = KMT_CLICK; keyMapNode.steerWheel.leftOffset = node.value("leftOffset").toDouble();
node.click.keyNode.key = Qt::RightButton; // 开镜 keyMapNode.steerWheel.rightOffset = node.value("rightOffset").toDouble();
node.click.keyNode.pos = QPointF(0.96f, 0.52f); keyMapNode.steerWheel.upOffset = node.value("upOffset").toDouble();
node.click.switchMap = false; keyMapNode.steerWheel.downOffset = node.value("downOffset").toDouble();
m_keyMapNodes.push_back(node); keyMapNode.steerWheel.centerPos = QPointF(node.value("centerPos").toObject().value("x").toDouble(),
node.value("centerPos").toObject().value("y").toDouble());
KeyMapNode node2; m_keyMapNodes.push_back(keyMapNode);
node2.type = KMT_CLICK_TWICE; }
node2.clickTwice.keyNode.key = Qt::Key_Q; // 左探头 break;
node2.clickTwice.keyNode.pos = QPointF(0.12f, 0.35f); default:
m_keyMapNodes.push_back(node2); qWarning() << "json error: keyMapNodes invalid node type:" << node.value("type").toString();
break;
node2.type = KMT_CLICK_TWICE; }
node2.clickTwice.keyNode.key = Qt::Key_E; // 右探头 }
node2.clickTwice.keyNode.pos = QPointF(0.2, 0.35f); }
m_keyMapNodes.push_back(node2);
parseError:
// 方向盘 if (!errorString.isEmpty()) {
KeyMapNode node3; qWarning() << errorString;
node3.type = KMT_STEER_WHEEL; }
node3.steerWheel.centerPos = {0.16f, 0.75f}; return;
node3.steerWheel.leftOffset = 0.1f;
node3.steerWheel.rightOffset = 0.1f;
node3.steerWheel.upOffset = 0.27f;
node3.steerWheel.downOffset = 0.2f;
node3.steerWheel.leftKey = Qt::Key_A;
node3.steerWheel.rightKey = Qt::Key_D;
node3.steerWheel.upKey = Qt::Key_W;
node3.steerWheel.downKey = Qt::Key_S;
m_keyMapNodes.push_back(node3);
m_mouseMoveMap.startPos = QPointF(0.57f, 0.26f);
m_mouseMoveMap.speedRatio = 10;
m_switchKey = Qt::Key_QuoteLeft;
} }
KeyMap::KeyMapNode KeyMap::getKeyMapNode(int key) KeyMap::KeyMapNode KeyMap::getKeyMapNode(int key)

@ -1,12 +1,14 @@
#ifndef KEYMAP_H #ifndef KEYMAP_H
#define KEYMAP_H #define KEYMAP_H
#include <QObject>
#include <QPointF> #include <QPointF>
#include <QVector> #include <QVector>
#include <QRectF> #include <QRectF>
class KeyMap class KeyMap : public QObject
{ {
Q_OBJECT
public: public:
enum KeyMapType { enum KeyMapType {
KMT_INVALID = -1, KMT_INVALID = -1,
@ -14,6 +16,7 @@ public:
KMT_CLICK_TWICE, KMT_CLICK_TWICE,
KMT_STEER_WHEEL, KMT_STEER_WHEEL,
}; };
Q_ENUM(KeyMapType)
struct KeyNode { struct KeyNode {
int key = Qt::Key_unknown; int key = Qt::Key_unknown;
@ -67,19 +70,23 @@ public:
int speedRatio = 1; int speedRatio = 1;
}; };
KeyMap(); KeyMap(QObject *parent = Q_NULLPTR);
virtual ~KeyMap();
void loadKeyMapNode(); void loadKeyMap(const QString &json);
KeyMap::KeyMapNode getKeyMapNode(int key); KeyMap::KeyMapNode getKeyMapNode(int key);
int getSwitchKey(); int getSwitchKey();
MouseMoveMap getMouseMoveMap(); MouseMoveMap getMouseMoveMap();
bool enableMouseMoveMap(); bool enableMouseMoveMap();
protected:
const QString& getKeyMapPath();
private: private:
QVector<KeyMapNode> m_keyMapNodes; QVector<KeyMapNode> m_keyMapNodes;
int m_switchKey = Qt::Key_QuoteLeft; int m_switchKey = Qt::Key_QuoteLeft;
MouseMoveMap m_mouseMoveMap; MouseMoveMap m_mouseMoveMap;
static QString s_keyMapPath;
}; };
#endif // KEYMAP_H #endif // KEYMAP_H

@ -33,6 +33,7 @@ int main(int argc, char *argv[])
#ifdef Q_OS_WIN32 #ifdef Q_OS_WIN32
qputenv("QTSCRCPY_ADB_PATH", "../../../third_party/adb/win/adb.exe"); qputenv("QTSCRCPY_ADB_PATH", "../../../third_party/adb/win/adb.exe");
qputenv("QTSCRCPY_SERVER_PATH", "../../../third_party/scrcpy-server.jar"); qputenv("QTSCRCPY_SERVER_PATH", "../../../third_party/scrcpy-server.jar");
qputenv("QTSCRCPY_KEYMAP_PATH", "../../../keymap");
#endif #endif
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX

@ -0,0 +1,255 @@
{
"switchKey": "Key_QuoteLeft",
"mouseMoveMap": {
"startPos": {
"x": 0.57,
"y": 0.26
},
"speedRatio": 10
},
"keyMapNodes": [{
"comment": "方向盘",
"type": "KMT_STEER_WHEEL",
"centerPos": {
"x": 0.16,
"y": 0.75
},
"leftOffset": 0.1,
"rightOffset": 0.1,
"upOffset": 0.27,
"downOffset": 0.2,
"leftKey": "Key_A",
"rightKey": "Key_D",
"upKey": "Key_W",
"downKey": "Key_S"
},
{
"comment": "左探头",
"type": "KMT_CLICK_TWICE",
"key": "Key_Q",
"pos": {
"x": 0.12,
"y": 0.35
}
},
{
"comment": "右探头",
"type": "KMT_CLICK_TWICE",
"key": "Key_E",
"pos": {
"x": 0.2,
"y": 0.35
}
},
{
"comment": "跳",
"type": "KMT_CLICK",
"key": "Key_Space",
"pos": {
"x": 0.96,
"y": 0.7
},
"switchMap": false
},
{
"comment": "地图",
"type": "KMT_CLICK",
"key": "Key_M",
"pos": {
"x": 0.98,
"y": 0.03
},
"switchMap": true
},
{
"comment": "背包",
"type": "KMT_CLICK",
"key": "Key_Tab",
"pos": {
"x": 0.06,
"y": 0.9
},
"switchMap": true
},
{
"comment": "趴",
"type": "KMT_CLICK",
"key": "Key_Z",
"pos": {
"x": 0.95,
"y": 0.9
},
"switchMap": false
},
{
"comment": "蹲",
"type": "KMT_CLICK",
"key": "Key_C",
"pos": {
"x": 0.86,
"y": 0.92
},
"switchMap": false
},
{
"comment": "换弹",
"type": "KMT_CLICK",
"key": "Key_R",
"pos": {
"x": 0.795,
"y": 0.93
},
"switchMap": false
},
{
"comment": "小眼睛",
"type": "KMT_CLICK",
"key": "Key_Alt",
"pos": {
"x": 0.8,
"y": 0.31
},
"switchMap": false
},
{
"comment": "捡东西1",
"type": "KMT_CLICK",
"key": "Key_F",
"pos": {
"x": 0.7,
"y": 0.34
},
"switchMap": false
},
{
"comment": "捡东西2",
"type": "KMT_CLICK",
"key": "Key_G",
"pos": {
"x": 0.7,
"y": 0.44
},
"switchMap": false
},
{
"comment": "捡东西3",
"type": "KMT_CLICK",
"key": "Key_H",
"pos": {
"x": 0.7,
"y": 0.54
},
"switchMap": false
},
{
"comment": "换枪1",
"type": "KMT_CLICK",
"key": "Key_1",
"pos": {
"x": 0.45,
"y": 0.9
},
"switchMap": false
},
{
"comment": "换枪2",
"type": "KMT_CLICK",
"key": "Key_2",
"pos": {
"x": 0.55,
"y": 0.9
},
"switchMap": false
},
{
"comment": "手雷",
"type": "KMT_CLICK",
"key": "Key_3",
"pos": {
"x": 0.67,
"y": 0.92
},
"switchMap": false
},
{
"comment": "快速打药",
"type": "KMT_CLICK",
"key": "Key_4",
"pos": {
"x": 0.33,
"y": 0.95
},
"switchMap": false
},
{
"comment": "下车",
"type": "KMT_CLICK",
"key": "Key_S",
"pos": {
"x": 0.92,
"y": 0.4
},
"switchMap": false
},
{
"comment": "救人",
"type": "KMT_CLICK",
"key": "Key_6",
"pos": {
"x": 0.49,
"y": 0.63
},
"switchMap": false
},
{
"comment": "车加速",
"type": "KMT_CLICK",
"key": "Key_Shift",
"pos": {
"x": 0.82,
"y": 0.8
},
"switchMap": false
},
{
"comment": "开关门",
"type": "KMT_CLICK",
"key": "Key_X",
"pos": {
"x": 0.7,
"y": 0.7
},
"switchMap": false
},
{
"comment": "舔包",
"type": "KMT_CLICK",
"key": "Key_T",
"pos": {
"x": 0.72,
"y": 0.26
},
"switchMap": false
},
{
"comment": "开枪",
"type": "KMT_CLICK",
"key": "LeftButton",
"pos": {
"x": 0.86,
"y": 0.72
},
"switchMap": false
},
{
"comment": "开镜",
"type": "KMT_CLICK",
"key": "RightButton",
"pos": {
"x": 0.96,
"y": 0.52
},
"switchMap": false
}
]
}
Loading…
Cancel
Save