Продолжаю осваивать изометрию, гуглил несколько дней, искал готовые движки и тьюториалы для старлинга, все что находится, производит грустное впечатление. Есть isoHill, есть многочисленные заброшенные порты as3isoLib, большинство из которых даже не компилируются, нет нужного мне функционала, и годится только на то, чтобы посмотреть как делают другие. Ну это лирика, теперь ближе к делу. Вопрос с которым я столкнулся, и по которому хотелось бы узнать мнение опытных товарищей, заключается в оптимизации скроллинга большой изометрической карты. И насколько вообще реально на флеше делать большие изометрические карты (например 1000 х 1000 тайлов). Из всего что я нашел, можно выделить 2 подхода:
1. Описан в книге Juwal Bose Starling Game Development Essentials. Тайлы перебираются из, допустим JSON описания карты и рисуются в одну большую текстуру, привожу предельно краткий кусок кода, функция инициализации карты (тут только бекграунд, 1 слой):
Код AS3:
private function init(e:Event = null):void
{
this.removeEventListener(Event.ADDED_TO_STAGE, init);
_texAtlas = IsoTest.assets.getTextureAtlas('isotiles');
//_rTex = new RenderTexture(stage.stageWidth, stage.stageHeight);
_rTex = new RenderTexture(TILE_WIDTH * WORLD_WIDTH, TILE_WIDTH * WORLD_WIDTH);
_rTexImage = new Image(_rTex);
addChild(_rTexImage);
_screenOffset = new Point(stage.stageWidth / 2, 0);
var img:Image;
var pt:Point = new Point();
for(var i:int=0; i < WORLD_WIDTH; i++)
{
for(var j:int=0; j < WORLD_WIDTH; j++)
{
img = new Image(_texAtlas.getTexture('tiles0001'));
pt.x = j * TILE_WIDTH;
pt.y = i * TILE_WIDTH;
pt = IsoHelper.cartToIso(pt);
img.x = pt.x + _screenOffset.x;
img.y = pt.y + _screenOffset.y;
_rTex.draw(img);
}
}
trace("_rTexImage.width = " + _rTexImage.width + " _rTexImage.height = " + _rTexImage.height);
_rTexImage.addEventListener(TouchEvent.TOUCH, onTouch);
}
Получившуюся текстуру драгать мышкой не проблема, но этот подход сразу упирается в максимальный размер тестуры допустимый старлингом (2048х2048) т.е. карту больше сделать не получится. Если же вводить оффсет по движению мыши и по нему перерисовывать карту, то меня пугает скорость этого процесса, при старте флешки, карта размером 50х50 тайлов у меня инициализируется несколько секунд и такие лаги при драге непримелимы.
2. Этот подход я подсмотрел в этом
тьюториале Карта состоит из тайлов (т.е. в отличие от предыдущего метода, здесь каждый тайл это отдельный объект), которые храняться в обжект пуле, и подсовываются по мере движения персонажа по карте. Я подозреваю что это единственый способ отрисовки крупных карт на флеше, но возникает вопрос насколько он производительный, для больших и сложных карт и фулскрина? Смущают размеры демки, к этому тьюториалу
http://murdochcarpenter.com/clients/...starling/demo/
В идеале конечно хотелось бы совместить лучшее из этих двух подходов, в принципе есть идеи как это сделать (можно, допустим, отрисовывать карту кусками во весь экран как в подходе 1, и тайлить при переходе перса с экрана на экран), хотя конечно реализовать это будет сложно. Но в любом случае, прежде чем приступать к работе, хотелось бы услышать ваше мнение, возможно у кого то есть ссылки на рабочие либы, и т.д.