1
    TypeError: Error #1010: A term is undefined and has no properties. 
at SchoolBookV2_fla::MainTimeline/dragObject1()[SchoolBookV2_fla.MainTimeline::frame18:50]

我正在尝试一些简单的拖放操作。但它似乎给了我这个错误。有人可以帮我解决吗?看起来它正在将变量 v 作为空引用。是不是应该有不同的排序?

代码:

import flash.sampler.NewObjectSample;
import flash.display.Sprite;

var bag : Sprite = new Sprite ();
var book1: Sprite = new Sprite ();
var book2: Sprite = new Sprite ();
var book3: Sprite = new Sprite ();
var book4: Sprite = new Sprite ();
var totalArray: Array = new Array ();
var v:int = 0;

bag.graphics.beginFill(0xFF6666);
bag.graphics.drawRect( 30,30, 100, 150);
bag.graphics.endFill();
addChild(bag);

book1.graphics.beginFill(0xCC6666);
book1.graphics.drawRect(300,300, 100, 150);
book1.graphics.endFill();
addChild(book1);

book2.graphics.beginFill(0xCC6666);
book2.graphics.drawRect( 150,150, 100, 150);
book2.graphics.endFill();
addChild(book2);

book3.graphics.beginFill(0xCC6666);
book3.graphics.drawRect( 200,200, 100, 150);
book3.graphics.endFill();
addChild(book3);

book4.graphics.beginFill(0xCC6666);
book4.graphics.drawRect( 80,80, 100, 150);
book4.graphics.endFill();
addChild(book4);

totalArray[totalArray.length] = book1;
totalArray[totalArray.length] = book2;
totalArray[totalArray.length] = book3;
totalArray[totalArray.length] = book4;

for (v; v < totalArray.length; v++)
{
    trace(totalArray.length);
    totalArray[v].addEventListener(MouseEvent.MOUSE_UP, stopdragObject1);
    totalArray[v].addEventListener(MouseEvent.MOUSE_DOWN, dragObject1);
    function dragObject1(e:MouseEvent)
    {

        totalArray[v].startDrag();
    }

    function stopdragObject1(l:MouseEvent)
    {
        totalArray[v].startDrag(false);
        trace("exists");
        if (totalArray[v].hitTestObject(bag))
        {

            totalArray[v].removeEventListener(MouseEvent.MOUSE_UP, stopdragObject1);
            totalArray[v].removeEventListener(MouseEvent.MOUSE_DOWN, dragObject1);
            trace("itworks");
            totalArray[v].x = xPos;
            totalArray[v].y = yPos;
            trace("it doesn'twork");
        }
        else
        {
            totalArray[v].x = xPos;
            totalArray[v].y = yPos;
            trace("it doesn'twork");
        }

        totalArray[v].stopDrag();
    }

}
4

2 回答 2

2

for 循环内的闭包是不好的魔力。当事件处理程序被调用时,它将使用 v 的值进行循环的最后一次迭代。

使dragObject1andstioDragObject1函数正常功能并通过event.target

for (v; v < totalArray.length; v++)
{
    trace(totalArray.length);
    totalArray[v].addEventListener(MouseEvent.MOUSE_UP, stopdragObject1);
    totalArray[v].addEventListener(MouseEvent.MOUSE_DOWN, dragObject1);
}

private function dragObject1(e:MouseEvent)
{
    e.target.startDrag();
}

private function stopdragObject1(l:MouseEvent)
{
    var sprite:Sprite = l.target as Sprite;

    if (sprite.hitTestObject(bag))
    {
        sprite.removeEventListener(MouseEvent.MOUSE_UP, stopdragObject1);
        sprite.removeEventListener(MouseEvent.MOUSE_DOWN, dragObject1);

        sprite.x = xPos;
        sprite.y = yPos;
    }
    else
    {
        sprite.x = xPos;
        sprite.y = yPos;
    }

    sprite.stopDrag();
}
于 2013-03-15T01:01:59.780 回答
1

这里有一些问题,尽管我无法确定究竟是什么导致了错误。

首先,你不应该在这样的循环中实例化函数。请阅读我对AS3 循环不起作用的答案,以更好地理解原因。基本上:这是一场记忆噩梦。

其次,这实际上可能是您的问题,v并不是指拖动时选择的对象。您会看到,在循环运行后(可能会在几毫秒内发生), v 等于totalArray.lengthtotalArray[ totalArray.length ]不可能存在,因为数组索引从 0 开始,但长度从 1 开始。所以这可能是问题所在。

这是你应该做的:

  1. 将函数移出循环。这是不必要的,浪费内存,你不能在循环之外调用它们
  2. 在函数中,不要totalArray[v]像现在这样调用,而是这样做var cur:Sprite = e.currentTarget as Sprite;然后引用cur。这将检索实际选择的对象。

除此之外,我真的建议您阅读范围的工作原理。您似乎对它的工作原理和方式有一个非常基本的了解,但这还远远不够。

于 2013-03-15T01:04:14.530 回答