Как найти индекс объекта в списке, значения позиций x и y которого соответствуют заданным x и y? - PullRequest
1 голос
/ 27 марта 2012

Я создаю игру, в которой используется система плиток.Каждая плитка - это объект, у которого есть Vector2 для своей позиции.У меня есть все плитки в списке.

У меня есть еще один фрагмент кода, который генерирует кучу Vector2, где деревья должны быть размещены в сетке плиток.Каждая позиция дерева находится в векторе Vector2 в списке.

. Мой вопрос: как мне найти индекс элемента мозаичного изображения, который точно соответствует его координатам в списке координат дерева?Как только я обнаружу, что могу затем сказать этому объекту плитки в списке, чтобы его логическое значение treePresent стало равным true.

gridPosition.X и gridPosition.Y плиток: 0 (1,9) 1 (1,10) 2 (2,1) 3 (2,2)

TreePosition.X и treePosition.Y деревьев: 0 (1,9) 1 (2,2)

Я мог бызатем скажите: tileList [0] .treePresent = true;TileList [3] .treePresent = TRUE;

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Игра, использующая систему тайлов, НЕ должна использовать динамическую систему (список) для отслеживания тайлов. Я предполагаю, что под «системой плиток» вы подразумеваете весь игровой мир / карту, разделенную на 2D сетку. Причина этого двоякая:

  1. Возможно, вы будете использовать больше памяти для хранения полной карты данных. Если в вашем мире ничего особенного не происходит, и вы в основном (на 80% и более) видите только пустую / фоновую плитку по умолчанию, то это правило может оказаться недействительным. Однако для всех случаев с разумным количеством данных (что я и предполагаю здесь) вы будете использовать больше памяти, поскольку вам нужно хранить тип плитки и координаты x & y, а не просто хранить тип плитки.
  2. Динамическая структура данных неэффективна. Таким образом, выборка данных плитки займет много времени, так как вам нужно пройтись по всему списку, чтобы найти конкретную плитку. Поэтому, если вы хотите использовать плитку (a, b), вы должны пройтись по всем вашим плиткам (остановившись, как только вы нашли правильную плитку), и сравнить каждую (x, y) каждой плитки с (a, b). Звучит не очень эффективно, правда?

Итак, решение простое: Сделайте 2D массив плиток. Первое измерение для ваших x-координат, второе для y.

Например: worldData [x] [y] (или эквивалентный язык на ваш выбор). Таким образом, найти плитку довольно быстро. Здесь, если я хочу плитку (a, b), я просто вызываю worldData [a] [b]. Никаких циклов или сравнений не требуется.

Есть вопросы?

2 голосов
/ 27 марта 2012

Вы также можете составить 2 тусклый список и ссылаться на плитку только по положению дерева.Если вы не меняете размер сетки, вам не нужно использовать динамический список, а вместо этого можно создать двумерный массив

2 голосов
/ 27 марта 2012

Попробуйте

tileList.Where(t => treeList.Contains(t.Position));

Если вы перемещаете вещи, имейте в виду, что это можно сравнить с равенством чисел с плавающей точкой, которое может вызвать проблемы.

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