dropTarget显示错误

时间:2013-12-18 06:09:45

标签: actionscript-3 flash

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

 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)拖放到其他动画片段(比如说num2)上,就可以正常工作了。但当我在其他动画片段(背景)上下载时,它显示错误。我在if条件中跟踪了evt.target.dropTarget.parent.name,它显示了其他movieclip(背景)的名称。当条件未满足时,为什么显示另一个动画片段(背景)的名称,这个名称不是num1或num2左右......?有人能告诉我,如果我做错了吗?还是有另一种方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

不知道你是否在发布伪代码,但这不会作为一个条件:

evt.target.dropTarget.parent.name == "num1" || "num2" || "num3" ||

这将始终返回true,因为它将字符串“num2”作为条件进行评估。有关详细信息,请查看Boolean function

你想要的是:

var par_name = evt.target.dropTarget.parent.name;
if (evt.target.dropTarget != null && par_name == "num1" || par_name=="num2" || par_name=="num3" )

或者你可以通过多种方式简化这一点 - 例如:

var valid_targets = ["num1","num2","num3"];
if ( evt.target.dropTarget != null && (valid_targets.indexOf(par_name)>=0) )

答案 1 :(得分:0)

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

尝试类似:

//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);