2013-11-26 2 views
0

Так что это может быть простое решение, но я не могу понять, как это сделать. То, что я делаю, создает игру с перетаскиванием n, и все хорошо и красиво, но если вы отпустите часть слишком рано, она автоматически привяжется к ближайшему доступному местоположению (на основе позиций, которые у меня есть в массиве Выбери из). Я действительно ищу его только для привязки, если он говорит, что он находится в пределах мувиклипа, или он находится в радиусе 20 пикселов мувиклипа. Надеюсь, вы, ребята, можете мне помочь! Он инициализируется событием mouseUp.Глядя на привязку объекта, только когда объект достаточно близко

Код:

var dragArray:Array = [it_1, it_2, it_3, it_4, it_5, it_6, it_7, it_8, it_9]; 
var matchArray:Array = [mat_1, mat_2, mat_3, mat_4, mat_5, mat_6, mat_7, mat_8, mat_9] 
var placeArray:Array = [0, 1, 2, 3, 4, 5, 6, 7, 8]; 
// points to snap to 
var pointList:Array = new Array(); 
pointList.push(new Point(mat_1.x, mat_1.y)); 
pointList.push(new Point(mat_2.x, mat_2.y)); 
pointList.push(new Point(mat_3.x, mat_3.y)); 
pointList.push(new Point(mat_4.x, mat_4.y)); 
pointList.push(new Point(mat_5.x, mat_5.y)); 
pointList.push(new Point(mat_6.x, mat_6.y)); 
pointList.push(new Point(mat_7.x, mat_7.y)); 
pointList.push(new Point(mat_8.x, mat_8.y)); 
pointList.push(new Point(mat_9.x, mat_9.y)); 
////where points are placed after being snapped to 
var spliced:Array= new Array(); 

function SnapEvent(event:MouseEvent) { 

//// the clip we're dragging//// 
var referencePoint:Point = new Point(currentClip.x, currentClip.y); 
var resultPoints:Array = PointTester.findClosest(referencePoint, pointList, 1); 

////returns nearest "mat" and snaps current clip to it//// 
for each(var result:Object in resultPoints) { 
//trace("Point is at:", result.point.x, ", ", result.point.y, " that's ", result.distance, " units away"); 
     currentClip.x=result.point.x; 
     currentClip.y=result.point.y; 
     var posOfMat:int = pointList.indexOf(result.point); 
     trace("index: "+pointList[posOfMat]); 
     spliced.push(pointList[posOfMat]); 
     pointList.splice(posOfMat,1); 
     //trace("spliced: "+spliced); 
     trace("length: "+pointList.length); 
     } 
     //trace("result: "+result.point); 
     trace("full spliced: "+spliced.length); 
} 
+0

Какова ваша конкретная проблема? Вы не знаете, как рассчитать расстояние? Вы не знаете, как сравнить результаты дистанции, чтобы приблизиться? – prototypical

+0

В настоящее время он сравнивает массив pointList, чтобы найти ближайший. Проблема здесь, я только хочу, чтобы она начала сравнивать, когда я говорю на расстоянии 10 пикселей от нее. –

+0

Итак, у меня есть условие, которое не оценивает точки, если они не находятся на этом расстоянии. – prototypical

ответ

0

Внутри цикла for each вы можете проверить, действительно ли расстояние точки РЕЗУЛЬТАТА составляет менее 20 пикселей, и только привязать текущий клип к результату если это так. Вот пример:

... 

function SnapEvent(event:MouseEvent) { 

    //// the clip we're dragging//// 
    var referencePoint:Point = new Point(currentClip.x, currentClip.y); 
    var resultPoints:Array = PointTester.findClosest(referencePoint, pointList, 1); 

    ////returns nearest "mat" and snaps current clip to it//// 
    for each(var result:Object in resultPoints) { 
     if(result.distance < 20){ //if the result point's distance is less than 20 pixels away from the current clip 
      currentClip.x=result.point.x; // snap the current clips position 
      currentClip.y=result.point.y; 
      var posOfMat:int = pointList.indexOf(result.point); 
      trace("index: "+pointList[posOfMat]); 
      spliced.push(pointList[posOfMat]); 
      pointList.splice(posOfMat,1); 
      //trace("spliced: "+spliced); 
      trace("length: "+pointList.length); 
     } 
     //otherwise do nothing 
    } 
    //trace("result: "+result.point); 
    trace("full spliced: "+spliced.length); 
} 

Надеюсь, это поможет.

+0

Это ПОЛНОСТЬЮ помогло, вы точно знали, для чего я собираюсь. СПАСИБО. Иногда это одна из тех вещей, кто-то показывает вам, и у вас просто есть «а-а-а-а!». момент. –

0

С точки зрения логики, вот что я хотел бы сделать:

Loop через места (ваш pointList)

вытолкнуть объект, содержащий местоположение и расстояние от шт. в массив

Сортировка результирующего массива в порядке возрастания на основе свойства расстояния объектов

Первый элемент результирующего отсортированного массива Ваше ближайшее расположение

+0

У меня есть 9 объектов, которые привязаны к 9 другим объектам. Здесь он выбирает, где находится текущий объект, который я захватил, и оттуда, ближайшая точка, которая находится в массиве «resultPoints» - которая представляет собой комбинацию текущего местоположения и элемента pointList.Resulting с ближайшим к текущему местоположению. Если вы начнете вытаскивать объект, то сразу же отпустите его перед тем, как приблизиться к «мату» (в котором каждый «матовый» - это место, где вы можете поместить перетаскиваемый объект, а значения x и y указаны в списке точек), он просто захватывает ближайший мат рядом, хотя вы едва перемещали перетаскиваемый предмет. –