PDA

Просмотр полной версии : сетка ячеек


olejan1991
12.03.2013, 13:41
Нужно создать приложение "карта", которая будет состоять из ячеек, расположенных в виде сетки с возможность их добавления или удаления, данные хранить в XML, должна быть возможность сохранения изменений. Вот я, собственно не понять как реализовать эту саму сетку.Как-то цыкл for не совсем, мне кажется, подходит. Посетив множество страниц в интернете пришла такая идея: редактируемую сетку можно сделать используя grid и mxml? Правильно ли это, учитывая задание? Удобно ли это,учитывая задание?

iflamberg
12.03.2013, 14:17
Цыкл for, по-моему, очень даже =)

olejan1991
12.03.2013, 14:28
Это получается один цикл for будет вложен в другой?

GBee
12.03.2013, 14:41
Как сделаете :о) Можно и рекурсией, можно и одним циклом с дополнительным счетчиком. Но вам проще вложенным. А что на карте то изображено?

iflamberg
12.03.2013, 14:41
Конечно.
Нет, конечно, вы можете и grid использовать, если умеете. Только програмно создавать ячейки для grid'а не чуть не легче, чем пройтись for'ом и нарисовать сетку спрайтов.
Но, если вы делаете, что-то типа редактора карты для игрушки, то в целом, с помощью flex'а удобно интерфейс редактора закодить.

olejan1991
12.03.2013, 14:55
Как сделаете :о) Можно и рекурсией, можно и одним циклом с дополнительным счетчиком. Но вам проще вложенным. А что на карте то изображено?
))) ячейки будут разных типов(земля,вода,песок) и на определенные типы можно будет высаживать определенные растения))) как-то так...

GBee
12.03.2013, 15:28
Тогда точно во флексе не надо. При больших размерах грид будет тормозить. Лучше ужа на спрайтике отрисовать.

iflamberg
12.03.2013, 15:56
Я себе редакторы карт во флексе делаю. Кидаю канвас, на него спрайт, в спрайте карта. Сверху менюха - сохранить/загрузить - все дела. Снизу, скажем, горизонтальный таб навигатор с элементиками, таскаемыми drag'n'drop-ом. Интерфейсики в флексе накидывать - удовольствие.

GBee
12.03.2013, 16:01
Ну если грамотно подходить, то флекс для админок самое то. Но использовать их датагрид для больших карт - как минимум неудобно.

iflamberg
12.03.2013, 16:04
а я датагрид и не использую в самой карте. Канвас, в канвасе чистый as3.

olejan1991
12.03.2013, 20:09
Я человек с никаким опытом, Лучше ужа на спрайтике отрисовать. это значит с использованием циклов?

iflamberg
12.03.2013, 20:23
Мне кажется, что если вы "человек с никаким опытом" и для вас тяжеловато решить такую задачу, как отрисовать сетку из квадратных тайлов, то с такой задачей, как "ячейки будут разных типов(земля,вода,песок) и на определенные типы можно будет высаживать определенные растения)))" вы не справитесь. Все равно, что отправиться в поход по горам в шлепанцах, гавайке и пустым рюкзаком за плечами.

olejan1991
13.03.2013, 00:51
package
{
import flash.display.*;

public class VirtualMap extends Sprite
{

private var heightMap:uint = 2;
private var widthMap:uint = 3;
public function VirtualMap()
{
for(var i:int = 0; i < heightMap; i++)
{
for(var j:int = 0; j < widthMap; j++)
{
var displayCell:Sprite = new Sprite();
displayCell.graphics.lineStyle(1, 0x000000);
displayCell.graphics.drawRect(99 * j, 99 * i, 99, 99);
addChild(displayCell);
}

}

}




}
}

Добавлено через 2 минуты
для вас тяжеловато решить такую задачу, как отрисовать сетку из квадратных тайлов. Может мне кажется, но по-моему на старте всегда тяжеловато...

Добавлено через 2 минуты
Даже с элементарными вещами

GBee
13.03.2013, 01:29
Угу - то что надо, размер клетки - тоже в константы. Ну и сама клетка может быть отдельным классом.

olejan1991
13.03.2013, 01:41
Ну и сама клетка может быть отдельным классом.
Вот как раз сейчас и думаю об этом. Может глупость скажу: в отдельном классе должно реализовываться то, что во внутреннем цикле for? Я правильно понимаю?

iflamberg
13.03.2013, 02:32
Ну, не спорю, такая учебная задача по большому счету ничем не отличается от любой другой. Я ни в коем случае не хотел вам нагрубить. Надо было расширить свой пост. Я хотел сказать, что лучше быть последовательным, начать с изучения языка, структур данных, классических приемов.
В любом случае я рад за вас, что вы самостоятельно справились с задачей и с удовольствием помогу вам, если у вас будут конкретные вопросы или ошибки в коде.

"в отдельном классе должно реализовываться то, что во внутреннем цикле for?" - да, именно так. Обычно это удобно.

olejan1991
13.03.2013, 22:09
Не могу понять. Делаю вот так

class VirtualMap
package
{
import flash.display.*;

import map.*;

public class VirtualMap extends Sprite
{

private var heightMap:uint = 2;
private var widthMap:uint = 3;


public function VirtualMap2()
{
// Выводим сетку ячеек
for(var i:int = 0; i < heightMap; i++)
{
for(var j:int = 0; j < widthMap; j++)
{
var cellMap:Sprite = new Sprite();
var displayCell:CellMap = new CellMap(j, i, cellMap);
addChild(displayCell);
}
}

}
}
}


class CellMap

package map
{
import flash.display.*;

public class CellMap extends Sprite
{
public function CellMap(j:uint, i:uint, cellMap:Sprite)
{
cellMap.graphics.lineStyle(1, 0x000000);
cellMap.graphics.drawRect(99 * j, 99 * i, 99, 99);
}
}
}

И оно ничего не выводит...

GBee
13.03.2013, 22:25
так рисуете вы на переданном спрайте, а добавляете свой. Странную вы схему придумали.

olejan1991
13.03.2013, 22:32
Переделал, работает

package
{
import flash.display.*;

import map.*;

public class VirtualMap extends Sprite
{

private var heightMap:uint = 2;
private var widthMap:uint = 3;


public function VirtualMap2()
{
// Выводим сетку ячеек
for(var i:int = 0; i < heightMap; i++)
{
for(var j:int = 0; j < widthMap; j++)
{
var cellMap:Sprite = new Sprite();
new CellMap(j, i, cellMap);
addChild(cellMap);
}
}

}
}
}

package map
{
import flash.display.*;

public class CellMap extends Sprite
{
public function CellMap(j:uint, i:uint, cellMap:Sprite)
{
cellMap.graphics.lineStyle(1, 0x000000);
cellMap.graphics.drawRect(99 * j, 99 * i, 99, 99);
}
}
}

но кажется мне, что не так оно должно быть...

GBee
13.03.2013, 22:49
Вы подумайте, что вы делаете? У вас есть варианты, я вижу как минимум 2:
1) У вас есть массив описаний клеток (х,у,тип), бегать по нему и по полученной инфе рисовать все в один спрайт.
2) У вас есть массив готовых клеток нужного типа (или подкласса от основного класса клетка). Бежим и все подряд добавляем в главный спрайт. Здесь надо какую-нить фабрику придумать.

olejan1991
13.03.2013, 23:15
Кстати говоря, информация по ячейкам и объектам хранится в придуманном XML


<?xml version="1.0" encoding="UTF-8"?>
<MAP WIDTH="3" HEIGHT="2">
<CELL ID="0" TYPE-CELL="land">
<OBJECT TYPE-OBJECT="tree"></OBJECT>
</CELL>
<CELL ID="1" TYPE-CELL="water">
<OBJECT TYPE-OBJECT="fish"></OBJECT>
</CELL>
<CELL ID="2" TYPE-CELL="water">
<OBJECT TYPE-OBJECT="weed"></OBJECT>
</CELL>
<CELL ID="3" TYPE-CELL="land">
<OBJECT TYPE-OBJECT="tree"></OBJECT>
</CELL>
<CELL ID="4" TYPE-CELL="land">
<OBJECT TYPE-OBJECT="flower"></OBJECT>
</CELL>
<CELL ID="5" TYPE-CELL="grass">
<OBJECT TYPE-OBJECT="tree"></OBJECT>
</CELL>
</MAP>

Wolsh
14.03.2013, 03:17
CellMap должен просто отрисовывать квадрат, в СВОИХ нулевых координатах. Он сам — Спрайт, зачем создавать еще один спрайт, потом создавать спрайт CellMap только чтобы отрисовать что-то в первом спрайте?.. Циклом создаете клетки (как отдельные объекты) и размещаете их в контейнере в координатах, соответствующих позиции цикла. То есть классу CellMap вообще никаких параметров отдавать не надо было. Это спрайт, который умеет СЕБЯ закрашивать.
Вот если хотите, можно отдавать ему Тип клетки (TYPE-CELL), и пусть закрашивает себя водой или сеном, как прикажут.
О фабрике пока рано говорить, мне кажется. С абстрактным делением задач по классам бы разобраться для начала..