Размещение стен / дорог в игре на основе сетки - PullRequest
3 голосов
/ 11 марта 2020

Я делаю игру на основе сетки.

В этой игре вы можете размещать здания, стены, дороги.

Когда что-то помещается в сетку, я присваиваю идентификатор ячейки этому идентификатору объекта. Пока все хорошо, все это работает.

Моя проблема возникает, когда мне нужно Битовая маска мои стены / дороги (размещенные с помощью перетаскивания мышью).

В настоящее время так, как я сделать битовую маску, я проверяю все соседние cells на соответствие и соответственно устанавливаю правильную модель. То есть, если есть совпадение на запад и север, я создаю изгиб.

Моя проблема возникает, когда я кладу стену поверх уже занятого cells. Я все еще хочу отобразить стену графически (окрашено красным), но я не могу перезаписать c то, что в данный момент находится в этом cell.

Это означает, что моя битовая маскировка не будет работать, потому что стена не находится в Фактически grid, это только в мировом пространстве.

Стены устанавливают ячейки на id 0, а дома устанавливают ячейки на id 1. Я не могу перезаписать идентификатор в домашней ячейке, поэтому битовая маскировка (правильно) в конечном итоге сломается.

Как можно управлять таким сценарием?

Ячейка:

public class Cell
{
    public int x, z;
    public int id;
    public GameObject go
}

1 Ответ

1 голос
/ 12 марта 2020

Вы можете добавлять слои в сетку и объединять только те ячейки, которые находятся на одном слое.

  • Дороги объединяются с дорогами.
  • Стены объединяются со стенами.

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

Вот некоторый псевдокод:

enum Layer {
  Building,
  Wall,
  Road
}

struct Point {
  int x,y;
}

class Cell {
  Point point;
  int value;
}

class Cells {
  Dictionary<Point, Cell> cells; // mapping position to the cell object

  Cells(int width, int height) {
    for x in width
      for y in height
        Point point = new Point(x,y);
        cells.Add(point, new Cell(point, default))
  }

  Cell Get(Point point) => cells[point];
}

class Grid {
  Dictionary<Layer, Cells> layers; // mapping the layer enum to the cells group object

  Grid(int width, int height) {
    foreach layer in Layer
      layers.Add(layer, new Cells(width, height));
  }

  Cells GetLayer(Layer layer) {
    return layers[layer]
  }

  int GetValue(Point point, Layer layer) {
    return GetLayer(layer).Get(point).value;
  }

  bool IsValueInAllLayers(Point point, int value) {
    foreach layer in Layers
      if layer.Get(point).value != value
        return false;
    return true;
  }
}

// program entry point
void Main() {
  // construct a 10x10 grid
  Grid grid = new Grid(10, 10);

  Point mousePoint = new Point(2,2);

  // to place a building all layers have to be empty (0)
  if(grid.IsValueInAllLayers(mousePoint, 0)) {
    grid.SetValue(mousePoint, Layer.Building);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...