Qml 向对象传递指针/引用
我正在写一个简单的游戏,其中我有Qml 向对象传递指针/引用,qml,qt5,qtquick2,Qml,Qt5,Qtquick2,我正在写一个简单的游戏,其中我有玩家对象和敌人对象。我想敌人追击玩家,但我不知道将当前玩家的位置传递给敌人的正确方法是什么 P> >我是一个C++开发者,所以我自然想到把玩家(可能是一个接口)到敌人>代码>,但是我在QML中找不到任何线索。 那我该怎么做呢?广告提到: JavaScript表达式允许QML代码包含应用程序逻辑 此外: QML提供了一种高度可读、声明性、类似JSON的语法,支持命令式JavaScript表达式和动态属性绑定 因为在QML环境中,你没有指针的概念,除非你把你的逻辑推到
玩家
对象和敌人
对象。我想敌人
追击玩家
,但我不知道将当前玩家
的位置传递给敌人的正确方法是什么
P> >我是一个C++开发者,所以我自然想到把<代码>玩家<代码>(可能是一个接口)到<代码>敌人>代码>,但是我在QML中找不到任何线索。
那我该怎么做呢?广告提到:
JavaScript表达式允许QML代码包含应用程序逻辑
此外:
QML提供了一种高度可读、声明性、类似JSON的语法,支持命令式JavaScript表达式和动态属性绑定
因为在QML环境中,你没有指针的概念,除非你把你的逻辑推到引擎盖下面,用C++来写。
无论如何,JavaScript中的几乎所有内容都是通过引用传递的(对于您的情况来说,这是一个可以接受的简化,也有一些例外,如原语值和不可变对象)
因此,您可以简单地让A
的实例引用B
的实例,方法是将其传递到构造函数中,或者通过setter或其他方法进行设置(确实有很多替代解决方案)
请记住,JavaScript和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
}
// 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
}
另一种方法是将玩家
组件传递给敌人
组件。但是你有一点耦合。这也许是你所指出的C++思想。<
// 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
}
// 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
}
谢谢你的回答,它澄清了很多。我只是通过C++的棱镜来查看QML,我尝试应用相同的解决方案。我需要的是了解QML是如何完成这些事情的。如果您发现回复没有完全回答您的问题,请告诉我如何改进。我很乐意这样做。您应该添加一些代码或片段,以说明您的结构类型。但一般来说,在QML中,理想的方法是简单地绑定属性:所以这里敌人可以有目标坐标,你可以将其绑定到玩家的坐标,而敌人甚至不需要知道玩家是什么。