Qml 如何同时处理两个关键事件

Qml 如何同时处理两个关键事件,qml,Qml,我正在尝试创建一个模拟两个玩家之间的游戏。我想让它们通过根矩形的Keys.onPressed属性通过键盘移动,但我遇到了一个问题,即两个玩家无法同时获得命令,因为只捕获一个按键事件。。代码如下: Rectangle { id: root height: 1000; width: 1000 Row { spacing: 100 x: 350 Repeater { id:

我正在尝试创建一个模拟两个玩家之间的游戏。我想让它们通过根矩形的Keys.onPressed属性通过键盘移动,但我遇到了一个问题,即两个玩家无法同时获得命令,因为只捕获一个按键事件。。代码如下:

    Rectangle
{
    id: root
    height: 1000; width: 1000

    Row
    {
        spacing: 100
        x: 350
        Repeater
        {
            id: repeater
            model: 2
            Rectangle
            {
                width: 50
                height: 100
                y:500
                color: "blue"
                property int speedForward: 5
                property int speedBackward: 3

                Rectangle
                {
                    height: 10; width: 10
                    x: 20
                    color: "red"
                }
            }
        }
    }

    Keys.onPressed:
    {
        var robot = (event.key > 100) ? repeater.itemAt(0) : repeater.itemAt(1)

        if((event.key === 16777234) || (event.key === 65))
        {
            robot.rotation = (robot.rotation - 5) % 360;
        }
        if((event.key === 16777236) || (event.key === 68))
        {
            robot.rotation = (robot.rotation + 5) % 360;
        }
        if((event.key === 16777235) || (event.key === 87))
        {
            robot.x = robot.x + robot.speedForward * Math.sin(Math.PI * robot.rotation / 180);
            robot.y = robot.y - robot.speedForward * Math.cos(Math.PI * robot.rotation / 180);
        }
        if((event.key === 16777237) || (event.key === 83))
        {
            robot.x = robot.x - robot.speedForward * Math.sin(Math.PI * robot.rotation / 180);
            robot.y = robot.y + robot.speedForward * Math.cos(Math.PI * robot.rotation / 180);
        }
    }

    focus: true
}

有什么想法吗?

你应该使用定时器和按键

以下是一个您可以根据需要进行调整的示例:

property var robot1Event: {"rotation":false,
                            "move":false};
property var robot2Event: {"rotation":false,
                            "move":false};

Keys.onPressed: {
    if (event.key === Qt.Key_Left) { robot1Event["rotation"] = true; }
    if (event.key === Qt.Key_Up)   { robot1Event["move"]     = true; }
    if (event.key === Qt.Key_A)    { robot2Event["rotation"] = true; }
    if (event.key === Qt.Key_W)    { robot2Event["move"]     = true; }
}
Keys.onReleased: {
    if (event.key === Qt.Key_Left) { robot1Event["rotation"] = false; }
    if (event.key === Qt.Key_Up)   { robot1Event["move"]     = false; }
    if (event.key === Qt.Key_A)    { robot2Event["rotation"] = false; }
    if (event.key === Qt.Key_W)    { robot2Event["move"]     = false; }
}

Timer {
    interval: 50;
    running: true;
    repeat: true;
    onTriggered: {
        var rotation = function (robot) { robot.rotation = (robot.rotation - 5) % 360; }
        var move = function (robot) {
            robot.x = robot.x + robot.speedForward * Math.sin(Math.PI * robot.rotation / 180);
            robot.y = robot.y - robot.speedForward * Math.cos(Math.PI * robot.rotation / 180);
        }

        var robot = repeater.itemAt(0);
        if (robot1Event["rotation"]) { rotation(robot); }
        if (robot1Event["move"]) { move(robot); }

        robot = repeater.itemAt(1);
        if (robot2Event["rotation"]) { rotation(robot); }
        if (robot2Event["move"]) { move(robot); }
    }
}

如果这个答案解决了您的问题,您应该考虑验证它