我昨天发布了关于如何与另一个类进行通信的信息,我想删除它的一个实例,我让调度员今天工作了。但是,我想我已经把自己画成了一个角落。即使调度程序正在工作,我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的评论,以下是代码采取的步骤:
答案 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
编辑...
框架/微架构:
还有更多
我认为重要的是不要陷入框架(尽管我经常提到这个词)。最好的框架是最适合您的框架,对我而言,这意味着为应用程序提供良好的通信主干并且不受影响。
我编写代码的设置如下:
使用Flex编译器进行FlashDevelop。 FlashDevelop仅适用于PC,因此如果您使用的是Mac,则可能需要考虑其他选项,如flex。 FlashDevelop和Flex编译器(仅限编译器)都是免费的,所以你不会出错,一旦你开始使用它,你将不想再回到Flash编码 - 保证!!
调试:
Trace是最简单的调试形式,理解这个问题非常困难。
您可以通过按Ctrl-Shift-Enter
来编译和运行Flash调试器。您需要提前设置断点。
FlashDevelop有一个调试器,就像Flash和Flex调试器一样,我经常使用它。
但我最喜欢的调试工具必须是de monster debugger
实现需要更多的东西,并且您需要添加一些代码,但它发现了我无法使用默认调试器的问题。绝对值得一看。