Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Реализация интерфейса закладок в редакторе уровней (http://www.flasher.ru/forum/showthread.php?t=171198)

Denis_ex 11.11.2011 07:30

Реализация интерфейса закладок в редакторе уровней
 
Реализую интерфейс в редакторе уровней, есть поле с закладками.
Сделал так, есть базовый класс закладок и каждая новая закладка – это один класс унаследованный от базового и принимающий спрайт (с помощью композиции) для отображения содержимого вкладки.
Все вроде ок, заполняем каждую вкладку спрайтом с контентом, там расшариваем вложенные клипы, поля, счетчики и работаем с ними.
Но получилось так, что есть ряд игровых объектов, которые надо расположить на уровне перетаскиванием и они разделены по разделам, напр. “динамические”, “статичные”, “люди”, “бэкграунды” и пр. и каждый такой раздел с объектами отображается в отдельной вкладке, но инструментом для отображения я использую единственный экземпляр компонента TileList с ячейками, просто при переходе в каждый раздел я очищаю и заполняю ячейки новыми объектами из соотв. раздела.
Но есть проблема, чтобы один единственный экземпляр объекта TileList, находился во всех закладках, я его добавил в базовый класс, как статичный.

Код AS3:

public class BaseTab
{
        // ссылка на единственный экземпляр во всех наследуемых классах
        static var tileList: TileList;
        public static var curPart:int;
        public var visual:DisplayObjectContainer;
 
        public function BaseTab( part:int, icon:DisplayObjectContainer, container:DisplayObjectContainer,  regObj:RegisterObjects, visual:DisplayObjectContainer = null  )             
        {
                //…
        }
 
                //…
        }

При создании очередной закладки, мне приходится проверять, был ли создан единственный TileList и был ли добавлен в список отображения, если нет, то создать/добавить напр.:

Код AS3:

public class TileItemTab extends BaseTab
{
    public function TileListTab( part:int, icon:DisplayObjectContainer, container:DisplayObjectContainer,
                                            regObj:RegisterObjects)
    {
            super( part, icon, container, regObj, null );
 
            //проверка экземпляра TileList на создание и добавление
            //в список отображения в наследуемом классе закладки
            if (!tileList)
            {
                tileList  = new tileList ();
                //tileList.update(EnumPart.DYNAMIC);
                container.addChild(tileList);
                tileList.x = Utils.center(container.width, tileList.width);
                tileList.y = 90;
            }
 
            //….
    }
}

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

DaFive 11.11.2011 11:02

А почему такая неуверенность в создании TileList? Разве нельзя его создать до создания табов и передавать в конструктор на него ссылку.

Denis_ex 11.11.2011 12:05

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

DaFive 11.11.2011 14:37

Ну а как еще, если есть неуверенность в его наличии проверять в табе? Повторять только код. Или дернуть у вышестоящего класса метод, который вернёт все что надо. Опять же проверка в каждом табе на наличие ненуллового тайллиста будет выполняться. Если он создается один раз - создать его заранее и делать что душе угодно.

Denis_ex 12.11.2011 09:05

Тут еще ситуация осложняется тем, что к TileList добавляется событие клика по ячейки, которое тоже приходится проверять внутри таба на наличие, чтобы дубляжа вызова функции onClickCell не было.

Код AS3:

if (!tileItems.tileList.hasEventListener(ComponentEvent.BUTTON_DOWN))
tileList.addEventListener(ComponentEvent.BUTTON_DOWN, onClickCell);

Если создавать TileList вне таба, то как быть с функцией-событием клика onClickCell, т.е. где ее реализовывать, если внутри нее обращаются внутренние переменные таба? В таком случае из вне создавать Tile List и привязывать событие, а публичную функцию клика для события получать из любого экземпляра таба? Это кажется еще хуже получается...


Часовой пояс GMT +4, время: 13:37.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.