2011-12-27 7 views
0

ブロックをドラッグできるブロックゲームを作成します。私は最も親しみやすいドラッグの動きを探しています。それは、水平または垂直、および1ブロック位置だけを動かす必要があります。それはスナップする必要があります(目的の位置に簡単に移動してください)、中間(ブロック間)で離すことはできません。それはちょっとiPhoneのスイッチボタンのように動作するはずですが、十字で表示されます。私はブロックの元の位置にマウスの角度をチェックし、どの方向を動かすべきかをチェックすることでそれを試みました。私はそれが常にセンター(元の位置)を移動するためにそれをしたい。というのは;左の位置から上の位置にアニメートすることはできません。最初に中心にアニメートする必要があります。ゲームのクロスドラッグの動作

ブロックは左上揃えであり、ブロック間にはスペースがあります。

これを行うにはどのような方法が最適ですか? Drag behavior game example

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; 
     } 

    } 

} 

答えて

1

これを行う最善の方法は、おそらく自分で見つけなければならないことでしょう。

すべてのアプリケーションと同じように、問題をチャンクに分解し、問題のある問題を特定してから、最初の構造を実装して、改善の余地があります。

私は個人的に

"cause you cannot release it in the middle" //middle of what, of the cross? 
    "I want it always to go move to the center." // how's that possible? 
    "It should only move horizontal or vertical, and 1 block position only" 
    "It should kinda behave like an iPhone switch button, but in a cross" 

...あなたのゲームのあらゆる側面を理解していない、私はすべてのこれらの行が混乱を見つけます。それが1つのブロックだけ動いているならば、それはどのようにして十字架になることができますか?

これらの問題を除いて、まずブロッククラスを作成します。

何が必要ですか?

- Move Up 
- Move Down 
- Move Left 
- Move Right 

ここでは、1つの方法または1つの移動方法を実装する選択肢があります。あなたの選択:

ブロックがどこに行くのか分かっていれば、簡単にスナップすることができます。トゥイーンの方法では、スムーズに動かすために、目的地点、遅延、イージー機能が必要です。

方向はあまりにも難しくありません、マウスの動きでは、あなたが方向を持っているときに、簡単に方向を計算することができます、あなたは目的地を持っています。目的地がある場合は、その方法があります。

ので

private var left:int = 0; 
    private var right:int = 1; 
    private var top:int = 2; 
    private var down:int = 3; 

    private var tweenDelay:Number = .5; 

    // event listeners 
    private function mouseDownListener(event:MouseEvent):void{}; 
    private function mouseUpListener(event:MouseEvent):void{}; 
    private function mouseMoveListener(event:MouseEvent):void{}; 

    //get a couple of coordinates, feed them to the method & 
    //return an int (or a String) 
    private function getDirection(params:Object):int; 

    private function tweenBlock(direction:String):void{} 

は、あなたのブロックの動きを制限するには、いくつかのブール値を投げるか、行かない長方形を使用して...、あなたのブロックのクラスが持つプロパティ&方法のいくつかを総括します立入禁止で。 Voila! :)

私はたぶん忘れてしまったかもしれないが、いくつかのものを見落としたが、これはあなたを開始する必要があります。

一方、上記のすべてが既にわかっていて、問題が解決しない場合は、問題の内容を正確に教えてください。もっと役立つ可能性があります。

+0

申し訳ありませんが、これは私の英語のためです。これらの2つの答えは重要です: "中に解放することはできません" 2つのブロックの間で解放することはできません。ブロックの1つにスナップする必要があります。 ' –

+0

「いつも中心に移動したい」 これは常に元の位置を通過する必要があります。これが実際の問題です。ブロックを左にドラッグすると(たとえば)、目標位置は左のブロックになります。左に移動する必要があります。しかし、私がマウスを離してブロックを上へ移動/ドラッグするとき、ブロックを上に移動しないでください。マウスを右に動かす必要があります。それをアップ。 –

+0

私はコードで質問を更新しました。 –

関連する問題