Нужен способ, чтобы два отдельных кинетических объекта «общались» друг с другом в Javascript

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Допустим, у меня есть два объекта, программно сгенерированных с использованием трехмерного массива координат. Первым измерением является таблица «grid», вторым измерением является «строка» сетки, а третьим измерением является расположение столбца в этой строке. (Я упоминаю способ настройки массива только для любой информации, которая может оказаться полезной).

Используя цикл for и стандартные методы генерации регулярных полигонов с использованием библиотеки Kinetic, я создаю несколько треугольников в визуальной сетке. Каждый треугольник — это свой собственный объект, который я хочу анимировать независимо.

Моя проблема в следующем: если я хочу привязать анимацию к соседнему треугольнику, я не уверен в том, как указать, какие треугольники являются соседями треугольника ‘origin’ (без потенциального создания атрибута ‘grid ID’ внутри каждого объекта triangle и перекрестных ссылок с использованием собственного grid ID треугольника), а затем, как только объекты будут идентифицированы, переместите анимацию tween к его соседям.

Каждый треугольник имеет точно такое же имя в ссылке на память, поэтому вызов дочерней атрибутивной функции x triangle не будет работать, мне нужен способ получить объект по идентификатору или какому-либо другому атрибуту и заставить этот объект запустить свою функцию.

Вот пример одного из объектов Kinetic js:

             var tri = new Kinetic.RegularPolygon({
                x: x,
                y: y,
                sides: 3,
                radius: 15,
                rotation: z,
                fillRed: 17,
                fillGreen: 17,
                fillBlue: 17,
                closed: true,
                shadowColor: '#5febff',
                shadowBlur: 5,
                shadowOpacity: 0.18
            });
  

Я создаю сетку из отдельного массива следующим образом:

         function createTri(x, y, z) {
            var tri = new Kinetic.RegularPolygon({
                x: x,
                y: y,
                sides: 3,
                radius: 15,
                rotation: z,
                fillRed: 17,
                fillGreen: 17,
                fillBlue: 17,
                closed: true,
                shadowColor: '#5febff',
                shadowBlur: 5,
                shadowOpacity: 0.18
            });


            layer.add(tri);

        }

        for (var i = 0; i < pax.length; i  ){
            for (var j = 0; j < pax[i].length; j  ){
                createTri(pax[i][j][0],pax[i][j][1],pax[i][j][2]); //Reads the two coordinates and the orientation located in the grid based on index location and then calls the function createTri to create each triangle in the grid.
            };
        }
  

Если мне нужно будет подробнее объяснить свои намерения, я с радостью поясню.

Ответ №1:

Вы могли бы использовать simple.js и создавать объекты с отношениями, которые связывают их друг с другом.

например

 var Triangle = Simple.Model = function(options) {
  // add any attributes
  this.attributes = this.defaults || {};
}
  

И когда вы вызываете createTri,

 var tri = new Kinetic.RegularPolygon({ ... });

var obj = new Triangle();
obj.polygon = tri;
obj.neighbors = [];
  

Это просто подход, который я бы рассмотрел. Упрощает расширение, если вы хотите добавить больше функциональности объектам.

Комментарии:

1. Может сработать, но есть ли какая-нибудь известная вам функция, что-то вроде ‘getObjectByAttributeValue()’? (что-то вроде getElementById()), который затем позволил бы мне вызвать что-то вроде: getObjectByAttributeValue(valueCrossReference).callфункция?

2. Если вы имеете в виду HTML-элемент, да .

3. Я не имел в виду использование HTML… Я использовал getElementById в качестве аллегорической ссылки на то, что я пытаюсь сделать

4. Я имею в виду, что вы можете создавать структуры для поиска внутри simple.js Я не совсем уверен, о чем вы спрашиваете.