Реализация 2D матрицы - PullRequest
       22

Реализация 2D матрицы

0 голосов
/ 07 ноября 2018

Каждая сущность в моей игре имеет объект Tag, и должен быть путь к Добавить и Удалить collisions между Tag.

Это мой код:

public final class CollisionMatrix {

    // TODO: Longs have at most 64 bits, so the current implementation fails
    // when there are more than 64 tags.
    private Map<Integer, Long> matrix = new HashMap<Integer, Long>();

    public CollisionMatrix add(Tag tag1, Tag tag2) {
        int id1 = tag1.id;
        int id2 = tag2.id;
        matrix.put(id1, matrix.getOrDefault(id1, 0L) | (1 << id2));
        matrix.put(id2, matrix.getOrDefault(id2, 0L) | (1 << id1));
        return this;
    }

    public CollisionMatrix remove(Tag tag1, Tag tag2) {
        int id1 = tag1.id;
        int id2 = tag2.id;
        matrix.put(id1, matrix.getOrDefault(id1, 0L) & ~(1 << id2));
        matrix.put(id2, matrix.getOrDefault(id2, 0L) & ~(1 << id1));    
        return this;
    }

    public boolean collidesWith(Tag tag1, Tag tag2) {
        return 0 != (matrix.getOrDefault(tag1.id, 0L) & (1 << tag2.id));
    }

}

Это очень уродливая реализация того, чего я пытаюсь достичь. Но это работает (если количество тегов не более 64).

Я ищу решение, которое должно быть эффективным, а не анти-паттерном.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Tag может иметь список тегов, которые указывают на столкновение:

   public void add(Tag tag1, Tag tag2) {
        tag1.collisions.Add(tag2);
        tag2.collisions.Add(tag1);
    }

    public void remove(Tag tag1, Tag tag2) {
      if (collidesWith(tag1,tag2)) {
        tag1.collisions.remove(tag2);
        tag2.collisions.remove(tag1);
      }  
    }

    public boolean collidesWith(Tag tag1, Tag tag2) {
        if (tag1.collisions.Contains(tag2) && tag2.collisions.Contains(tag1)) {
           return true;
        }
        return false;
    }
0 голосов
/ 07 ноября 2018

Интересно, это только у меня или битовые операторы очень неразборчивы? На самом деле я никогда не использовал их и не видел их.

К теме: как насчет простого двумерного симметричного массива, в котором хранятся логические значения? array [x] [y] представляет, сталкивается ли x с y (это могут быть идентификаторы двух объектов, если они не случайны и начинаются с 0).

Почему-то у меня такое чувство, что ты слишком стараешься быть умным там. У меня никогда не было идеи представлять массив логических значений как длинных, и я предполагаю, что это то, что вы пытаетесь сделать там.

...