Хранение объектов в 2-мерной спрайтовой матрице в C ++ - PullRequest
0 голосов
/ 28 апреля 2018

Я хочу сохранить список тайлов (указателей на объекты класса "Sprite") в двухмерном векторе.

В настоящее время я храню все спрайты моей карты тайлов в векторе.

std::vector<Sprite*> _tiles;

Теперь мне нужно собрать все соседние тайлы, и я подумал, что будет проще хранить свои спрайты в 2-мерной матрице (вектор в векторе) для выполнения этих вычислений.

Но я не могу понять, как это сделать.

Заголовок:

private:
  std::vector<std::vector<Sprite*>> matrix;

C ++ Файл:

vectorMatrix::vectorMatrix(int columns, int rows) { }

vectorMatrix::~vectorMatrix() { } 


void vectorMatrix::addCellAt(int x, int y, Sprite* sprite) {
  std::vector< std::vector<Sprite*> > matrix;
  matrix[x][y].push_back(sprite);
}

Но я получаю сообщение об ошибке, если использую два оператора индекса.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Почему вы считаете хорошей идеей сделать вашу матрицу вектором векторов? Правда, это будет «работать» в том смысле, что vec_of_vec_matrix[i][j] вернет правильную вещь, но это несколько громоздко и неэффективно.

Вместо этого, рассмотрите возможность создания своего класса на одном векторе - всех данных, как это сделано в этом ответе (и, вероятно, во многих библиотеках). Элемент доступа будет что-то вроде (для основных данных столбца):

Sprite*& Matrix::operator()(size_t i, size_t j)
{
    return mData[i * num_columns + j];
}

Вы можете даже договориться с map[x][y] для работы, используя прокси-класс строки.

0 голосов
/ 28 апреля 2018
std::vector< std::vector<Sprite*> > matrix;

Это пустой std :: vector из std :: vector, и, как уже отмечали другие, это больше не матрица элементов данных.

Так как он пуст, невозможно сделать matrix[0] - получить первую строку, matrix[1] - получить вторую строку ... Однако вы можете сначала указать размер матрицы в конструкторе - например, Это даст вам rows*columns матрицу

vectorMatrix::vectorMatrix(int columns, int rows) 
  : matrix(rows, std::vector<Sprite*>(columns))
{
}

И затем вы можете установить x-й и y-й элемент в соответствующие Sprite*, и, конечно, x и y должны быть меньше, чем rows и columns

matrix[x][y] = sprite;

И не объявляйте matrix снова внутри addCellAt. Вы можете использовать элементы данных непосредственно в любом месте внутри класса.

0 голосов
/ 28 апреля 2018

Три проблемы:

  1. Вы объявляете локальную переменную matrix внутри функции, которая скрывает переменную-член.
  2. Если размер векторов не установлен для включения индексов x и y, то вы выйдете за пределы.
  3. matrix[x][y] сам по себе не является вектором, это элемент, который можно назначить напрямую:

    matrix[x][y] = sprite;
    

    Не забудьте рассмотреть проблему 2, прежде чем делать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...