试图删除数组中的子实例。缺乏CS培训。完全卡住了

时间:2011-02-02 02:08:58

标签: actionscript-3 events object

我昨天发布了关于如何与另一个类进行通信的信息,我想删除它的一个实例,我让调度员今天工作了。但是,我想我已经把自己画成了一个角落。即使调度程序正在工作,我A:感觉它在实际删除对象的过程中运行了太多函数,而B:仍然无法让它实际删除。我没有任何正式的CS培训,所以这是我的思想进入圈子而我无法“看到”我做错的情况之一。我想如果我在这里发布我的课程,至少人们可以对我的业余代码轻笑,如果我很幸运,一些善良的人会指出我做错了什么。所以这里:

Background.as:

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

package 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 class.

package 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.

package 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.

package 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。回应Daniel的评论,以下是代码采取的步骤:

  1. Background类将所有内容放在舞台上并创建工具箱。
  2. 工具箱会创建工具,就像Photoshop的工具一样。单击它们以选择要添加到舞台的元素,然后单击“平板”内部以在其上放置该对象的新实例。后台创建实例并将其保存在运行时创建的所有实例的数组中。
  3. 新元素创建自己的下拉菜单,该菜单是元素的可拖动部分并保存删除按钮。此菜单在删除按钮上放置一个eventListener。
  4. 单击删除按钮时,其父类放置在其上的eventListener将在删除按钮类本身内调用事件调度程序。
  5. 这个调度的事件被后台类捕获(我认为删除元素的最佳类是创建它的类,对吧?)并触发实际代码来删除元素。
  6. 此代码“deleteElement”是我被困的地方。我有一个数组中的所有实例,但事件已经经历了很多中间类,MouseEvent,因此,我怀疑,MouseEvent目标已经落在了路边。因此,知道删除哪个元素的唯一方法是找到它的数组索引。我不知道这是如何工作的。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

让我们一次做一点......

background.as

中的

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

为什么使用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而是传递空白事件

DeleteBack.as中的

dispatchEvent(new Event("closeWindow", true));

所以这不会传递目标下的任何东西,你无法得到它。 (目标是只读的,因此new Event(etc)将始终具有空目标。所以基本上这是一个失败的原因。

你可以在你的单例中设置一个onject并传递要删除的mc,然后deleteElement就会抓住那个对象。另一个选择是查看signals class,它可以让您做更好/更有效的事件处理。

最后(有点,现在还有更多)我会说使用CASAlib,特别是使用CasaMovieClip而不是MovieClip进行扩展,因为它会更好地删除你的影片剪辑。如果你有很多事件监听器并且你没有正确清除它们,那么即使你删除它们也会留在内存中。

当然,查看RobotLegs等其他框架也是一个好主意,它可以让你进入更好的实践。

GL


编辑...

框架/微架构:

http://www.robotlegs.org/

http://swizframework.org/

http://puremvc.org/

还有更多

我认为重要的是不要陷入框架(尽管我经常提到这个词)。最好的框架是最适合您的框架,对我而言,这意味着为应用程序提供良好的通信主干并且不受影响。

我编写代码的设置如下:

使用Flex编译器进行FlashDevelop。 FlashDevelop仅适用于PC,因此如果您使用的是Mac,则可能需要考虑其他选项,如flex。 FlashDevelop和Flex编译器(仅限编译器)都是免费的,所以你不会出错,一旦你开始使用它,你将不想再回到Flash编码 - 保证!!

调试:

Trace是最简单的调试形式,理解这个问题非常困难。

您可以通过按Ctrl-Shift-Enter来编译和运行Flash调试器。您需要提前设置断点。

FlashDevelop有一个调试器,就像Flash和Flex调试器一样,我经常使用它。

但我最喜欢的调试工具必须是de monster debugger

实现需要更多的东西,并且您需要添加一些代码,但它发现了我无法使用默认调试器的问题。绝对值得一看。