有孩子的错误#1034

时间:2012-06-11 09:37:32

标签: actionscript-3 function drag-and-drop addeventlistener addchild

编辑: 哇,我没有意识到我做了很多太糟糕的事情。这是我自己编写的第一个代码,没有使用学校提供的东西。我猜想在经过这么少的课程后,我试着咬掉的东西比我能咬的还多。

我在google搜索答案之后获得了大部分内容,然后复制了我想要的代码部分(强调'思考')我需要。

还有办法'保存'代码吗?或者最好是废弃它并重新开始?无论哪种方式,那么正确的方法是什么?

另外,如果可以,我会问我的老师。但是我们不再和他一起上课,因此这个男人不再可用了(或者至少没有回复我的电子邮件。)我正在为自己的另一个学校作业做这件事。所以这就是我转向互联网的原因。

感谢你解释所做的一切。我很感激您花时间这样做:)

现在,回答你的一些问题,并提出新的问题:

只有第一个符号被称为符号1,其他符号都有“真实”的名称。当我启动项目并保持这种状态时,我忘了改变它,因为我确切知道它是什么,因为它是唯一一个这样称呼的方式。

..你知道如果计数器等于5,会出现什么样的名字? “HalfCircle15”。 是的,我意识到了。现在,我认为这样,同意这不是一个非常简洁的方式来写下来。在命名我的HalfCirlce1-4时没想到这一点。

您认为它做什么? 好的,让我试着更清楚地解释一下: 当您拖放副本时,您无法再移动它/选择它。我希望用户能够选择它,因此他可以根据需要再次拖放它。所以,我认为这意味着我必须将eventListeners添加到我制作的所有副本中?这就是我在这里尝试做的事情。 另外,感谢错误说明。 那么,这更像是吗?:

function makeListeners(copy:DisplayObject):void
{
    var i = this.numChildren;
    i.addEventListener(MouseEvent.CLICK, moveCopy);
}

我还将makeListeners调用移动到我制作副本的地方。所以当你制作副本时,它应该只运行一次,对吗?

为什么使用索引3作为“最新的子”索引?这没有任何意义。 我用谷歌搜索了如何做到这一点,我相信它告诉我''索引'是'层'(缺少更好的词)你想把孩子添加到?我将它添加到3,以便它们高于我的一些其他图像和其他图像。它看起来像那样工作,虽然现在我也开始质疑这一点。

这就是我现在所拥有的(删除了其他数字,以便更容易查看代码)。这给了我一个新的错误 TypeError:错误#1006:value是geen functie。     在rondje1 / makeListeners()     在rondje1 / dragRondje(): 所以我意识到这是不对的。但这至少比以前的方向更正确吗?

import flash.display.*;
import flash.events.MouseEvent;
import flash.ui.Mouse;

var counter=1;
var copy;

//Copy dan drag and drop Rondje
buttonRondje.addEventListener(MouseEvent.CLICK, dragRondje);
function dragRondje(event:MouseEvent):void
{
    this["rondje"+ (counter)]=new block;
    this["rondje"+(counter)].x=mouseX-45;
    this["rondje"+ (counter)].y=mouseY-45;
    copy = addChildAt(this["rondje"+(counter)], 3);
    counter++;
    copy.startDrag();       
    makeListeners(copy);
}

//DROP
stage.addEventListener(MouseEvent.MOUSE_UP, dropEverything);
function dropEverything(event:MouseEvent):void
{
    stopDrag();
}

//Remove latest child
buttonRemoveChild.addEventListener(MouseEvent.CLICK, removeNewestChild);
function removeNewestChild(event:MouseEvent):void
{
    var i = 0;
    i = this.numChildren;
    if (i > 10 )
    {
        this.removeChildAt(3);
    }
}

function makeListeners(copy:DisplayObject):void
{
    var i = this.numChildren;
    i.addEventListener(MouseEvent.CLICK, moveCopy);
}

function moveCopy(event:MouseEvent):void
{
    trace('move copy!');
}

ORINIAL POST 我正在为一个学校项目做一些“拖放”的事情,但我遇到了一个问题。

现在我已经设置了当你点击一个按钮时,你开始从库中拖动一个符号的副本。当您单击应用程序中的某个位置时,再次将其删除。 我遇到的问题是允许用户选择此副本以再次拖动它的代码。

它给了我这个错误:

  

TypeError:错误#1034:类型强制失败:无法将块@ 2a308041转换为flash.events.Event。在rondje1 / dropEverything()

以下是我制作副本的代码:

//Copy dan drag and drop Rondje
buttonRondje.addEventListener(MouseEvent.CLICK, dragRondje);
function dragRondje(event:MouseEvent):void
{
    this["rondje"+ (counter)]=new block;
    this["rondje"+(counter)].x=mouseX-45;
    this["rondje"+ (counter)].y=mouseY-45;
    copy = addChildAt(this["rondje"+(counter)], 3);
    counter++;
    copy.startDrag();       
}

代码放置它的位置,并将eventlisteners添加到副本中:

//DROP
stage.addEventListener(MouseEvent.MOUSE_UP, dropEverything);
function dropEverything(event:MouseEvent):void
{
    stopDrag();
    makeListeners(copy);
}

添加侦听器的代码:

function makeListeners(e:Event):void
{
    var i = 0;
    i = this.numChildren;
    for (i = this.numChildren;i<10;i++)
    {
        this.addEventListener(MouseEvent.CLICK, moveCopy);
    }
}

function moveCopy(event:MouseEvent):void
{
    trace('move copy!');
}

符号设置如下:

  • 姓名:符号1
  • 类型:电影剪辑
  • 导出for ActionScript - &gt;经过
  • 第1帧中的导出 - &gt;检查
  • Class:block
  • 基类:flash.display.MovieClip

我真的不明白为什么我在这里收到错误:S 希望有人可以帮助我。我永远感激不尽。 提前致谢, XX

ps:这是整个代码:

import flash.display.*;
import flash.events.MouseEvent;
import flash.ui.Mouse;

var counter=1;
var copy;

//Copy dan drag and drop Rondje
buttonRondje.addEventListener(MouseEvent.CLICK, dragRondje);
function dragRondje(event:MouseEvent):void
{
    this["rondje"+ (counter)]=new block;
    this["rondje"+(counter)].x=mouseX-45;
    this["rondje"+ (counter)].y=mouseY-45;
    copy = addChildAt(this["rondje"+(counter)], 3);
    counter++;
    copy.startDrag();       
}

//Copy dan drag and drop HalfCircle1
buttonHalfCircle1.addEventListener(MouseEvent.CLICK, dragHalfCircle1);
function dragHalfCircle1(event:MouseEvent):void
{
    this["HalfCircle1"+(counter)]=new HalfCircle1;
    this["HalfCircle1"+(counter)].x=mouseX - 45;
    this["HalfCircle1"+(counter)].y=mouseY - 55;
    copy = addChildAt(this["HalfCircle1"+(counter)], 3);
    counter++;
    copy.startDrag();   
}

//Copy dan drag and drop HalfCircle2
buttonHalfCircle2.addEventListener(MouseEvent.CLICK, dragHalfCircle2);
function dragHalfCircle2(event:MouseEvent):void
{
    this["HalfCircle2"+(counter)]=new HalfCircle2;
    this["HalfCircle2"+(counter)].x=mouseX - 45;
    this["HalfCircle2"+(counter)].y=mouseY - 55;
    copy = addChildAt(this["HalfCircle2"+(counter)], 3);
    counter++;
    copy.startDrag();   
}

//Copy dan drag and drop HalfCircle3
buttonHalfCircle3.addEventListener(MouseEvent.CLICK, dragHalfCircle3);
function dragHalfCircle3(event:MouseEvent):void
{
    this["HalfCircle3"+(counter)]=new HalfCircle3;
    this["HalfCircle3"+(counter)].x=mouseX - 45;
    this["HalfCircle3"+(counter)].y=mouseY - 5;
    copy = addChildAt(this["HalfCircle3"+(counter)], 3);
    counter++;
    copy.startDrag();   
}

//Copy dan drag and drop HalfCircle4
buttonHalfCircle4.addEventListener(MouseEvent.CLICK, dragHalfCircle4);
function dragHalfCircle4(event:MouseEvent):void
{
    this["HalfCircle4"+(counter)]=new HalfCircle4;
    this["HalfCircle4"+(counter)].x=mouseX - 45;
    this["HalfCircle4"+(counter)].y=mouseY - 5;
    copy = addChildAt(this["HalfCircle4"+(counter)], 3);
    counter++;
    copy.startDrag();   
}

//Copy dan drag and drop Streep
buttonStreep.addEventListener(MouseEvent.CLICK, dragStreep);
function dragStreep(event:MouseEvent):void
{
    this["streep"+(counter)]=new Streep;
    this["streep"+(counter)].x=mouseX - 2;
    this["streep"+(counter)].y=mouseY - 5;
    copy = addChildAt(this["streep"+(counter)], 3);
    counter++;
    copy.startDrag();   
}

//DROP
stage.addEventListener(MouseEvent.MOUSE_UP, dropEverything);
function dropEverything(event:MouseEvent):void
{
    stopDrag();
    makeListeners(copy);
}

//Remove latest child
buttonRemoveChild.addEventListener(MouseEvent.CLICK, removeNewestChild);
function removeNewestChild(event:MouseEvent):void
{
    var i = 0;
    i = this.numChildren;
    if (i > 10 )
    {
        this.removeChildAt(3);
    }
}

function makeListeners(e:Event):void
{
    var i = 0;
    i = this.numChildren;
    for (i = this.numChildren;i<10;i++)
    {
        this.addEventListener(MouseEvent.CLICK, moveCopy);
    }
}

function moveCopy(event:MouseEvent):void
{
    trace('move copy!');
}

1 个答案:

答案 0 :(得分:1)

您的代码可以改进。如果学校学会了你编码和命名这样的东西,你应该生气。名为“符号1”的符号未完成,就像使用荷兰语名称编码一样。我建议让代码更清洁。

 this["HalfCircle1"+(counter)]

..你知道如果计数器等于5,会出现什么样的名字? “HalfCircle15”

仔细看看这个功能:

function makeListeners(e:Event):void
{
    var i = 0;
    i = this.numChildren;
    for (i = this.numChildren;i<10;i++)
    {
        this.addEventListener(MouseEvent.CLICK, moveCopy);
    }
}

您认为它有什么作用?首先,将i设置为0.然后将其设置为当前影片剪辑中的子项数。这可以是任何数字。所以首先将其设置为0是没有意义的。但是为什么在世界上你想要从3循环到10并且不使用索引i?你只是多次做同样的事情。在听众的情况下,这是不好的做法。 你多次向同一个对象添加相同的监听器(?!)1个相同类型的监听器应该足够,否则它会过度杀戮并且会产生不必要的影响。

对我而言,目前还不清楚你要做什么,但我想你的意思是将侦听器添加到特定对象,因为你使用的是numChildren。

解决错误

makeListeners(copy);

函数makeListeners需要Event作为参数,您发送的copyDisplayObject。这会导致错误。您可能应该将e:Event更改为copy:DisplayObject,这会隐藏错误。

在您的代码中,看起来您在每次拖动/点击时都会继续添加侦听器,但是没有一个被删除。这意味着如果你点击10次,moveCopy可以调用100次(!)这将在点击时增加。您应该使用某种call-once init-function添加一次侦听器。

// add child at certain index
copy = addChildAt(this["HalfCircle4"+(counter)], 3);

// and..
this.removeChildAt(3);

我想知道为什么你使用索引3作为'最新的孩子'索引?

很抱歉,也许这条评论不是很有用,也不是问题的答案,但您的代码可以在几个方面得到改进。如果它已经因为黑魔法而起作用,但它充满了泄漏和不那么干净的代码。

你应该去找老师告诉他你需要帮助。你在学校。

更新:

我认为这足以创建一个复制并拖动该剪辑应用程序:

import flash.display.*;
import flash.events.MouseEvent;

var _lastClip:MovieClip;

// add a listener to all buttons. 
buttonRondje.addEventListener(MouseEvent.CLICK, handleClick);
buttonHalfCircle1.addEventListener(MouseEvent.CLICK, handleClick);
buttonHalfCircle2.addEventListener(MouseEvent.CLICK, handleClick);
buttonHalfCircle3.addEventListener(MouseEvent.CLICK, handleClick);
buttonHalfCircle4.addEventListener(MouseEvent.CLICK, handleClick);
buttonStreep.addEventListener(MouseEvent.CLICK, handleClick);

function handleClick(event:Event):void
{
     var clip:MovieClip;
             trace("Clicked on: " + clip);
             // based on which clip is clicked, we deside which object should be created.
     switch(event.currentTarget)
     {
         case buttonRondje:
         {
             clip = new Circle();
             break;
         }
         case buttonHalfCircle1:
         {
             clip = new HalfCircle1();
             break;
         }
         case buttonHalfCircle2:
         {
             clip = new HalfCircle2();
             break;
         }
         case buttonHalfCircle3:
         {
             clip = new HalfCircle3();
             break;
         }
         case buttonHalfCircle4:
         {
             clip = new HalfCircle4();
             break;
         }
         case buttonStreep:
         {
             clip = new Streep();
             break;
         }
    }

    // Move to mouse. It would be better to move the center points inside the clips so we don't need custom offsets here
    clip.x = mouseX;
    clip.y = mouseY;
    clip.startDrag();

    this.addChildAt(clip, 3);

    // remember the latest added clip
    this._lastClip = clip;
}

stage.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);

function handleMouseUp(event:MouseEvent):void
{
     // if you where dragging, stop it
     if(this._lastClip)
     {
         this._lastClip.stopDrag();
     }
}