2013-12-03 3 views
0

Название довольно расплывчато, извините за это. Не могу придумать, как задать этот вопрос в одном предложении.AS3 Удаление объекта с этапа

я буду суммировать то, что мой код должен делать:

  1. Запрашивает пользователя число между 1-99. Это число - количество мин, которые появятся на сцене.
  2. Как только шахты появляются на сцене, пользователь может щелкнуть любую шахту, и произойдет «взрыв».
  3. Шахта, которая только что взорвалась, будет удалена со сцены.
  4. Затем «взрыв» отправит ближайшие два.
  5. Эти две мины будут удалены со сцены, а еще две мины будут выключены. (т.е. цепная реакция)

У меня есть шаги 1-3. У меня возникают проблемы с «откладыванием» ближайших двух мин (т.е. удаление со сцены).

Я дал возможность определить два ближайших мин от последнего взорванного, но я не могу найти способ их удаления.

Код:

package 
{ 

import flash.display.MovieClip; 
import flash.text.TextField; 
import flash.text.TextFieldType; 
import flash.events.*; 

public class Minefield extends MovieClip 
{ 

    var inputNumber:int; 
    var iField:TextField = new TextField(); 
    var button:iButton = new iButton(); 
    var i:int; 
    var mines:Array = new Array(); 

    public function Minefield() 
    { 

     var explosion:iExplosion = new iExplosion(); 

     iField.type = "input"; 
     iField.height = 18; 
     iField.x = 460; 
     iField.y = 275; 
     iField.border = true; 
     iField.restrict = "0-9"; 
     iField.maxChars = 2; 
     stage.focus = iField; 
     addChild(iField); 
     addChild(button); 
     button.x = 450; 
     button.y = 175; 
     button.buttonMode = true; 
     button.addEventListener(MouseEvent.CLICK, UponClick); 


    } 

    function AddMines() 
    { 
     for (i = 0; i < inputNumber; i++) 
     { 
      CreatorOfMine(); 
      mines[i].addEventListener(MouseEvent.CLICK, UponMineClick) 
      mines[i].buttonMode = true; 
     } 
    } 

    function CreatorOfMine() 
    { 
     mines[i] = new Mine(); 
     MineLocation() 
    } 

    function MineLocation() 
    { 
     mines[i].x = Math.round(Math.random() * 925); 
     mines[i].y = Math.round(Math.random() * 525); 
     mines[i].rotation = Math.random() * 360; 
     addChild(mines[i]); 

    } 

    function UponClick(e:MouseEvent) 
    { 
     inputNumber = int(iField.text); 
     RemoverOfChildren(); 

    } 

    function RemoverOfChildren() 
    { 
     removeChild(button); 
     removeChild(iField); 
     AddMines(); 
    } 

    function UponMineClick(event:MouseEvent) 
    { 
     var mineObject:Mine = Mine(event.currentTarget) 
     var expl:iExplosion = new iExplosion() 
     expl.x = mineObject.x 
     expl.y = mineObject.y 
     expl.rotation = mineObject.rotation 
     addChild(expl) 
     removeChild(mineObject) 
     ChainReaction(mineObject) 

    } 

    function ChainReaction(mineObject:Mine) 
    { 
     Distances(mineObject,i) 


    } 


    function Distances(mineObject:Mine, i:int) 
    { 
     var DistanceArray:Array = new Array() 
     var x1:Number = mineObject.x; 
     var y1:Number = mineObject.y; 
     for (var q:int = 0; q < (mines.length); q++){ 
      if (q != i){ 
       var x2:Number = mines[q].x 
       var y2:Number = mines[q].y 

       var dy:Number = y2 - y1 
       var dx:Number = x2 - x1 

       var dist:Number = Math.sqrt(Math.abs(dx*dx + dy*dy)) 
       if (dist != 0) 
       { 
        DistanceArray[q] = [dist] 
        //trace(dist) 
        trace(DistanceArray[q]) 
       } 
       else if (dist == 0) 
       { 
        continue 
       } 
      } 
     } 
     FindNearestMines(DistanceArray) 
    } 

    function FindNearestMines(DistanceArray:Array){ 

     DistanceArray.sort(Array.NUMERIC); 
// Sorted my distances numerically so that I can figure out the closest two. How do I remove those two mines from the stage? 


    } 

} 
} 
+0

У вас есть мины в массиве. Не можете ли вы просто использовать что-то вроде removeChild (мины [x])? –

+0

Ухм, но как? Я не знаю, кто мой. В принципе, в одном массиве у меня есть мины, но в случайных местах. В другом случае у меня есть расстояния от одной шахты до всех других шахт. Поскольку мне нужно удалить ближайшие два, я отсортировал массив численно, и с этим я знаю, что первые два нужно удалить. removeChild (DistanceArray [0,1]) не работает, очевидно, потому что ничего в этом массиве не находится на сцене. –

+0

Не уверен, что вы можете удалить 2 детей одновременно. Hve вы попробовали removeChild [0] и removeChild [1]? Кроме того, я обнаружил, что вам иногда приходится удалять такой объект: object.parent.removeChild (object). –

ответ

0

Оки, я присмотрелся на свой код, и вот мое предложение.

В функции расстояния, вы можете сделать что-то вроде этого:

Сделать 2 временных массивов. Один называется mines_l и один называется distances_l Возьмите первую шахту, вставьте ее в mines_l и поместите ее расстояние в distance_l. Тогда иритрат через ваши мины. Каждая шахта сравнивается с расстояниями_1 [0]. Если он ближе, чем disans_l [0], переместите расстояния_l [0] и mines_l [0] в ... [1]. Если шахта ближе, чем ... [1] но не ближе, чем ... [0], затем замените ... [1] с новой шахтой.

, в конце концов, у вас будут две ближайшие мины в массиве mines_l.

Кроме того, вы можете рассмотреть возможность изменения массива мин в свойство. В настоящее время у вас нет механизма для удаления мин из массива. Если вы превратите его в свойство, вы можете просто собрать текущие мины в массив, когда это необходимо.

0

Создайте массив, в котором каждый элемент массива представляет собой объект, содержащий поля «mine» и «distance». Затем отсортируйте массив по расстоянию с помощью Array.sortOn («distance», Array.NUMERIC).

В этом примере вычисляются расстояния _target до массива _movieClips и возвращается новый массив объектов movieClip/distance, отсортированных по расстоянию.

function getClosestMovieClips(_target:MovieClip, _movieClips:Array, _num:int):Array{ 

    // This array will store our objects. 
    var tempArray:Array = []; 

    // Loop through _movieclips 
    for(var i:int = 0; i < _movieClips.length; i++){ 

     // Don't check _target's distance 
     if (_target != _movieClips[i]){ 

      // Distance calculation 
      var dy:Number = _movieClips[i].y - _target.y; 
      var dx:Number = _movieClips[i].x - _target.x; 

      var dist:Number = Math.sqrt(Math.abs(dx*dx + dy*dy)); 

      // New object contains mc and distance 
      var tempObject:Object = { 
       mc:_movieClips[i], 
       distance:dist 
      } 

      // Push object into tempArray 
      tempArray.push(tempObject); 
     } 
    } 

    // Sort tempArray based on distance field 
    tempArray.sortOn("distance",Array.NUMERIC); 

    // return new array with length of the parameter _num 
    return tempArray.slice(0,_num); 
} 
0

Как ваш код работает с этими функциями:

function CreatorOfMine() 
{ 
    mines[i] = new Mine(); 
    MineLocation() 
} 

function MineLocation() 
{ 
    mines[i].x = Math.round(Math.random() * 925); 
    mines[i].y = Math.round(Math.random() * 525); 
    mines[i].rotation = Math.random() * 360; 
    addChild(mines[i]); 

} 

Это необходимо, по крайней мере целочисленный параметр для Асесс шахты [] массив :)

В AS3, нам нужно удалить всех слушателей DisplayObject, прежде чем удалять его со сцены.Если вы просто удалите объект со сцены, но оставите всех слушателей, он не будет удален.

Так что вам нужна небольшая функция, как это:

function removeMineFromStage(var i):void { 
     mines[i].removeEventListener(MouseEvent.CLICK); 
     //remove any other event listeners that you might have added. 
     removeChild(mines[i]); 
     mines[i] = null; 
    } 
+0

Хорошо, но перед этим мне нужно знать, какие мины удалить. –

+0

Почему бы не создать карту плитки для шахт в массиве? Такие, как мины [x] [y]. Затем вы всегда удаляете что-то вроде: мины [x-1] [y-1] мины [x-1] [y] мины [x] [y-1] – Hodor

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