我试图让玩家顺利地向 QML 中的目的地移动。我正在使用 aNumberAnimation
为 x,y 位置变化设置动画。的NumberAnimation
持续时间应该与玩家必须行进的距离成正比,这样玩家就可以以相同的速度移动,而不管他们离目的地有多远。
import QtQuick 1.1
Item {
width: 720
height: 720
MouseArea {
anchors.fill: parent
onClicked: {
var newXDest = mouse.x - player.width / 2;
var newYDest = mouse.y - player.height / 2;
var dist = player.distanceFrom(newXDest, newYDest);
// Make duration proportional to distance.
player.xMovementDuration = dist; // 1 msec per pixel
player.yMovementDuration = dist; // 1 msec per pixel
console.log("dist = " + dist);
player.xDest = newXDest;
player.yDest = newYDest;
}
}
Rectangle {
id: player
x: xDest
y: yDest
width: 32
height: 32
color: "blue"
property int xDest: 0
property int yDest: 0
property int xMovementDuration: 0
property int yMovementDuration: 0
function distanceFrom(x, y) {
var xDist = x - player.x;
var yDist = y - player.y;
return Math.sqrt(xDist * xDist + yDist * yDist);
}
Behavior on x {
NumberAnimation {
duration: player.xMovementDuration
// duration: 1000
}
}
Behavior on y {
NumberAnimation {
duration: player.yMovementDuration
// duration: 1000
}
}
}
Rectangle {
x: player.xDest
y: player.yDest
width: player.width
height: player.height
color: "transparent"
border.color: "red"
}
}
我的问题可以通过运行上面的应用程序并执行以下步骤来证明:
- 单击屏幕的右下角。
- 立即单击屏幕的中心(或更靠近左上角)。
在第二次单击时(当矩形仍在移动时),矩形的数字动画似乎停止了(这是我想要的),但它假定了目的地的位置(不是我想要的)。相反,我希望动画停止并且矩形呈现它停止的位置,然后继续到新的目的地。
正确的行为 - 忽略移动速度变得不成比例 - 可以通过将两个NumberAnimation.duration
s 设置为 1000 来查看。