2017-04-04 1 views
0

グリッドを色付きのタイルで覆うという単純なゲームの作成に問題があります。 Arrayを使用してドラッグ&ドロップ機能を設定しましたが、グリッド上の場所に簡単にスナップする方法はありません。私はグリッド上の場所をsnapA1からsnapJ10までの名前のムービークリップにしました。文字列とインスタンス名は10個ずつグループ化されていましたが、移動する必要がないので、これらのクリップはArrayから削除されています。私が抱えている問題は、私が使用する関数は単一の場所にスナップすることができるだけであるということです。基本的には、2つ以上のオブジェクトのグループが互いの上にスナップすることを可能にする短い手を探しているだけです。好ましくは、ブルートフォースコードを使わずに、私は同じコードのインスタンスを20,000個もしません。 は、以下のこれまでのところ唯一のスナップ先の場所配列を使用して複数のオブジェクトを複数の場所にスナップする

import flash.events.Event; 
import flash.events.MouseEvent; 

var greenArr:Array = new Array 
(greenTablet1, greenTablet2, greenTablet3, greenTablet4, greenTablet5, 
greenTablet6, greenTablet7, greenTablet8, greenTablet9, greenTablet10, 
greenTablet11, greenTablet12, greenTablet13, greenTablet14, greenTablet15, 
greenTablet16, greenTablet17, greenTablet18, greenTablet19, greenTablet20); 


for (var i1:uint =0; i1 < greenArr.length; i1++) { 
greenArr[i1].addEventListener(MouseEvent.MOUSE_DOWN, dragG); 
greenArr[i1].addEventListener(MouseEvent.MOUSE_UP, dropG); 
} 


function dragG(event:MouseEvent):void { 
event.currentTarget.startDrag(); 
} 


function dropG(event:MouseEvent):void { 
event.currentTarget.stopDrag(); 
} 




stage.addEventListener(MouseEvent.MOUSE_UP, stopMotionG1); 

function stopMotionG1(evt:MouseEvent):void { 
snapInPlaceG1(); 
} 
function snapInPlaceG1():void { 
if (snapA1.hitTestObject(greenTablet1)) { 
greenTablet1.x = snapA1.x; 
greenTablet1.y = snapA1.y; 


}} 
+0

これは、コードのインスタンスを1つだけ使用して行うことができます。あなたの 'greenTables'インスタンスはすべて同じライブラリオブジェクトですか? – BadFeelingAboutThis

+0

グリッドをもう少し説明できますか? (目に見えるもの、水平/垂直の線の数、FlashProで作成する必要があるのか​​、それともコードで行う必要があるのだろうか?) - 可能性が高い - グリッドとオブジェクトが背景グラフィックに対応していて、あなたはこれをコードのごく少数の行で行うことができます。 – BadFeelingAboutThis

答えて

0

簡単にできること私が持っているコードです。必要なのは、標準的なドラッグの使用をやめ、カスタマイズしたものを開発することです。次に、同じサイズのスクリプトを使用して、ドラッグ可能なオブジェクトとスナップポイントを同じサイズにすることができます。

package 
{ 
    import flash.display.Sprite; 

    import flash.geom.Point; 

    import flash.events.Event; 
    import flash.events.MouseEvent; 

    // Main class. 
    public class Snap extends Sprite 
    { 
     private var Circus:Vector.<Sprite>; 
     private var Dots:Vector.<Point>; 

     public function Snap() 
     { 
      Dots = new Vector.<Point>; 
      Circus = new Vector.<Sprite>; 

      // Create snap points, put them on stage and keep their coordinates. 
      for (var i:int = 1; i * 100 < stage.stageWidth; i++) 
      { 
       for (var j:int = 1; j * 100 < stage.stageHeight; j++) 
       { 
        var aDot:Sprite = new Sprite; 
        var aPos:Point = new Point(i * 100, j * 100); 

        aDot.graphics.beginFill(0xFF0000, 0.3); 
        aDot.graphics.drawCircle(0, 0, 4); 
        aDot.x = aPos.x; 
        aDot.y = aPos.y; 

        addChild(aDot); 
        Dots.push(aPos); 
       } 
      } 

      var aCircas:int = 2 + 3 * Math.random(); 

      // Add random number of draggable objects. 
      while (Circus.length < aCircas) 
      { 
       Circus.push(addCirca()); 
      } 
     } 

     // This method adds a draggable circle of random radius, color, position. 
     private function addCirca():Sprite 
     { 
      var result:Sprite = new Sprite; 

      result.graphics.lineStyle(0, 0); 
      result.graphics.beginFill(0x1000000 * Math.random(), 0.5); 
      result.graphics.drawCircle(0, 0, 20 + 20 * Math.random()); 

      result.x = stage.stageWidth * Math.random(); 
      result.y = stage.stageHeight * Math.random(); 

      addChild(result); 

      result.buttonMode = true; 
      result.useHandCursor = true; 
      result.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); 

      return result; 
     } 

     // *** DRAGGING AN ITEM ** // 

     // Snap radius. 
     private var toleRance:int = 20 

     // Mouse offset. 
     private var offx:Number = 0; 
     private var offy:Number = 0; 

     // Dragged object. 
     private var TheDrag:Sprite; 

     private function startDragging(e:MouseEvent):void 
     { 
      // Get the dragged object reference. 
      TheDrag = e.currentTarget as Sprite; 

      // Bring it to front. 
      setChildIndex(TheDrag, numChildren - 1); 

      // Record the mouse offset. If you comment the next 2 lines 
      // the object will just snap to mouse by its center. 
      offx = TheDrag.x - mouseX; 
      offy = TheDrag.y - mouseY; 

      // Watch the object position every frame. 
      addEventListener(Event.ENTER_FRAME, onFrame); 

      // Subscribe for certain events that mean the end of dragging. 
      stage.addEventListener(Event.MOUSE_LEAVE, stopDragging); 
      stage.addEventListener(MouseEvent.MOUSE_UP, stopDragging); 
     } 

     private function onFrame(e:Event):void 
     { 
      // Get new object (x,y) according to the mouse position. 
      var aPos:Point = new Point; 

      aPos.x = mouseX + offx; 
      aPos.y = mouseY + offy; 

      // Browse through the list of snap points. 
      for (var i:int = 0; i < Dots.length; i++) 
      { 
       // Snap to a point within tolerance pixels radius. 
       if (Point.distance(aPos, Dots[i]) < toleRance) 
       { 
        aPos = Dots[i]; 
        break; 
       } 

       // If there are no points withing the given radius, 
       // then the object will use mouse positioning. 
      } 

      TheDrag.x = aPos.x; 
      TheDrag.y = aPos.y; 
     } 

     private function stopDragging(e:Event):void 
     { 
      TheDrag = null; 

      // Stop monitoring. 
      removeEventListener(Event.ENTER_FRAME, onFrame); 

      // Stop waiting for events to cancel dragging. 
      stage.removeEventListener(Event.MOUSE_LEAVE, stopDragging); 
      stage.removeEventListener(MouseEvent.MOUSE_UP, stopDragging); 
     } 
    } 
} 
+0

ありがとう、このようなことをやってしまいました –

+0

これまでのフォローアップでは、1つの配列から1つのクリップだけを別の配列のクリップに重ねることができます –

+0

@LeonardRodriguezどういう意味ですか?あなたは多対多を求めました。多対多を持っています。 1対多は多くの= 1対多のケースです。 – Organis

関連する問題