将 pointer/reference 传递给对象
Passing pointer/reference to object
我正在编写一个简单的游戏,其中我有 Player
个对象和 Enemy
个对象。我希望 Enemy
追求 Player
但我不知道将当前 Player
的位置传递给 Enemy
的正确方法是什么。
天生我是一名 C++ 开发人员,所以我很自然地考虑将 Player
(可能作为接口)传递给 Enemy
,但我在 QML 中找不到关于这种方法的任何线索。
那我该怎么办?
提及广告 here:
JavaScript expressions allow QML code to contain application logic.
此外:
QML offers a highly readable, declarative, JSON-like syntax with support for imperative JavaScript expressions combined with dynamic property bindings.
正因为如此,您在 QML 环境中没有指针的概念,除非您将逻辑推到幕后,用 C++ 编写。
无论如何,JavaScript 中的几乎所有内容都是通过引用传递的(这是对您的情况有效的可接受的简化,也有一些例外,例如原始值和不可变对象)。
因此,您可以简单地让 A
的实例引用 B
的实例,方法是将其传递给 构造函数 或通过 setter 或其他方式设置它(确实有很多替代解决方案)。
请记住,在 JavaScript 和 QML 中都没有对 interfaces 的明确支持,所以你不能依赖它们,即使你可以模拟它们(从我的角度来看,这是不值得的)。
如何解决您的具体问题?
嗯,这取决于你的实际代码和软件架构,所以我不能这么说,对不起。希望以上提示对您有所帮助。
嗯,最好的方法是使用 属性 绑定,就像 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
}
我正在编写一个简单的游戏,其中我有 Player
个对象和 Enemy
个对象。我希望 Enemy
追求 Player
但我不知道将当前 Player
的位置传递给 Enemy
的正确方法是什么。
天生我是一名 C++ 开发人员,所以我很自然地考虑将 Player
(可能作为接口)传递给 Enemy
,但我在 QML 中找不到关于这种方法的任何线索。
那我该怎么办?
提及广告 here:
JavaScript expressions allow QML code to contain application logic.
此外:
QML offers a highly readable, declarative, JSON-like syntax with support for imperative JavaScript expressions combined with dynamic property bindings.
正因为如此,您在 QML 环境中没有指针的概念,除非您将逻辑推到幕后,用 C++ 编写。
无论如何,JavaScript 中的几乎所有内容都是通过引用传递的(这是对您的情况有效的可接受的简化,也有一些例外,例如原始值和不可变对象)。
因此,您可以简单地让 A
的实例引用 B
的实例,方法是将其传递给 构造函数 或通过 setter 或其他方式设置它(确实有很多替代解决方案)。
请记住,在 JavaScript 和 QML 中都没有对 interfaces 的明确支持,所以你不能依赖它们,即使你可以模拟它们(从我的角度来看,这是不值得的)。
如何解决您的具体问题? 嗯,这取决于你的实际代码和软件架构,所以我不能这么说,对不起。希望以上提示对您有所帮助。
嗯,最好的方法是使用 属性 绑定,就像 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
}