|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: May 2015
Сообщений: 19
|
Обращение к объекту без идентификатора
Не могу разобраться как обратится к объекту по идентификатору не зная его для дальнейшего управления...
Вот код: package { import flash.display.Sprite; public class Learn extends Sprite { private var tile:Tile; /* Конструктор класса */ public function Learn():void { init(); } private function init():void { var i:uint = 0; while (i < 4) { tile = new Tile(); addChild(tile); tile.x = tile.width * i; i++; } tile.y = 32; } } } С помощью цикла while создаю сетку из 4-х тайлов по горизонтали, после того как сетка сгенерирована, за пределами цикла через переменную tile обращаюсь к свойству y присваивая ему значение 32, чтобы посмотреть какой из 4-х тайлов сдвинется вниз, получается что сдвигается самый последний (то есть 4-й) по горизонтали, хотелось бы узнать как обратится к остальным 3-м, как узнать их идентификаторы? |
|
|||||
Сохранить на каждый созданный tile ссылку в массив.
|
|
|||||
Регистрация: May 2015
Сообщений: 19
|
Спасибо, а кроме массива, можно к этим тайлам как-то обратится ещё?
С методом getChildAt() сегодня вечером попробую поиграться... Неужели на эти тайлы нету никакой ссылки? (кроме как создать массив) (( |
|
|||||
Цитата:
|
|
|||||
Регистрация: May 2015
Сообщений: 19
|
Разобрался с методами getChildAt() и getChildByName(), все работает...
Всплыл только один вопрос, если я задаю 4-м тайлам одинаковое имя через свойство например имя "wall", то 1-му тайлу присваивается имя, а 2, 3 и 4-му - нет, то есть они то присваиваются всем 4-м тайлам, но при некоторых манипуляциях 2, 3 и 4-й тайлы игнорируются, я написал небольшой код чтобы проверить: private function init():void { /* Создание нового графического объекта Shape */ shape = new Shape(); shape.graphics.beginFill(0x00ff0000); shape.graphics.drawRect(0, 0, 64, 64); addChild(shape); var i:uint = 0; while (i < 4) { tile = new Tile(); addChild(tile); /* Здесь каждому объекту tile присваивается имя wall */ tile.name = "wall"; tile.x = tile.width * i; i++; } /* Размещаем объекты tile с 1-го по 4-й по диагонали */ for (var j:uint = 1; j <= 4; j++) { getChildAt(j).y = getChildAt(j).width * j - 64; } /* Имя объекта shape (instance1) */ trace(getChildAt(0).name); /* Проверяем имена объектов tile (с 1-го по 4-й имена wall) */ trace(getChildAt(4).name); /* Объект shape (меняем координаты x и y так чтобы наш объект shape перекрывал объекты tile с именем wall) */ getChildAt(0).x = 0; getChildAt(0).y = 32; /* Проверяем перекрывает ли объект shape один из объектов tile с именем wall */ if (shape.hitTestObject(getChildByName("wall"))) { trace("shape перекрывает wall"); } else { trace("shape не перекрывает wall"); } } Кстати если отдельно менять разным объектам tile разные имена, например wall2, wall3 и т.д. и в условном операторе тоже проверять именно имена wall2, wall3 и т.д. и в перекрывать нужный тайл то будет срабатывать 1-й блок кода, то есть значение условного оператора будет true. Добавлено через 3 минуты Задача заключается в том чтобы перекрывая объектом shape объекты tile всегда выполнялся первый блок кода в условном операторе
__________________
Писать код или не писать, вот то, что отличает профессионала от дилетанта. © |
|
|||||
Может, как то так, но это все же с массивом, тогда нужно совсем отказаться от getChildAt(), в примере ниже, глупый симбиоз получился из одного и другого))
import flash.display.Shape; import flash.display.MovieClip; var tileList:Vector.<Tile> = Vector.<Tile>([]); /* Создание нового графического объекта Shape */ var shape:Shape = new Shape(); shape.graphics.beginFill(0x00ff0000); shape.graphics.drawRect(0, 0, 64, 64); addChild(shape); var i:uint = 0; while (i < 4) { var tile:Tile = new Tile(); addChild(tile); /* Здесь каждому объекту tile присваивается имя wall */ tile.name = "wall"+i; tile.x = tile.width * i; i++; } /* Размещаем объекты tile с 1-го по 4-й по диагонали */ for (var j:uint = 1; j <= 4; j++) { getChildAt(j).y = getChildAt(j).width * j - 64; if(getChildAt(j) is Tile)tileList.push(getChildAt(j)); } checkHit(); /* Имя объекта shape (instance1) */ //trace(getChildAt(1).name); /* Проверяем имена объектов tile (с 1-го по 4-й имена wall) */ //trace(getChildAt(4).name); /* Объект shape (меняем координаты x и y так чтобы наш объект shape перекрывал объекты tile с именем wall) */ getChildAt(0).x = 0; getChildAt(0).y = 32; /* Проверяем перекрывает ли объект shape один из объектов tile с именем wall */ function checkHit():void { for (var i:uint = 0; i < tileList.length; i++) { if (shape.hitTestObject(tileList[i])) { trace("shape перекрывает wall"); } else { trace("shape не перекрывает wall"); } trace("NAME "+tileList[i].name); } } |
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
help.adobe.com
Цитата:
Почему вы не хотите поместить тайлы в массив? |
|
|||||
Регистрация: May 2015
Сообщений: 19
|
Цитата:
package { import flash.display.Sprite; import flash.events.MouseEvent; public class Platformer extends Sprite { // private var _tile:Tile; private var _array:Array; public function Platformer():void { init(); addEventListener(MouseEvent.CLICK, clickListener); } private function init():void { _array = new Array(); var i:uint = 0; while (i < 4) { _array.push(new Tile()); _array[i].x = _array[i].width * i; addChild(_array[i]); i++; } } private function clickListener(param:MouseEvent):void { trace("Click"); var m = param.target; m.y = 64; } } }
__________________
Писать код или не писать, вот то, что отличает профессионала от дилетанта. © |
|
|||||
Цитата:
|
Часовой пояс GMT +4, время: 09:26. |
|
« Предыдущая тема | Следующая тема » |
|
|