好吧,可能有许多 QML 程序,如果两个组件相互碰撞,程序员会根据它定义一个动作。在下面这样的程序中,我们想专注于那个碰撞,并尝试知道如何定义一个函数来告诉我们这种碰撞是否发生。
下面的代码是更大程序的一部分。我尝试collision
在代码中使用为此调用的函数。到目前为止的问题是它运行得不好。我想知道 QML 中是否有内置函数“或”是否有用于此目的的好代码。
球拍有三个可能与球发生碰撞的面:一个长在前面,一个上面和一个下面。具体问题是,当球从上或下表面与球拍碰撞时,球会进入球拍内部!
我要解决的问题是。我希望当球从任何面击中球拍时,它会反射。
main.qml
:
import QtQuick 2.9
import QtQuick.Window 2.2
Window {
visible: true
width: 720
height: 620
title: qsTr("Collision 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: 50
MouseArea {
anchors.fill: parent
drag.target: root
drag.axis: Drag.YAxis
drag.minimumY: table.y
drag.maximumY: table.y + table.height - 50
}
}