ブロックをドラッグできるブロックゲームを作成します。私は最も親しみやすいドラッグの動きを探しています。それは、水平または垂直、および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;
}
}
}
申し訳ありませんが、これは私の英語のためです。これらの2つの答えは重要です: "中に解放することはできません" 2つのブロックの間で解放することはできません。ブロックの1つにスナップする必要があります。 ' –
「いつも中心に移動したい」 これは常に元の位置を通過する必要があります。これが実際の問題です。ブロックを左にドラッグすると(たとえば)、目標位置は左のブロックになります。左に移動する必要があります。しかし、私がマウスを離してブロックを上へ移動/ドラッグするとき、ブロックを上に移動しないでください。マウスを右に動かす必要があります。それをアップ。 –
私はコードで質問を更新しました。 –