2013-03-15 74 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

相關問題