我想創建一個可以拖動塊的塊遊戲。我正在尋找最友好的拖拽行爲。它只能移動水平或垂直,並且只能移動1個塊。它應該捕捉(緩解到期望的目標位置),因爲你不能在中間釋放它(在塊之間)。它應該有點像iPhone開關按鈕,但十字架。我試圖通過檢查鼠標的角度到塊的原始位置來檢查它應該移動的方向。我希望它總是能夠穿過中心(原始位置)。我的意思是;它不能從左邊的位置動畫到上面的位置,它應該先動畫到中心。遊戲的交叉拖動行爲
這些塊是左上對齊的,塊之間有間距。
這樣做的最好方法是什麼?
UPDATE:
這是我當前的代碼。它目前正朝着這個方向發展,但並沒有動搖這一點。
package nl.stroep.games.behaviors
{
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import nl.stroep.games.boxgame.Setting;
/**
* Target dragging behavior
* @author Mark Knol
*/
public class CrossDragBehavior
{
private static const HALF_PI:Number = Math.PI/2;
private static const QUART_PI:Number = HALF_PI/2;
private var _target:DisplayObject;
private var _targetPosition:Point;
public function CrossDragBehavior(target:DisplayObject)
{
_target = target;
_target.addEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
_target.stage.addEventListener(MouseEvent.MOUSE_UP, handleMouse);
}
private function handleMouse(e:MouseEvent):void
{
switch(e.type)
{
case MouseEvent.MOUSE_DOWN:
{
_targetPosition = new Point(_target.x, _target.y);
_target.addEventListener(Event.ENTER_FRAME, update);
update(null);
break;
}
case MouseEvent.MOUSE_UP:
{
_target.removeEventListener(Event.ENTER_FRAME, update);
break;
}
}
}
private function update(e:Event):void
{
var mouseX:Number = _target.parent.mouseX;
var mouseY:Number = _target.parent.mouseY;
var dx:Number = mouseX - _targetPosition.x;
var dy:Number = mouseY - _targetPosition.y;
var angle:Number = Math.atan2(dy, dx);
//trace(angle);
var directionX:int = 0;
var directionY:int = 0;
if (dx * dx + dy * dy > Setting.BLOCK_WIDTH * Setting.BLOCK_WIDTH) // minimum distance before snap
{
if (angle < 0 * HALF_PI - QUART_PI) { directionX = 0; directionY = -1; }
else if (angle < 1 * HALF_PI - QUART_PI) { directionX = 1; directionY = 0; }
else if (angle < 2 * HALF_PI - QUART_PI) { directionX = 0; directionY = 1; }
else if (angle < 3 * HALF_PI - QUART_PI) { directionX = -1; directionY = 0; }
else { directionX = 1; directionY = 0; }
}
_target.x = _targetPosition.x + (directionX * (Setting.BLOCK_WIDTH + Setting.BLOCK_DISTANCE))
_target.y = _targetPosition.y + (directionY * (Setting.BLOCK_HEIGHT + Setting.BLOCK_DISTANCE))
}
public function set target(value:DisplayObject):void
{
_target = value;
}
}
}
對不起,這是因爲我的英語。這兩個答案很重要: 「因爲你不能在中間釋放它」 你不應該能夠在兩個塊之間釋放它,它應該捕捉到其中一個塊。 「 ' – 2011-12-27 20:37:02
」我希望它總是移動到中心。「 它應該始終穿過原始位置。這是實際的問題。如果我將塊拖到左側(例如),那麼我的目標位置是左側塊。它應該移動到左邊。但是,當我沒有釋放鼠標並且像塊一樣向上移動/拖動塊時,塊應該不會向上移動,因爲您應該將鼠標移到右側(回到中間位置),而不是拖動塊它起來。 – 2011-12-27 20:37:08
順便說一句Ive用代碼更新了這個問題。 – 2011-12-27 20:51:19