Actionscript 3 dropTarget显示错误

Actionscript 3 dropTarget显示错误,actionscript-3,flash,Actionscript 3,Flash,我正在用flash cs 5.5创建一个简单的拖放游戏。舞台上会有几部电影。用户需要做的是将它拖动到另一个movieclip,movieclip将切换并检查它是否在正确的位置。我使用了类似这样的代码 if (evt.target.dropTarget != null && evt.target.dropTarget.parent.name == "num1" || "num2" || "num3" || ......and so on) { //do your thing }

我正在用flash cs 5.5创建一个简单的拖放游戏。舞台上会有几部电影。用户需要做的是将它拖动到另一个movieclip,movieclip将切换并检查它是否在正确的位置。我使用了类似这样的代码

 if (evt.target.dropTarget != null && evt.target.dropTarget.parent.name == "num1" || "num2" || "num3" || ......and so on)
{
//do your thing
}
else
{
//go back to original place
}

在上面的代码中,num1、num2等是moveiclips的名称。舞台上还有其他的电影。它们是背景。如果我像预期的那样将movieclip(比如num1)拖放到其他movieclip(比如num2)上,这就可以了。但当我把它放到另一部电影剪辑(背景)上时,它显示了错误。我在if条件中跟踪了evt.target.dropTarget.parent.name,它显示了其他movieclip(背景)的名称。为什么它在不满足条件时显示另一个movieclip(背景)的名称,即名称不是num1或num2等等。。。?有人能告诉我我做错了什么吗?或者有其他方法可以做到这一点吗?

不知道您是否发布了伪代码,但这不能作为一个条件:

evt.target.dropTarget.parent.name == "num1" || "num2" || "num3" ||
这将始终返回true,因为它将字符串“num2”作为条件进行计算。有关更多信息,请参阅

您想要的是:

var par_name = evt.target.dropTarget.parent.name;
if (evt.target.dropTarget != null && par_name == "num1" || par_name=="num2" || par_name=="num3" )
//your package name (I just created a simple example, you should refactor and add your logic
package nu.gpeart.TheGunnersExample.components
{
import flash.geom.Rectangle;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;

/**
 * @file DraggableItem.as
 * @created Dec 18, 2013 - 9:02:52 AM
 */
public class DraggableItem extends Sprite
{
    private var _item:Sprite;
    private var _rightPlace:Point;
    private var _dropTarget:Sprite;
    private var _originalPlace:Point;

    public function DraggableItem(parent:Sprite,
                                  viewport:Rectangle,
                                  color:uint,
                                  rightPlace:Point,
                                  dropTarget:Sprite)
    {
        _originalPlace = new Point(viewport.x, viewport.y);
        _rightPlace = rightPlace;
        _dropTarget = dropTarget;

        _item = new Sprite();
        _item.graphics.beginFill(color);
        _item.graphics.drawRect(0, 0, viewport.width, viewport.height);
        _item.graphics.endFill();
        parent.addChild(_item);

        addMouseDownListener();
    }

    private function addMouseDownListener():void
    {
        _item.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler, false, 0, true);
    }

    private function mouseDownHandler(event:MouseEvent):void
    {
        _item.startDrag();
        removeMouseDownListener();
        addMouseUpListeners();
    }

    private function addMouseUpListeners():void
    {
        _item.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true);
        _item.parent.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true);
    }

    private function mouseUpHandler(event:MouseEvent):void
    {
        _item.stopDrag();
        removeMouseUpListeners();
        addMouseDownListener();

        startLogic();
    }

    private function startLogic():void
    {
        if (_item.hitTestObject(_dropTarget))
        {
            (_item.hitTestPoint(_rightPlace.x, _rightPlace.y)) ? rightPositionLogic() : wrongPositionLogic();
        }
        else
        {
            wrongPositionLogic();
        }
    }

    private function wrongPositionLogic():void
    {
        _item.x = _originalPlace.x;
        _item.y = _originalPlace.y;
        // go back to original place
    }

    private function rightPositionLogic():void
    {
        trace('dropped the right place');
        // do your thing
    }

    private function removeMouseUpListeners():void
    {
        _item.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
        _item.parent.stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
    }

    private function removeMouseDownListener():void
    {
        _item.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    }
}
}
        var rightPlace:Point = new Point(461, 554);
        var originalPosition:Point = new Point(50, 50);
        var itemWidth:Number = 50;
        var itemHeight:Number = 50;
        var viewport:Rectangle = new Rectangle(originalPosition.x, originalPosition.y, itemWidth, itemHeight);
        var itemColor:uint = 0xf67821;

        //container (the Sprite where are you adding all your objects
        //dropTarget (the Sprite you want to detect the hitTest
        var draggableItem:DraggableItem = new DraggableItem(container, viewport, itemColor, rightPlace, dropTarget);
或者,您可以通过多种方式简化此过程,例如:


希望这个简单而虚拟的例子能够更多地解释如何实现这个逻辑。(当然,这只是一个草稿,但可以用作模型)

尝试以下方法:

var par_name = evt.target.dropTarget.parent.name;
if (evt.target.dropTarget != null && par_name == "num1" || par_name=="num2" || par_name=="num3" )
//your package name (I just created a simple example, you should refactor and add your logic
package nu.gpeart.TheGunnersExample.components
{
import flash.geom.Rectangle;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;

/**
 * @file DraggableItem.as
 * @created Dec 18, 2013 - 9:02:52 AM
 */
public class DraggableItem extends Sprite
{
    private var _item:Sprite;
    private var _rightPlace:Point;
    private var _dropTarget:Sprite;
    private var _originalPlace:Point;

    public function DraggableItem(parent:Sprite,
                                  viewport:Rectangle,
                                  color:uint,
                                  rightPlace:Point,
                                  dropTarget:Sprite)
    {
        _originalPlace = new Point(viewport.x, viewport.y);
        _rightPlace = rightPlace;
        _dropTarget = dropTarget;

        _item = new Sprite();
        _item.graphics.beginFill(color);
        _item.graphics.drawRect(0, 0, viewport.width, viewport.height);
        _item.graphics.endFill();
        parent.addChild(_item);

        addMouseDownListener();
    }

    private function addMouseDownListener():void
    {
        _item.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler, false, 0, true);
    }

    private function mouseDownHandler(event:MouseEvent):void
    {
        _item.startDrag();
        removeMouseDownListener();
        addMouseUpListeners();
    }

    private function addMouseUpListeners():void
    {
        _item.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true);
        _item.parent.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true);
    }

    private function mouseUpHandler(event:MouseEvent):void
    {
        _item.stopDrag();
        removeMouseUpListeners();
        addMouseDownListener();

        startLogic();
    }

    private function startLogic():void
    {
        if (_item.hitTestObject(_dropTarget))
        {
            (_item.hitTestPoint(_rightPlace.x, _rightPlace.y)) ? rightPositionLogic() : wrongPositionLogic();
        }
        else
        {
            wrongPositionLogic();
        }
    }

    private function wrongPositionLogic():void
    {
        _item.x = _originalPlace.x;
        _item.y = _originalPlace.y;
        // go back to original place
    }

    private function rightPositionLogic():void
    {
        trace('dropped the right place');
        // do your thing
    }

    private function removeMouseUpListeners():void
    {
        _item.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
        _item.parent.stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
    }

    private function removeMouseDownListener():void
    {
        _item.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    }
}
}
        var rightPlace:Point = new Point(461, 554);
        var originalPosition:Point = new Point(50, 50);
        var itemWidth:Number = 50;
        var itemHeight:Number = 50;
        var viewport:Rectangle = new Rectangle(originalPosition.x, originalPosition.y, itemWidth, itemHeight);
        var itemColor:uint = 0xf67821;

        //container (the Sprite where are you adding all your objects
        //dropTarget (the Sprite you want to detect the hitTest
        var draggableItem:DraggableItem = new DraggableItem(container, viewport, itemColor, rightPlace, dropTarget);
要使用,您只需要以下内容:

var par_name = evt.target.dropTarget.parent.name;
if (evt.target.dropTarget != null && par_name == "num1" || par_name=="num2" || par_name=="num3" )
//your package name (I just created a simple example, you should refactor and add your logic
package nu.gpeart.TheGunnersExample.components
{
import flash.geom.Rectangle;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;

/**
 * @file DraggableItem.as
 * @created Dec 18, 2013 - 9:02:52 AM
 */
public class DraggableItem extends Sprite
{
    private var _item:Sprite;
    private var _rightPlace:Point;
    private var _dropTarget:Sprite;
    private var _originalPlace:Point;

    public function DraggableItem(parent:Sprite,
                                  viewport:Rectangle,
                                  color:uint,
                                  rightPlace:Point,
                                  dropTarget:Sprite)
    {
        _originalPlace = new Point(viewport.x, viewport.y);
        _rightPlace = rightPlace;
        _dropTarget = dropTarget;

        _item = new Sprite();
        _item.graphics.beginFill(color);
        _item.graphics.drawRect(0, 0, viewport.width, viewport.height);
        _item.graphics.endFill();
        parent.addChild(_item);

        addMouseDownListener();
    }

    private function addMouseDownListener():void
    {
        _item.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler, false, 0, true);
    }

    private function mouseDownHandler(event:MouseEvent):void
    {
        _item.startDrag();
        removeMouseDownListener();
        addMouseUpListeners();
    }

    private function addMouseUpListeners():void
    {
        _item.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true);
        _item.parent.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true);
    }

    private function mouseUpHandler(event:MouseEvent):void
    {
        _item.stopDrag();
        removeMouseUpListeners();
        addMouseDownListener();

        startLogic();
    }

    private function startLogic():void
    {
        if (_item.hitTestObject(_dropTarget))
        {
            (_item.hitTestPoint(_rightPlace.x, _rightPlace.y)) ? rightPositionLogic() : wrongPositionLogic();
        }
        else
        {
            wrongPositionLogic();
        }
    }

    private function wrongPositionLogic():void
    {
        _item.x = _originalPlace.x;
        _item.y = _originalPlace.y;
        // go back to original place
    }

    private function rightPositionLogic():void
    {
        trace('dropped the right place');
        // do your thing
    }

    private function removeMouseUpListeners():void
    {
        _item.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
        _item.parent.stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
    }

    private function removeMouseDownListener():void
    {
        _item.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    }
}
}
        var rightPlace:Point = new Point(461, 554);
        var originalPosition:Point = new Point(50, 50);
        var itemWidth:Number = 50;
        var itemHeight:Number = 50;
        var viewport:Rectangle = new Rectangle(originalPosition.x, originalPosition.y, itemWidth, itemHeight);
        var itemColor:uint = 0xf67821;

        //container (the Sprite where are you adding all your objects
        //dropTarget (the Sprite you want to detect the hitTest
        var draggableItem:DraggableItem = new DraggableItem(container, viewport, itemColor, rightPlace, dropTarget);