我正在编写一个简单的游戏,其中有Player
对象和Enemy
对象。我希望Enemy
追求Player
,但我不知道将当前Player
的位置传递给Enemy
的正确方式是什么。
我本来是一个C++开发人员,所以我很自然地想把Player
(可能是一个接口)传递给Enemy
,但我在QML中找不到任何关于这种方法的线索。
那我该怎么做呢?
好吧,最好的方法是使用hyde
已经指出的属性绑定。
// Enemy.qml
Item {
property int targetX
property int targetY
// more code
}
// Player.qml
Item {
property int currentPosX
property int currentPosY
}
// Main.qml
Enemy {
id: enemy
targetX: player.currentPosX
targetY: player.currentPosY
}
Player {
id: player
// Some calculation for the current x and y position
}
另一种方法是将Player
分量传递给Enemy
分量。但是比你有一点耦合。这也许就是您所指出的C++思想。
// Enemy.qml
Item {
id: enemy
property Item myPlayer
Component.onCompleted: {
console.log(enemy.myPlayer.currentPosX +
" | " +
enemy.myPlayer.currentPosY)
}
}
// Player.qml
Item {
property int currentPosX
property int currentPosY
}
// Main.qml
Enemy {
id: enemy
myPlayer: player
}
Player {
id: player
// Some calculation for the current x and y position
}
此处提到的广告:
JavaScript表达式允许QML代码包含应用程序逻辑。
此外:
QML提供了一种可读性强、声明性强、类似JSON的语法,支持结合动态属性绑定的命令式JavaScript表达式。
正因为如此,您在QML环境中没有指针的概念,除非您将逻辑隐藏起来,用C++编写它。
无论如何,JavaScript中的几乎所有内容都是通过引用传递的(这是一种可接受的简化,对您的情况有效,也有一些例外,如基元值和不可变对象)。
因此,您可以简单地让A
的实例引用B
的实例,方法是将其传递到构造函数中,或者通过setter或其他方式进行设置(确实有很多替代解决方案)。
请记住,无论是在JavaScript中还是在QML中,都没有对接口的明确支持,因此即使可以模拟它们,也不能依赖它们(从我的角度来看,这不值得)。
如何解决您的具体问题?好吧,这取决于你的实际代码和软件架构,所以我不能这么说,对不起。我希望上面的一个提示对你有任何帮助。