2017-04-04 3 views
0

격자가 채색 된 타일로 덮는 간단한 게임을 만드는 데 어려움이 있습니다. 배열을 사용하여 드래그 앤 드롭 기능을 설정했지만 그리드의 위치에 쉽게 스냅 할 수있는 방법을 찾을 수 없습니다. 격자의 위치를 ​​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 객체에 해당합니까? 코드의 인스턴스를 하나만 사용하여이 작업을 수행 할 수 있습니다. 동일한 라이브러리 객체의 모든'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 무엇을 의미하는지 모르겠습니다. 당신은 many-to-many를 요청했습니다 - 당신은 many-to-many를가집니다. 일대 다 (one-to-many)는 일대 다 (one-to-many) 경우가 많습니다. – Organis

관련 문제