Попытка удалить дочерний экземпляр в массиве. Отсутствие CS обучения. Полностью застрял - PullRequest
0 голосов
/ 02 февраля 2011

Я вчера написал о том, как сообщить одному классу из другого, что я хотел удалить его экземпляр, и сегодня заставил диспетчера работать.Тем не менее, я думаю, что я загнал себя в угол.Даже при том, что диспетчер работает, IA: чувствуется, что он выполняет слишком много функций на пути к фактическому удалению объекта, и B: все еще не удается заставить его фактически удалить.У меня нет никакого официального тренинга по CS, так что это одна из тех ситуаций, когда мой разум вращается, и я не могу «видеть», что я делаю неправильно.Я полагаю, если я опубликую свои уроки здесь, по крайней мере, люди могут посмеяться над моим любительским кодом, и если мне повезет, какая-то добрая душа укажет на то, что я делаю неправильно.Итак, вот так:

Background.as:

//Background class. Singleton? Sets up/maintains the application.

пакет pc_mockup {

import flash.display.*;
import flash.events.*;
import flash.geom.*;

public class Background extends flash.display.MovieClip {

    private var slate:MovieClip;
    private var slateBounds:Rectangle = new Rectangle(100,-260,0,280);
    private var _toolbox:MovieClip;
    private var _elementArray:Array = new Array();

    public function Background() {

        //attach movieclips to stage
        slate = new mc_slate();
        slate.x = 100;
        slate.y = 20;
        addChild(slate);

        _toolbox = new Toolbox();
        _toolbox.x = 750;
        _toolbox.y = 20;
        addChild(_toolbox);

        //set draggables
        //slate.addEventListener(MouseEvent.MOUSE_DOWN, dragSlate);
        //slate.addEventListener(MouseEvent.MOUSE_UP, releaseSlate);

        slate.addEventListener(MouseEvent.MOUSE_UP, dropNewElement);

    }

    private function dragSlate(event:MouseEvent) {
        slate.startDrag(false, slateBounds);
    }

    private function releaseSlate(event:MouseEvent) {
        slate.stopDrag();
    }

    private function dropNewElement(event:MouseEvent) {
        var _elementType:String = _toolbox.currentTool;
        var _x:Number = event.target.x;
        var _y:Number = event.target.y;
        var _newElement:MovieClip;
        var _latestIndex:Number;

        //case switch to choose element based on _elementType
        //add new element to stage
        _newElement = new PageElement(_elementType, event.localX, event.localY);
        _latestIndex = _elementArray.push(_newElement);
        _newElement.addEventListener("closeWindow", deleteElement);
        slate.addChild(_newElement);
    }

    private function deleteElement(event:Event) {
        trace("trying to remove element.");
        slate.event.target.removeChild(_elementArray[0]);
    }

}

}

Toolbox.as:

//Toolbox class.

package pc_mockup {

import flash.display.*;
import flash.events.*;
import flash.geom.*;

public class Toolbox extends flash.display.MovieClip {

    private var _toolboxback:MovieClip;
    private var _tool01:MovieClip;
    private var _tool02:MovieClip;
    private var _tool03:MovieClip;
    private var _tool04:MovieClip;
    private var _tool05:MovieClip;
    private var _currentTool:String = 'none';

    public function Toolbox() {

        _toolboxback = new ToolboxBack();
        _toolboxback.x = 0;
        _toolboxback.y = 0;
        _toolboxback.alpha = .5;
        addChild(_toolboxback);

        _tool01 = new TextTool();
        _tool01.x = 10;
        _tool01.y = 10;
        addChild(_tool01);
        //_tool01.addEventListener(MouseEvent.MOUSE_DOWN, dragTool);
        _tool01.addEventListener(MouseEvent.MOUSE_UP, switchTool);

        _tool02 = new ImageTool();
        _tool02.x = 10;
        _tool02.y = 54;
        addChild(_tool02);
        _tool02.addEventListener(MouseEvent.MOUSE_UP, switchTool);


    }

    private function dragTool(event:MouseEvent) {
        event.target.startDrag(false);
    }

    private function releaseTool(event:MouseEvent) {
        event.target.stopDrag();
    }

    private function switchTool(event:MouseEvent) {
        _currentTool = event.target.toolname;
        //trace(_currentTool);
    }

    public function get currentTool():String{
        return _currentTool;
    }

}

}

Tool.as (любой класс с «Tool» в конце просто расширяет этот класс и добавляет имя)

//Tool class.

пакет pc_mockup {

import flash.display.*;
import flash.events.*;
import flash.geom.*;

public class Tool extends flash.display.MovieClip {

    private var _toolname:String;

    public function Tool(toolname) {

        _toolname = toolname;

    }

    public function get toolname():String{
        return _toolname;
    }

}

}

PageElement.as:

//Page element class.

пакет pc_mockup {

import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.text.*;

public class PageElement extends flash.display.MovieClip {

    private var _elementname:String;
    private var _elementback:MovieClip;
    private var _elementmenu:MovieClip;
    private var _title:TextField;
    private var _formatter:TextFormat = new TextFormat();

    public function PageElement(elementname, x, y) {

        _elementname = elementname;
        _elementback = new ElementBack();
        _elementback.x = x;
        _elementback.y = y;
        _elementback.alpha = .5;
        _elementback.addEventListener(MouseEvent.MOUSE_DOWN, dontBubble);
        _elementback.addEventListener(MouseEvent.MOUSE_UP, dontBubble);

        _elementmenu = new ElementMenu();
        _elementmenu.x = x + _elementback.width - 5;
        _elementmenu.y = y - 5;
        _elementmenu.addEventListener(MouseEvent.MOUSE_OVER, showElementMenu);
        _elementmenu.addEventListener(MouseEvent.MOUSE_OUT, retractElementMenu);
        _elementmenu.addEventListener(MouseEvent.MOUSE_DOWN, dragElement);
        _elementmenu.addEventListener(MouseEvent.MOUSE_UP, releaseElement);

        _formatter.font = "Helvetica";
        _formatter.size = 10;

        _title = new TextField();
        _title.text = elementname;
        _title.x = x;
        _title.y = y;
        _title.textColor = 0xffffff;
        _title.setTextFormat(_formatter);

        addChild(_title);
        addChild(_elementback);
        addChild(_elementmenu);

    }

    public function get elementname():String{
        return _elementname;
    }

    public function set elementTitle(newTitle) {

    }

    public function showElementMenu(event:MouseEvent) {
        _elementmenu.expandMenu();
    }

    public function retractElementMenu(event:MouseEvent) {
        _elementmenu.retractMenu();
    }

    public function hideElementMenu() {
        _elementmenu.alpha = 0;
    }

    private function dragElement(event:MouseEvent) {
        event.target.parent.parent.startDrag(false);
        event.stopPropagation();
    }

    private function releaseElement(event:MouseEvent) {
        event.target.parent.parent.stopDrag();
        event.stopPropagation();
    }

    private function dontBubble(event:MouseEvent) {
        event.stopPropagation();
    }

}

}

DeleteBack.as:

//Element menu back class.

пакет pc_mockup {

import flash.display.*;
import flash.events.*;
import flash.geom.*;

public class DeleteBack extends flash.display.MovieClip {

    public function DeleteBack() {


    }

    public function closeElement(event:MouseEvent) {

        dispatchEvent(new Event("closeWindow", true));
        trace("event dispatched.");

    }

}

}

ElementMenu.as:

//Element menu class.

package pc_mockup {

import flash.display.*;
import flash.events.*;
import flash.geom.*;
import caurina.transitions.Tweener;

public class ElementMenu extends flash.display.MovieClip {

    private var _elementmenuback:MovieClip;
    private var _deletebutton:MovieClip;

    public function ElementMenu() {

        _elementmenuback = new ElementMenuBack();
        _elementmenuback.x = 0;
        _elementmenuback.y = 0;
        _elementmenuback.width = 100;
        _elementmenuback.height = 5;
        _elementmenuback.alpha = .5;
        addChild(_elementmenuback);

        _deletebutton = new DeleteBack();
        _deletebutton.x = -5;
        _deletebutton.y = 10;
        _deletebutton.width = 10;
        _deletebutton.height = 10;
        _deletebutton.alpha = .2;
        _deletebutton.visible = false;
        addChild(_deletebutton);

        _deletebutton.addEventListener(MouseEvent.MOUSE_DOWN, closeElement);

    }

    public function expandMenu() {
        Tweener.addTween(_elementmenuback, {height:30, time:.2, transition:"easeOutBack"});
        _deletebutton.visible = true;
    }

    public function retractMenu() {
        Tweener.addTween(_elementmenuback, {height:5, time:.1, transition:"easeInBack"});
        _deletebutton.visible = false;
    }

    public function closeElement(event:MouseEvent) {
        //check that the user really wants to close the element before sending the destroy signal
        //perform any closing animations
        //this.parent.destroy();
        _deletebutton.closeElement(event);
    }


}

}

Вот и все для значимых классов.Все остальное - это либо пустой класс, который существует только для того, чтобы сделать объект библиотеки доступным для ActionScript, либо тривиальное расширение чего-то еще.

Код помещает новый элемент на сцену, придает ему прохладный маленькийвыпадающее меню, которое делает его перетаскиваемым и имеет кнопку удаления, и должен связать эту кнопку с функцией, закрывающей элемент.

У меня есть все, кроме закрытия.

Общая критика кода также очень приветствуется.Как я уже сказал, у меня нет тренировок, я сам разбираюсь с этими вещами, и любые отзывы от людей, которые знают, что они делают, ценны.

Спасибо!

SS

PS.В ответ на комментарий Дэниела, вот шаги, которые выполняет код:

  1. Класс Background помещает все на сцену и создает набор инструментов.
  2. Набор инструментов создает инструменты, которыекак инструменты Photoshop.Вы нажимаете на них, чтобы выбрать элемент, который хотите добавить на сцену, затем нажимаете внутри «листа», чтобы поместить новый экземпляр этого объекта поверх него.Фон создает экземпляр и сохраняет его в массиве всех экземпляров, созданных во время выполнения.
  3. Новый элемент создает собственное выпадающее меню, которое является перетаскиваемой частью элемента и содержит кнопку удаления.Это меню помещает EventListener на кнопку удаления.
  4. При нажатии кнопки удаления, EventListener, помещенный в него своим родительским классом, вызывает диспетчер событий внутри самого класса кнопки удаления.
  5. Thisотправленное событие перехватывается фоновым классом (я полагал, что лучший класс для удаления элемента - это тот же класс, который его создал, верно?) и запускает фактический код для удаления элемента.
  6. Этот код "deleteElement", где я застрял.У меня есть все экземпляры в массиве, но событие прошло через очень много промежуточных классов, MouseEvent, и, таким образом, я подозреваю, цель MouseEvent упала на второй план.Таким образом, единственный способ узнать, какой элемент удалить, - найти его индекс массива.Я понятия не имею, как это будет работать.Есть идеи?

1 Ответ

1 голос
/ 02 февраля 2011

давайте сделаем это немного за раз ...

slate.event.target.removeChild(_elementArray[0]); в background.as

почему вы используете slate.event?

вы проходитеevent объект для функции, но похоже, что вы используете цель другого события, которое я не знаю, откуда оно происходит или почему оно не выдает ошибку.

это должно быть простоevent.target, который должен дать вам PageElement (ранее известный как _newElement)

я также не знаю, почему вы удаляете из него дочерний элемент _elementArra [0] - который на самом деле является другим PageElementи, вероятно, само по себе, если у вас есть только один.

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

Если вы посмотрите на свой предыдущий вопрос, я добавил туда код о том, как получить родителя.Поэтому я настроил его немного

function deleteElement($e:MouseEvent):void{
  var parentMC:MovieClip = $e.target.parent;
  parentMC.removechild($e.target);
}

, однако проблема в том, что вы не передаете MouseEvent, а пропускаете пустое событие

dispatchEvent(new Event("closeWindow", true)); в DeleteBack.as

так что это ничего не пропустит под цель, и вы не можете получить это.(цель доступна только для чтения, поэтому new Event(etc) всегда будет иметь нулевую цель. По сути, это немного проигрышная задача.

вы можете установить объект в вашем синглтоне и передать, какой mc должен быть удален,и затем deleteElement просто захватит этот объект. Другой вариант - заглянуть в класс сигналов , который позволит вам сделать более эффективную / более эффективную обработку событий.

наконец (вроде как,это еще не все, но пока) Я бы сказал, что стоит изучить использование CASAlib, в частности, использовать CasaMovieClip вместо MovieClip для расширения, так как это будет лучше удалять ваши видеоклипы. Если у вас много слушателей событий, и вы их не очищаетедолжным образом, они останутся в памяти даже после того, как вы их удалите.

Конечно, изучать другие фреймворки, такие как RobotLegs, тоже неплохая идея, она поможет вам получить лучшие практики.

GL


Редактировать ...

Каркасы / микроархитектуры:

http://www.robotlegs.org/

http://swizframework.org/

http://puremvc.org/

и многие другие

Я думаю, что важно не застрять на каркасе (хотя я часто упоминаю это слово).И лучший фреймворк - это фреймворк, который лучше всего подходит для вас, и для меня это означает, что мы предлагаем хорошую коммуникационную основу для приложения и не вмешиваемся.

Моя настройка для написания кода следующая:

FlashDevelop с компилятором Flex.FlashDevelop предназначен только для ПК, поэтому, если вы работаете на Mac, вы можете рассмотреть другие варианты, такие как flex.FlashDevelop и Flex-компилятор (только компилятор) бесплатны, так что вы не ошибетесь, и как только вы начнете использовать его, вы не захотите возвращаться к кодированию во Flash - гарантировано !!

отладка:

Трассировка - это самая простая форма отладки, и понять проблему может быть довольно сложно.

Вы можете использовать флэш-отладчик, нажав Ctrl-Shift-Enter для компиляции и запуска.Вам нужно будет заранее установить точки останова.

FlashDevelop имеет отладчик, который работает так же, как отладчики Flash и Flex, и я использую его довольно часто.

Но мой любимый инструмент отладки долженбыть de monster отладчик

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

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