将 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   
}