Как я могу однозначно идентифицировать игровой объект на сцене? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь добавить объекты интерактивных изображений на сцену из массива объектов, полученных из JSON.

Например, у меня есть этот JSON:

{
  "graph": {
    "nodes": [
      {"name":"Catharsis", "type":"city",    "x":500, "y":200},
      {"name":"Arrakeen",  "type":"city",    "x":300, "y":400},
      {"name":"Mine_1",    "type":"facility","x":150, "y":450},
      {"name":"Belgorod",  "type":"city",    "x":700, "y":500}
    ],
    "paths": [
      {"from":"Arrakeen", "to":"Belgorod"},
      {"from":"Arrakeen", "to":"Mine_1"},
      {"from":"Arrakeen", "to":"Catharsis"}
    ]
  }
}

Узлы - это местоположения, такие как города и объекты. Этот JSON загружается как объект JS в mapData

Затем этот JS рисует объекты в сцене:

preload(){
  this.load.image('city','img/locations/city.png');
  this.load.image('facility','img/locations/facility.png');
}

create(){
  mapData.graph.paths.forEach(path => {
    var nodesFrom = mapData.graph.nodes
      .find(node => {
        return node.name == path.from
      }, path);
    var nodesTo = mapData.graph.nodes
      .find(node => {
        return node.name == path.to
      }, path);
    this.add.line(0, 0, nodesFrom.x, nodesFrom.y, nodesTo.x, nodesTo.y, 0x000000, 1)
      .setOrigin(0, 0);
  }, this);
  mapData.graph.nodes.forEach(node => {
    this.add.image(node.x,node.y,node.type)
      .setInteractive()
      .setScale(0.2);
    this.add.text(node.x,node.y,node.name,{fontSize:20,color:'#000'})
      .setOrigin(0.5, 0.3);
    this.input.on('gameobjectdown',this.onObjectClicked);
  }, this);
}

И вот результирующая сцена: map scene

Но я хочу показать контекстное меню действий при нажатии на один из городов или объектов. Со списком пунктов меню сформирован условно. Например, Move to [city.name] и т. Д. Но теперь все интерактивные объекты отправляют события щелчка при нажатии, поэтому мне нужно как-то однозначно идентифицировать добавленные изображения. Может быть, добавить ключ, равный имени узла, но как? И как это потом читать?

1 Ответ

0 голосов
/ 11 июня 2019

Благодаря Samme с форума Phaser 3 у нас есть решение:

this.add.image(node.x, node.y, node.type)
  .setName(node.name)

..., к которому можно получить доступ следующим образом: gameObject.name

...