Я создаю RPG на основе плиток 2D в XNA и нахожусь на начальной стадии проектирования. Я думал о том, как я хочу, чтобы мой плиточный двигатель работал, и придумал набросок. По сути, я хочу сетку плиток, но в каждом местоположении я хочу добавить несколько плиток и иметь смещение. Мне бы хотелось, чтобы я мог добавить что-то вроде отдельных деревьев на карте мира, чтобы придать больше блеска. Или поставьте бутылки на бар в каком-нибудь городе, не тяня за собой кучу разных плиток с разными бутылками.
Но, возможно, моя досягаемость больше, чем моя хватка. Я пошел, чтобы реализовать идею, и у меня было что-то вроде этого в моем объекте карты:
List<Tile>[,] Grid;
Но потом я подумал об этом. Допустим, у меня была карта мира 200х200, которая на самом деле была бы довольно маленькой, если говорить о РПГ. Это составит 40 000 списков. Я думаю, что должен быть лучший путь. Теперь это предварительная оптимизация. Я не знаю, удастся ли мне с этим справиться, если бы я спроектировал свои карты и игру, но это кажется неоправданно неэффективным, и что-то может всплыть, если моя игра станет более сложной.
У меня есть идея сделать смещение и несколько плиток необязательными, чтобы я платил за них только при необходимости. Но я не уверен, как бы я это сделал. Несколько массив объектов?
object[,] Grid;
Итак, вот мои критерии:
- 2D сетка местоположений плитки
- Каждая ячейка имеет минимум 1 плитку, но дополнительно может иметь больше
- Каждая дополнительная плитка может иметь смещение по осям X и Y для точного размещения
Может ли кто-нибудь помочь с некоторыми идеями для реализации такого дизайна (не нужно, чтобы это было сделано для меня, просто идеи) при минимальном использовании памяти?
Если вам нужно больше фона, примерно то, что составляют мои объекты Map и Tile:
public struct Map
{
public Texture2D Texture;
public List<Rectangle> Sources; //Source Rectangles for where in Texture to get the sprite
public List<Tile>[,] Grid;
}
public struct Tile
{
public int Index; //Where in Sources to find the source Rectangle
public int X, Y; //Optional offsets
}