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

我正在尝试一些简单的拖放操作。但它似乎给了我这个错误。 有人可以帮我解决吗? 它看起来像是将变量v作为null参考。 它假设按不同的顺序排列?TypeError:错误#1010:术语未定义且没有属性。

代码:

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(); 
    } 

} 

回答

2

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

充分利用dragObject1stioDragObject1功能的正常功能,并通过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(); 
} 
+0

很酷thx一堆。它确实工作得很好。但我有一个问题,如果我想删除放在包里的盒子,我该怎么做? – tailedmouse 2013-03-15 01:08:34

+0

如果它是'bag'的孩子,那么你可以用'bag.removeChild(sprite)'''在'hitTestObject'检查中删除它。或者你可以通过'sprite.parent.removeChild(sprite);' – 2013-03-15 01:19:38

+1

从它的父母中删除它哦,我看到谢谢,我用sprite.parent ....它工作出色! – tailedmouse 2013-03-15 15:02:37

1

访问元素有问题的几件事情在这里,虽然我不能查明究竟是什么原因造成的错误。

首先,你永远不应该在这样的循环内实例化函数。请阅读我的答案AS3 loop doen't work以更好地理解原因。基本上:这是一场记忆噩梦。

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

这里是你应该做的:

  1. 移动功能圈外。这是不必要的,浪费内存,并且你不能在回路外呼叫它们
  2. 在这些功能中,不是像现在这样调用totalArray[v],而是执行var cur:Sprite = e.currentTarget as Sprite;,然后参考cur来代替。这将检索实际选定的对象。

除此之外,我真的建议你阅读范围的工作原理。你似乎对于它的工作原理和工作方式有非常基本的把握,但这远远不够。

+0

噢,非常感谢你指出这个问题。其实我已经阅读了变量范围。我实际上也移动了功能,但我不知道如何将它们连接到数组对象。 XP。但非常感谢我刚刚开始编程的详细答案。 – tailedmouse 2013-03-15 01:12:58

相关问题