2012-06-26 1 views
2

Я хотел бы реализовать очень простой способ хранения переменной, содержащей последний конкретный «CustomObject», который я нажал. Я бы хотел, чтобы клики на других объектах игнорировались. Рассмотрим следующий пример кода, например, при CustomObject расширяет MovieClip:Сделать объекты ведут себя как радио кнопки в AS3

//Code within the Document Class: 
var square1:CustomObject = new CustomObject(); 
var square2:CustomObject = new CustomObject(); 
var square3:CustomObject = new CustomObject(); 
var triangle1:DifferentObject= new DifferentObject(); 
square1.x=100; square2.x=200; square3.x=300; 
addChild(square1); 
addChild(square2); 
addChild(square3); 
addChild(triangle1); 

//Code within the CustomObject Class: 
this.addEventListener(MouseEvent.CLICK,radioButtonGlow); 
public function radioButtonGlow(e:MouseEvent):void 
{ 
    var myGlow:GlowFilter = new GlowFilter(); 
    myGlow.color = 0xFF0000; 
    myGlow.blurX = 25; 
    myGlow.blurY = 25; 
    this.filters = [myGlow]; 
} 

Это прекрасно работает, когда я нажимаю на squares- они загораются точно так, как ожидалось. Тем не менее, я хотел бы реализовать функциональные возможности, которые: 1) хранит последний квадрат я щелкнул в переменную в документе класса 2) Удаляет свечение от всех других квадратов, когда я нажимаю на другой один

Любая обратная связь очень ценим!

ответ

1

Я предлагаю создать класс, который действует как коллекция экземпляров CustomObject и управляет ими таким образом (то есть может быть выбран только один из этой коллекции и т. Д.).

Пример:

public class CustomCollection 
{ 

    // Properties. 
    private var _selected:CustomObject; 
    private var _items:Array = []; 

    // Filters. 
    private const GLOW:GlowFilter = new GlowFilter(0xFF0000, 25, 25); 


    // Constructor. 
    // @param amt The amount of CustomObjects that should belong to this collection. 
    // @param container The container to add the CustomObjects to. 
    public function CustomCollection(amt:int, container:Sprite) 
    { 
     for(var i:int = 0; i < amt; i++) 
     { 
      var rb:CustomObject = new CustomObject(); 
      rb.x = i * 100; 

      _items.push(rb); 
      container.addChild(rb); 
     } 
    } 


    // Selects a CustomObject at the specified index. 
    // @param index The index of the CustomObject to select. 
    public function select(index:int):void 
    { 
     for(var i:int = 0; i < _items.length; i++) 
     { 
      if(i == index) 
      { 
       _selected = _items[i]; 
       _selected.filters = [GLOW]; 

       continue; 
      } 

      _items[i].filters = []; 
     } 
    } 


    // The currently selected CustomObject. 
    public function get selected():CustomObject 
    { 
     return _selected; 
    } 


    // A copy of the array of CustomObjects associated with this collection. 
    public function get items():Array 
    { 
     return _items.slice(); 
    } 
} 

Затем вы можете пересмотреть свой код в классе документа, чтобы что-то вроде:

var collection:CustomCollection = new CustomCollection(3, this); 
collection.select(1); 

Вам нужно будет добавить свою собственную логику для события щелчка, который имеет дело с выбором кнопки. Я предлагаю добавить свойство index для каждого CustomObject, а также ссылку на коллекцию, в которую он был добавлен. Таким образом, вы можете просто добавить событие click в класс CustomObject и иметь функцию-обработчик:

private function _click(e:MouseEvent):void 
{ 
    _collection.select(index); 
} 
+0

Вы, сэр, джентльмен и ученый. Это гениальная идея, создающая класс для управления пользовательскими объектами. Спасибо! – Gigazelle

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