hel*_*ene 5 animation qt behavior qml
我编写了一个“游戏”,其中一个球被发送到墙上弹跳。在伤害墙壁之前,y 上的行为是弹簧动画。当球撞到墙壁时,球应该弹起并做直线运动。
我的问题是我无法停止最初的行为。
我尝试了几种方法:
这是代码
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)
我不明白为什么我无法阻止这种行为。是否可以定义状态行为来解决问题?
当球撞到墙壁时,将此代码置于信号上:
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)
但是,我认为您需要在“线性行为”完成后调用“行为启用器”(而不是创建新的计时器)。
| 归档时间: |
|
| 查看次数: |
3822 次 |
| 最近记录: |