2015-06-10 2 views
0

В настоящее время я придерживаюсь своего подхода ниже. Я не совсем уверен, что использование метода «hitTestObject» подходит для объединения частей в соответствующее место. Я смог по крайней мере совместить шахматный фрагмент с их соответствующим местоположением (это лучшее, что я могу сделать, и я чувствую, что делаю это неправильно), но теперь я застрял в подсчете количества штук на самом деле в их правильных местах. например когда я перемещаю пешку на другую плиту, она все равно будет считаться одной, я также хочу избежать повторного подсчета, например. Если пешка уже находится в правильном месте, она будет считаться как 1, и если она будет перемещена, тогда этот счет будет удален. Только считайте части, которые находятся в правильной плитки.Сопряжение перетаскиваемого объекта с целевым объектом в AS3

Моя цель состоит в том, чтобы сделать все шахматные фигуры перетаскиваемыми и определить, находятся ли они в соответствующем месте. Если ВСЕ шахматные фигуры находятся в своем местоположении, он будет отслеживать или вызывать функцию.

Спасибо!

import flash.events.Event; 
import flash.display.MovieClip; 
import flash.events.MouseEvent; 

/* Declaring an X and Y variable to be used as a reset container */ 
var xPos: int, yPos: int; 

/* Attaching event listeners for each chess piece */ 
addListeners(
    king, queen, bishop_1, bishop_2, knight_1, knight_2, rook_1, rook_2, 
    pawn_1, pawn_2, pawn_3, pawn_4, pawn_5, pawn_6, pawn_7, pawn_8); 


/* Getting the original x and y postion to be used as a reset */ 
function getPosition(currentTarget: Object): void { 
    xPos = currentTarget.x; 
    yPos = currentTarget.y; 
} 

/* Function to get the suffix value of an object. example, I need to get the value 4 from "pawn_4" */ 
function getLastCharInString($s: String, $pos: Number): String { 
    return $s.substr($s.length - $pos, $s.length); 
} 

/* A simple function that rotates the chess piece */ 
function lift(object: Object, rot: Number) { 
    object.rotation = rot; 
} 

function dragObject(e: MouseEvent): void { 
    getPosition(e.currentTarget); 
    lift(e.currentTarget, -10); 

    getChildByName(e.currentTarget.name + "_hs").alpha = 1; 


    e.currentTarget.startDrag(); 
} 

/* This variable is supposed to hold the value of each piece that is correctly placed in each tile. 
The total score should be 16 as there are 16 pieces. Only correcly placed piece should be added in the total score. */ 
var counter:int; 

function stopDragObject(e: MouseEvent): void { 


    var curretTarget = e.currentTarget.name; 

    lift(e.currentTarget, 0); 

     /* Hide active hotspots */ 
    getChildByName(e.currentTarget.name + "_hs").alpha = 0; 

    var multiplePieceSufix = Number(getLastCharInString(curretTarget, 1)); 

    if (multiplePieceSufix >= 1) { 


     /* Boolean variables that checks whether the current piece is active*/ 
     var isPawn: Boolean = false, 
      isBishop: Boolean = false, 
      isKnight: Boolean = false, 
      isRook: Boolean = false, 
      currentTargeName; 

     var widthDiff = getChildByName(e.currentTarget.name + "_hs").width - getChildByName(e.currentTarget.name).width/2; 
     var heightDiff = getChildByName(e.currentTarget.name + "_hs").height - getChildByName(e.currentTarget.name).height/2; 

     if (curretTarget.substr(0, 4) == "pawn") { 
      isPawn = true; 
     } else if (curretTarget.substr(0, 6) == "bishop") { 
      isBishop = true; 
     } else if (curretTarget.substr(0, 6) == "knight") { 
      isKnight = true; 
     } else if (curretTarget.substr(0, 4) == "rook") { 
      isRook = true; 
     } 


     if (isPawn == true) { 

      /* there are total of 8 pieces of pawn */ 
      for (var w = 1; w < 9; w++) { 

       currentTargeName = this["pawn_" + w + "_hs"]; 

       if (e.target.hitTestObject(currentTargeName)) { 

        /* For some reason the chess pieces are not aligning with their "_hs" version, I already checked their registry point and it seem to be normal. 
        so to fix, I had to manually add some hard coded values to adjust their location. */ 
        e.currentTarget.x = currentTargeName.x - 8; 
        e.currentTarget.y = currentTargeName.y + currentTargeName.height; 

       } 
      } 

     } else if (isBishop == true) { 

      for (var x = 1; x < 3; x++) { 

       currentTargeName = this["bishop_" + x + "_hs"]; 

       if (e.target.hitTestObject(currentTargeName)) { 

        e.currentTarget.x = currentTargeName.x - 9; 
        e.currentTarget.y = currentTargeName.y + currentTargeName.height - 18; 

       } 
      } 

     } else if (isKnight == true) { 

      for (var y = 1; y < 3; y++) { 

       currentTargeName = this["knight_" + y + "_hs"]; 

       if (e.target.hitTestObject(currentTargeName)) { 

        e.currentTarget.x = currentTargeName.x - 8; 
        e.currentTarget.y = currentTargeName.y + currentTargeName.height; 

       } 
      } 

     } else if (isRook == true) { 

      for (var z = 1; z < 3; z++) { 

       currentTargeName = this["rook_" + z + "_hs"]; 

       if (e.target.hitTestObject(currentTargeName)) { 

        e.currentTarget.x = currentTargeName.x - 8; 
        e.currentTarget.y = currentTargeName.y + 62; 

       } 
      } 

     } 


    } else { 


     if (e.target.hitTestObject(getChildByName(e.currentTarget.name + "_hs"))) { 

      /* Again, I'm not sure why the pieces are not aligning as intended. 
      modX and modY is a holder for the adjustment value. I'm not comfortable 
      seeing this approach myself, but I also run out of ideas how to fix it. */ 

      var modX: Number, modY: Number; 

      if (e.currentTarget.name == "king") { 
       modX = 11; 
       modY = 53; 
      } else { 
       modX = 11; 
       modY = 29; 
      } 

      e.currentTarget.x = getChildByName(e.currentTarget.name + "_hs").x - modX; 
      e.currentTarget.y = getChildByName(e.currentTarget.name + "_hs").y + getChildByName(e.currentTarget.name + "_hs").height - modY; 

     } 

    } 

    /* This is supposed to add to the total score or count of how many pieces are placed correctly. 
    Thie problem with thi scounter, as it also counts any piece that is places to any "_hs" */ 
    counter++; 

    trace(counter); 

    e.currentTarget.stopDrag(); 
} 


function addListeners(...objects): void { 
    for (var i: int = 0; i < objects.length; i++) { 
     objects[i].addEventListener(MouseEvent.MOUSE_DOWN, dragObject); 
     objects[i].addEventListener(MouseEvent.MOUSE_UP, stopDragObject); 

     // hide hotspots 
     getChildByName(objects[i].name + "_hs").alpha = 0; 

    } 
} 

Источник: Download the FLA here

-

Обновления:

Я добавил комментарии в своем коде, чтобы уточнить, что я пытаюсь сделать.

Я планирую сделать настольную игру со вспышкой, которая имеет аналогичную функцию и поведение. Пользователь может перетащить объект на указанную плитку и проверить, принадлежит ли этот объект или нет.

+0

Благодарим за предоставление подробностей. Чтобы помочь хотя (поскольку большинство людей не хотят тратить весь день, пытаясь понять это), подумайте о том, чтобы добавить некоторые кодовые комментарии в свой код, чтобы объяснить, что делают определенные вещи. например, какая каждая переменная предназначена для (если не очень очевидна по имени), какая функция предназначена для и т. д. Возможно, также будет полезно рассказать больше о цели вашей игры. Похоже, что пользователь должен перетащить все шахматные фигуры в их подходящую начальную плиту? – BadFeelingAboutThis

+0

@Batman, Спасибо, что просмотрели мой код/​​вопрос. Я добавил несколько комментариев в свой код, надеюсь, мои комментарии имеют смысл. – Pennf0lio

+0

Получил ли мой ответ смысл? Вы все поняли? – BadFeelingAboutThis

ответ

1

Рассмотрев свой код, ваш вопрос довольно широк. Я собираюсь спать с тем, что кажется вашей главной заботой - счет/счет правильно перемещены.

Прямо сейчас, вы делаете следующий каждый раз, когда объект перетаскивается:

counter++; 

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

Что вам нужно сделать, это связать флаг с каждым объектом, чтобы указать, находится ли он в правильном местоположении или нет, и установить этот флаг в соответствующее значение каждый раз, когда этот объект выполняется перетаскиванием.

Что-то вроде этого:

//don't use target, use currentTarget 
if (e.currentTarget.hitTestObject(currentTargeName)) { 
     e.currentTarget.correct = true; //since MovieClips are dynamic, you can just make up a property on them and assign a value to it. 

     //to fix your alignment: 
     e.currentTarget.x = currentTargeName.x + ((currentTargetName.width - e.currentTarget.width) * 0.5); 
     e.currentTarget.y = currentTargeName.y + currentTargeName.height; 
}else{ 
     //if the hit test is false, mark it as NOT correct 
     e.currentTarget.correct = false; 
} 

Затем, позже, чтобы узнать текущее значение счетчика, перебирать все части и проверить их значение correct. Это было бы намного проще, если бы все ваши части были в массиве.

var allPieces:Array = [king, queen, bishop_1, bishop_2, knight_1, knight_2, rook_1, rook_2, 
pawn_1, pawn_2, pawn_3, pawn_4, pawn_5, pawn_6, pawn_7, pawn_8]; 

function countCorrect():Boolean { 
    var ctr:int = 0; 
    for(var i:int=0;i<allPieces.length;i++){ 
     if(allPieces[i].correct) ctr++; 
    } 
    return ctr; 
} 

trace(countCorrect() + " of " allPieces.length " are correct"); 

Как и в сторону, это лучший способ сделать это было бы с некоторыми файлами пользовательских классов. Однако для этого потребуется полный рефакторинг вашего кода.

Кроме того, вы, вероятно, не хотите использовать hitTestObject, так как даже если кусок в основном по соседству, он по-прежнему будет истинным, если 1 пиксель его связанного касания 1 пиксель плитки.Лучше было бы сделать hitTestPoint на плитке и пройти в центральной точке куска (середина куска должна касаться плитки, чтобы она подсчитывалась).

//a point that is the center of the events current target (the piece) 
var point:Point = new Point(); 
point.x = e.currentTarget.x + (e.currentTarget.width * 0.5); 
point.y = e.currentTarget.y - (e.currentTarget.height * 0.5); 

if (currentTargetName.hitTestPoint(point)) { 
+0

Ничего себе! Brilliant! Я прошу прощения за поздний ответ, я был занят какое-то время. Мой самый большой улов с этим решением - присвоение свойства movieClip. Это было бы очень удобно в некоторых моих проектах. Спасибо! – Pennf0lio

Смежные вопросы