2011-12-21 2 views
0

Я пытаюсь улучшить рендеринг своей игры путем массового рендеринга текстур блоков того же типа.Как сопоставить тип класса со списком?

Каждый блок в моей игре определяется классом в формате BlockWood, что все расширить из класса Блок.

В настоящее время у меня есть карта между различными блочными классами/типами и ArrayList, которая содержит позиции всех блоков этого типа на карте.

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

Этот подход, однако, не работает. Я хочу, чтобы иметь возможность получить доступ к ArrayList, используя класс манекен как это -

blockMap.get(BlockWood.class); 

Есть ли эффективный способ, которым я могу сопоставить тип класса к ArrayList? Или мне просто нужно отобразить представления строк класса?

ответ

1

Вы хотите использовать Class как тип ключа. Ваша текущая реализация использует экземпляр Block в качестве ключа. В случае использования Class в качестве ключа будет использоваться тип Block.

+0

ли это быть более или менее эффективным, чем только с помощью строки? – liamzebedee

+0

@ LiamE-p: Не знаю, но вы можете проверить это. Одно из преимуществ 'Class' над' String' заключается в том, что набор строк намного больше, чем набор классов, которые реализуют 'Block'. Поэтому 'String' оставляет вас более открытым для использования ключа, который не имеет значения. – unholysampler

1

Ваша карта не находится между классом и списком. Он отображает экземпляр Block в список. Таким образом, вам всегда нужно использовать экземпляр Block для доступа к его спискам.

blockMap.get(new BlockWood());

Вопрос лишь в том, что вы получите? Вы получите список, который ранее был сохранен на этой карте, используя этот ключ.

BTW, чтобы улучшить ваш код изменить определение карты для:

Map<Block, List<Vector2f>> blockMap = new HashMap<Block, List<Vector2f>>();

Теперь вы можете использовать любой тип списка.

-1

Проблема заключается в том, что карта имеет два значения (ключ и значение), а в списке только одно значение (элемент).

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

для получения списка всех ключей, вы можете сделать

ArrayList<Block> keys = new ArrayList<Block>(blockMap.keySet()); 

для получения списка всех значений, вы можете сделать

ArrayList<ArrayList<Vector2f>> values = new ArrayList<ArrayList<Vector2f>>(blockMap.values());