我在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左右......?有人能告诉我,如果我做错了吗?还是有另一种方法可以做到这一点?
答案 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);