停止行为 - QML

hel*_*ene 5 animation qt behavior qml

我编写了一个“游戏”,其中一个球被发送到墙上弹跳。在伤害墙壁之前,y 上的行为是弹簧动画。当球撞到墙壁时,球应该弹起并做直线运动。

我的问题是我无法停止最初的行为。

我尝试了几种方法:

  • 禁用该行为,但正在进行的运动继续
  • 停止 SpringAnimation :我遇到错误:“QML SpringAnimation:setRunning() 不能在非根动画节点上使用。”

这是代码

Rectangle {
    id: ball
    property bool enableMoving: false

    function newMousePos(mX,mY){
        if(enableMoving){
            ball.x = mX - ball.width/2
            ball.y = mY - ball.height/2
        }
    }

    Behavior on x {enabled: true;id: behavX; SpringAnimation {id:spX;  spring: 0.8; damping: 0.9; mass: 10; } }
    Behavior on y {enabled: true;id: behavY; SpringAnimation {id:spY;  spring: 0.8; damping: 0.9; mass: 10 ; } }


    onXChanged: {
        if(ball.x>main.width-ball.size) {
            console.log("wall 2 ")
            spX.stop(); spY.stop()
        }
        if(ball.x<0)  {
         ...
        }
       }
    onYChanged: {
       ...
       }
  Timer{
        id:timerDisableMoving
        interval: 500; running:true
        onTriggered: enableMoving=false
    } 
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我无法阻止这种行为。是否可以定义状态行为来解决问题?

DRA*_*RAX 0

当球撞到墙壁时,将此代码置于信号上:

behavX.enabled = false
Run Code Online (Sandbox Code Playgroud)

这将禁用行为(我已经在我的项目中测试了它)。

如果您只想禁用特定动画,请按以下步骤操作:

spX.running = false  //ignore this, it is equivalent to spX.stop()
Run Code Online (Sandbox Code Playgroud)

我只是想你可能会输入这样的代码:

function disableBehavior()
{
  behavX.enabled = false
  //...
  behavX.enabled = true
}
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,那么它将不起作用,因为在执行期间动画不会发生。相反,您应该进行异步调用,例如如下所示:

function disableBehavior()
{
  behavX.enabled = false
  //...
  myTimer.start()
}

//...
Timer
{
  id: myTimer
  interval: 1
  running: false
  onTriggered:
  {
    behavX.enabled = true
    stop()
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我认为您需要在“线性行为”完成后调用“行为启用器”(而不是创建新的计时器)。