将指针/引用传递到对象



我正在编写一个简单的游戏,其中有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中,都没有对接口的明确支持,因此即使可以模拟它们,也不能依赖它们(从我的角度来看,这不值得)。

如何解决您的具体问题?好吧,这取决于你的实际代码和软件架构,所以我不能这么说,对不起。我希望上面的一个提示对你有任何帮助。

相关内容

  • 没有找到相关文章

最新更新