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中,理想的方法是简单地绑定属性:所以这里敌人可以有目标坐标,你可以将其绑定到玩家的坐标,而敌人甚至不需要知道玩家是什么。