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

簡単なドラッグアンドドロップを試しています。しかし、それは私にこのエラーを与えているようです。誰かがそれを解決するのを手伝ってくれませんか?変数vをnullrefとして取り込んでいるようです。シーケンスが異なると思われますか?

コード:

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の値が使用されます。

and関数を通常の関数にし、次の方法で要素にアクセスしますdragObject1stioDragObject1event.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.lengthます。totalArray[ totalArray.length ]配列のインデックスは0から始まりますが、長さは1から始まるため、存在できません。これが問題になる可能性があります。

これがあなたがすべきことです:

  1. 関数をループの外に移動します。それは不要であり、メモリの浪費であり、ループの外でそれらを呼び出すことはできません
  2. totalArray[v]関数では、現在のように呼び出す代わりに、これvar cur:Sprite = e.currentTarget as Sprite;を実行してから、代わりに参照しcurます。これにより、実際に選択されたオブジェクトが取得されます。

それを超えて、スコープがどのように機能するかを読んでおくことをお勧めします。あなたはそれが何をどのように機能するかについて非常に基本的な理解を持っているようですが、それは十分ではありません。

于 2013-03-15T01:04:14.530 に答える