2017-04-04 33 views
0

難以製作一個簡單的遊戲,涉及用彩色瓷磚覆蓋網格。我已經使用Arrays來建立拖放功能,但無法找到方法使它們輕鬆捕捉到網格上的位置。我已經將網格中的位置製作成名爲snapA1到snapJ10的影片剪輯,全部由10個字母組成的實例名稱進行匹配,但這些剪輯已從陣列中移除,因爲它們不需要移動。我一直存在的問題是,我使用的任何函數只能用於捕捉單個位置。基本上我只是尋找一個簡短的手,讓兩個或更多的對象組相互對齊,最好不用暴力代碼,我哄你不到,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

因此要弄清楚,每個greenTableX對應1個snapAX對象?您只能使用代碼的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

這樣的事情,有沒有辦法讓它成爲這樣,只有一個陣列中的一個片段可以堆疊到另一個陣列中的片段上 –

+0

@LeonardRodriguez不太確定你的意思。你要求多對多 - 你有多對多。一對多是一對多= 1對多的情況。 – Organis