Обтекание Flash / AS3 Sprite в качестве компонента Flex MXML - PullRequest
1 голос
/ 10 января 2011

Для моей игры я делаю основной вид игры в виде простого класса Flash / AS3, что-то вроде:

public class GameArena extends Sprite

Это просто большой прямоугольник, в котором нарисованы игровые объекты, поэтому нет необходимостидля причудливого интерфейса и я хочу оставить основной игровой движок Flex-free, чтобы я мог использовать Sprites, а не более тяжелые компоненты Flex.

Однако для всей игры / приложения я все еще хочу использовать Flex для GUI /раскладка.Поэтому я подумал, что могу создать подкласс класса Flex UIComponent, у которого объект GameArena является дочерним ... теперь я могу использовать его в MXML в качестве стандартного компонента Flex.

например

    public class ArenaView extends UIComponent 
    {
    public var gameArena:GameArena;
    override protected function createChildren():void
    {
        super.createChildren();
        if (!gameArena)
        {
            gameArena = new GameArena();
            gameArena.width = 200;
            gameArena.height = 200;
            addChild(gameArena);
        }
    }
}

Тогда у меня в главном MXML-приложении есть простая строка:

<logic:Arena x="0" y="0" width="50%" height="100%" name="TestArenaPanel" />

Но пока мой код компилируется, класс Flash не отображается.Может быть, это что-то простое, но я хотел спросить, если это разумный подход, или есть что-то лучше?

Кстати: у меня был разговор "следует ли использовать Flex" многие раз.Если вы хотите обсудить это, пожалуйста, делайте это в комментариях, но оставляйте ответы по теме.

Ответы [ 2 ]

3 голосов
/ 10 января 2011

Я думаю, что вы делаете это немного странным образом. Вместо создания оболочки для вашего класса GameView, сделайте так, чтобы GameView расширил оболочку, которая уже была создана для вас: SpriteVisualElement. Тогда вы сможете использовать GameView напрямую в mxml вместо того, чтобы переносить его в ArenaView.

Что может вас смущать, так это несоответствие между размерами и размерами Flex и размерами классов низкого уровня, таких как Sprite и Shape. Вы, вероятно, уже знаете, что когда вы рисуете внутри спрайта, ширина и высота спрайта будут отражать самые дальние границы вашего рисунка. Теперь с Flex родитель сообщает своему дочернему элементу, какой он должен быть (через setActualSize()).

Затем ребенок может или не может попросить родителя: «Но я не хочу быть такого размера! Я хочу быть этим размером», и он делает это, представляя родительские значения от его функции measure().

В конце концов, родитель все еще сообщает своему ребенку, какой именно размер должен быть, но будучи хорошим родителем, он дает своему ребенку некоторую свободу делать то, что он хочет, с его новым размером (так что updateDisplayList() дочернего элемента вызывается и он может вытащить мелки и сделать красивую картинку с указанным размером).

С этой маленькой историей вам придется решить: должен ли мой GameView просто рисовать сам себя? Или мой GameView должен нарисовать то, что ему нужно, основываясь на каком-то параметре, например, доступном размере окна браузера?

1 голос
/ 10 января 2011

Вы не указали нам ни свой код measure (), ни код updateDisplayList () компонента Flex ArenaView. Устанавливаете ли вы свойства measureWidth и figureHeight в measure ()? Вы позиционируете и измеряете gameArena в updateDisplayList ()?

Помните, что родитель всегда отвечает за размеры и расположение своих детей. Я предполагаю, что ваш компонент не дает размер gameArena, что делает его невидимым с нулевой шириной и нулевой высотой. Попробуйте что-то вроде этого:

override protected function upldateDisplayList(unscaledWidth:int, unscaledHeight: int):void{
 super.updateDisplayList(unscaledWidth, unscaledHeight);
 gameArena.setActualSize(unscaledWidth, unscaledHeight);
 gameArea.move(0,0);
}

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

Многие контейнеры Flex будут пытаться позиционировать своих дочерних элементов, но я не думаю, что кто-либо из них будет пытаться определить их размер, если для компонента не заданы значения свойств measureWW / measureHeight. У UIComponent, который вы расширяете, нет этого кода.

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