2013-07-11 2 views
0

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

private static var enemyShips:Array = new Array(); 
public static function addEnemy(ship:MovieClip):void 
    { 
     enemyShips.push(ship); 
     trace(enemyShips.length); 
     ship.id = enemyShips.length - 1; 
     Globals._stage.addChild(ship);   
    } 
    public static function getEnemy():Array 
    { 
     return enemyShips; 
    } 

    public static function removeEnemy(i:int):void 
    { 
     var ep:ExplosionParticle; 
     for(var j:int = 0; j < 150; j++) 
     { 
      ep = new ExplosionParticle(enemyShips[i].x, enemyShips[i].y); 
      Globals._stage.addChild(ep); 
     } 
     Globals._stage.removeChild(enemyShips[i]); 
     updatePositions(enemyShips, i+1); 
     enemyShips.splice(i, 1); 
    } 
private static function updatePositions(array:Array, position:int):void 
    { 
     for(var i:int = position; i < array.length;i++) 
     { 
      array[i].id -=1; 

     } 
    } 

Для быстрого и простого объяснения некоторых переменных, Глобал являются чтобы разрешить создание экземпляров внутри класса без прямого доступа к этапу.

Этот скрипт прекрасно работает до тех пор, пока не произойдет два случая.

Первый случай, когда в одном кадре создаются два мувиклипа, а второй случай - удаление.

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

Имейте в виду, что это управление динамически создаваемыми экземплярами мувиклипа.

Премного,

Raider00321

+0

Предложение шахты заключается в использовании 'Vector. 'вместо' Array' для хранения вражеских кораблей. – jfgi

+0

Я раньше не работал с AS3 Vector. плохо заглядывать в него – Raider00321

ответ

1

Попробуйте отделить свою модель и классы вашего контроллера. Оставьте все, что влияет на внешний вид вашего судна на ваш контроллер. Удостоверьтесь, что когда ваша модель меняется, она уведомляет всех, кто хочет получать уведомления, путем отправки событий.

Это ваш Модель:

package 
{ 
import flash.events.EventDispatcher; 

public class ShipService extends EventDispatcher 
{ 
    private var ships:Array = new Array(); 

    public function add(ship:Ship):void 
    { 
     var index:int = ships.indexOf(ship); 
     if (index >= 0) { // check if we already have this ship 
      return; 
     } 
     ships.push(ship); 
     ships.forEach(setNewIndexes); 
     dispatchEvent(new ShipEvent(ShipEvent.ADDED, ship)); 
    } 

    public function remove(ship:Ship):void { 
     var index:int = ships.indexOf(ship); 
     if (index < 0) { // check if we don't have this ship 
      return; 
     } 
     ships.splice(index, 1); 
     ships.forEach(setNewIndexes); 
     dispatchEvent(new ShipEvent(ShipEvent.REMOVED, ship)); 
    } 

    public function getAllShips() { 
     return ships; 
    } 

    private function setNewIndexes(ship:MovieClip, index:int, arr:Array):void { 
     ship.id = index; 
    } 
} 
} 

Это ваш простой контроллер:

package 
{ 
import flash.display.DisplayObjectContainer; 
public class ShipController 
{ 
    private var shipService:ShipService; 
    private var battleField:DisplayObjectContainer; 

    public function ShipController(battleField:DisplayObjectContainer, shipService:ShipService) 
    { 
     this.battleField = battleField; 
     this.shipService = shipService; 
     this.shipService.addEventListener(ShipEvent.ADDED, onShipAdded); 
     this.shipService.addEventListener(ShipEvent.REMOVED, onShipRemoved); 
    } 

    private function onShipAdded(e:ShipEvent):void 
    { 
     battleField.addChild(e.ship); 
     e.ship.x = 15; 
     e.ship.y = 15; 
     ship.sayHello(); // sayHello must be implemented 
    } 

    private function onShipRemoved(e:ShipEvent):void 
    { 
     e.ship.blow(); // blow must be implemented 
     battleField.removeChild(e.ship); 
     var ships:Array = shipService.getAllShips(); 
     for each (var ship:Ship in ships) 
     { 
      ship.cry(); 
     } 
    } 

} 
} 

Это ваше события класса, который будет летать через приложение и уведомить всех о все:

package 
{ 
import flash.events.Event; 

public class ShipEvent extends Event 
{ 
    public static const REMOVED:String = "ship_removed"; 
    public static const ADDED:String = "ship_added"; 

    public var ship:Ship; 

    public function ShipEvent(type:String, ship:Ship; bubbles:Boolean = false, cancelable:Boolean = false) 
    { 
     super(type, bubbles, cancelable); 
     this.ship = ship; 
    } 

    public override function clone():Event 
    { 
     return new ShipEvent(type, ship, bubbles, cancelable); 
    } 
} 

} 

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


О словарях: зачем вы его используете? Насколько я помню, это реализация HashMap (в AS3 HashMap, которые используют объекты простого типа, а ключи - Object()), которые используют Object как ключи. Я не совсем понимаю, какие выгоды он может вам дать.

+0

был очень хорошим примером. Мотивы, которые я использовал для использования словарей, заключались в том, что вы можете использовать их для легкого обращения с кораблями. Например, я могу настроить уникальный идентификатор для каждого мувиклипа и ссылаться на объект на него, например var shipID: int = 0; public function addShip(): void { словарь [shipID] = shipObject; id + = 1; } Таким образом, я могу легко контролировать ссылки, если это необходимо, если мне нужно выполнить поиск определенного корабля, вам не нужно проходить через весь список, что значительно ускоряет поиск. – Raider00321

+0

вы можете использовать простой Object() для этих целей: var map: Object = new Object(); объект [shipID] = корабль; – ZuzEL

0

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

+0

Я отвечу на ваш вопрос, когда закончу свою работу на сегодня. Я бы посоветовал вам использовать шаблоны для вашей игры.Подробнее скоро – ZuzEL

+0

спасибо zuzel =) – Raider00321

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