2015-03-29 3 views
0

Я пытаюсь создать небольшую игру (это больше о том, как научиться, чем делать неотразимую игру). Его можно возобновить следующим образом: Пользователь выбирает здание в меню и размещает его на сцене. При нажатии на вновь созданное здание он/она может выбрать его обновление. (Для тех, кто играет в такие игры, как Clash of Clans, это то, что я пытаюсь сделать). У меня есть мое меню, и я могу разместить здания без проблем, но я не могу на них нажимать. Вот начало моего кода:EventListener и динамически добавленные MovieClips. (AS3)

var build:int=0; //variable that defines which building to place on stage 

menuBuilding.house.addEventListener(MouseEvent.CLICK, fnChooseHouse); //when click on House in Building Menu 
function fnChooseHouse (e:Event):void{ 
    build = 1; //building to place is a House. 
} 

city.addEventListener(MouseEvent.CLICK, mouseClickEvent); 

function mouseClickEvent(e: MouseEvent): void { 
    if (build == 0) { //if building not chosen, do nothing 
     return 
    } else if (build == 1) { // if building is a house 
     var house1: house = new house(); 
     addChild(house1); //add instance of the house 
     house1.x = stage.mouseX; 
     house1.y = stage.mouseY; // place the house where I clicked 
     build = 0; //reset the variable. 
     house1.mouseChildren=true; //allow instance of house to be clicked. 
    } 
}; 

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

У кого-то есть идея? (Кстати, я все еще изучаю AS3, когда я ухожу, поэтому я не использую внешний файл .as еще, все еще на временной шкале). Заранее спасибо :)

ответ

0

Ваш новый экземпляр дома не имеет прослушивателя событий клика на нем, поэтому вы «не можете» щелкнуть по нему. Установив «mouseChildren» в true, возможно, ничего не получится, поскольку по умолчанию эта переменная может быть истинна.

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

+0

У меня был прослушиватель кликов для каждого из ... в цикле (экземпляры были помещены в массив), но он все еще не работал. Я знаю, что это может быть не самый эффективный способ, но это единственный способ, которым я мог бы думать с моими ограниченными знаниями. Если вы можете думать по-другому, я бы очень признателен. Просто укажите мне путь, и я посмотрю. Спасибо. – Jeryl

+0

, если вы добавите прослушиватель событий в экземпляр house1 сразу после его создания, что-нибудь делает? – mitim

+0

это сделал. Мне пришлось добавить часть кода, приведенную ниже, чтобы заставить ее работать. Но, наконец, это работает. Только нужно выяснить, как проверить, можно ли добавить новое здание или если пространство уже занято. Большое спасибо. – Jeryl

0

Чтобы использовать массив, чтобы поставить свои дома, посмотрите на этом примере:

city.addEventListener(MouseEvent.CLICK, mouseClickEvent); 
function mouseClickEvent(e: MouseEvent): void { 

    // it's better to use switch than many if 
    switch (build){ 

     case 0 : 

      return; 
      break; 

     case 1 : // create a new house 

      build = 0; 

      // it's better for class name to be capitalized 
      var house:House = new House(); 
       house.x = stage.mouseX; 
       house.y = stage.mouseY; 
      addChild(house); 

      // DisplayObjectContainer.mouseChildren : 
      // is used to enable mouse or user input device for the children of the object and It's enabled by default, so you don't need it 
      //house.mouseChildren = true; 

      // add your house to the houses array 
      houses.push(house); 

      break; 
    } 

} 

do_some_actions_with_houses(); 

function do_some_actions_with_houses():void { 
    for(var i:int = 0; i < houses.length; i++){ 
     var house:House = houses[i]; 
      // add a name to your house 
      house.name = 'house_' + i; 
      // add an mouce click event listener 
      house.addEventListener(
       MouseEvent.CLICK, 
       function(e:MouseEvent):void { 
        trace(e.currentTarget.name); // gives : house_0, house_1, ... 
       } 
      ) 
    } 
} 

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

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

+0

Спасибо! Я попробую сразу. Я понимаю каждую строку, но если вы не возражаете, не могли бы вы прояснить это: «for (var i: int = 0; i Jeryl

+0

@Jeryl, Конечно, проблем нет. 'i ++' используется для увеличения 'i', вы можете записать его:' i = i + 1'. Для получения дополнительной информации о петлях AS3, посмотрите [здесь] (http://www.adobe.com/devnet/actionscript/learning/as3-fundamentals/loops.html). – akmozo

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