0

这是揭示问题的代码的最小版本:

在桌面套件 (Windows)上玩游戏时移动球拍不会影响球的移动速度,但在 Android 设备上运行时,移动球拍会影响球的移动速度,就好像它们的移动已经捆绑在一起一样。
请问有什么解决办法?

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 720
    height: 620
    title: qsTr("Movement Test")

    Rectangle {
        id: table
        anchors.fill: parent
        color: "gray"

        Rectangle {
            id: ball
            property double xincrement: Math.random() + 0.5
            property double yincrement: Math.random() + 0.5
            width: 15
            height: width
            radius: width / 2
            color: "white"
            x: 300; y: 300
        }

        Racket {
            id: myRacket
            x: table.width - 50
            y: table.height/3
            color: "blue"
        }

        Timer {
            interval: 5; repeat: true; running: true

            function collision() {
                if((ball.x + ball.width >= myRacket.x  &&
                    ball.x < myRacket.x + myRacket.width) &&
                   (ball.y + ball.height >= myRacket.y &&
                    ball.y <= myRacket.y + myRacket.height))
                    return true
                return false
            }

            onTriggered: {
                if(ball.x + ball.width >= table.width)
                    running = false

                else if(ball.x <= 0)
                    ball.xincrement *= -1

                else if (collision())
                    ball.xincrement *= -1

                ball.x = ball.x + (ball.xincrement * 1.5);
                ball.y = ball.y + (ball.yincrement * 1.5);

                if(ball.y <= 0 || ball.y + ball.height >= table.height)
                    ball.yincrement *= -1
            }
        }
    }
}

Racket.qml

import QtQuick 2.9

Rectangle {
    id: root
    width: 15; height: 65
    property int oldY: y
    property bool yUwards: false
    property bool yDwards: false

    onYChanged: {
        if(y > oldY)  yDwards = true
        else if (y < oldY)  yUwards = true
        oldY = y
    }

    MouseArea {
        anchors.fill: parent
        anchors.margins: -root.height
        drag.target: root
        focus: true
        hoverEnabled: true
        pressAndHoldInterval: 0
        drag.axis: Drag.YAxis
        drag.minimumY: table.y
        drag.maximumY: table.height - root.height - 10
    }
}
4

1 回答 1

0

Qt 尝试每 16-17 毫秒渲染一次。如果您将计时器设置为 5 毫秒,它将尝试每帧触发 3 到 4 次。

正在发生的其他事情可能会阻碍它保持这种步伐。如果设备功能较弱,则此效果可能比在其他设备上更明显。

要查看是否Timer达到设定的速率,您可以使用以下命令打印当前ms部分时间:

console.log(Qt.formatTime(new Date(), "zzz"))

Timer如果达到全速,记录的值应为 5 次。如果没有,它将与 5 不同。

最简单的方法是设置球将移动到的目标位置,并为该移动设置动画(使用Animation-Type)。Animation应注意保持移动速度,即使在帧速率可能下降的情况下也是如此。

如果你想手动做,而不是使用计时器,你应该使用onAfterRendering-slot (我认为Window)。这将在屏幕上发生移动并触发渲染时触发。这也是检查碰撞的理想时机。

然后,您需要根据其速度、当前位置和经过的时间来计算新位置。后者你可以从 JS对象中获取Date(),或者你以某种方式从 C++ 中使用QElapsedTimer

于 2018-01-03T22:55:15.620 回答