![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: 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, время: 19:35. |
|
|
« Предыдущая тема | Следующая тема » |
|
|