Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обращение к объекту без идентификатора (http://www.flasher.ru/forum/showthread.php?t=210914)

romanlysenko 26.05.2015 04:01

Обращение к объекту без идентификатора
 
Не могу разобраться как обратится к объекту по идентификатору не зная его для дальнейшего управления...
Вот код:

Код AS3:

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;
                }
 
        }
}

Переменная tile - это графический объект размером 32 х 32 px.
С помощью цикла while создаю сетку из 4-х тайлов по горизонтали, после того как сетка сгенерирована, за пределами цикла через переменную tile обращаюсь к свойству y присваивая ему значение 32, чтобы посмотреть какой из 4-х тайлов сдвинется вниз, получается что сдвигается самый последний (то есть 4-й) по горизонтали, хотелось бы узнать как обратится к остальным 3-м, как узнать их идентификаторы?

KiL33 26.05.2015 07:24

Сохранить на каждый созданный tile ссылку в массив.

caseyryan 26.05.2015 07:56

Самый правильный вариант уже предложен. Но если кроме этих тайлов в данный контейнер больше ничего не добавляется, то можно еще getChildAt() использовать

romanlysenko 26.05.2015 08:40

Спасибо, а кроме массива, можно к этим тайлам как-то обратится ещё?
С методом getChildAt() сегодня вечером попробую поиграться...
Неужели на эти тайлы нету никакой ссылки? (кроме как создать массив) ((

caseyryan 26.05.2015 09:42

Цитата:

Неужели на эти тайлы нету никакой ссылки? (кроме как создать массив) ((
Есть только у родительского контейнера, в который они добавлены, и вытащить их как раз и можно методами типа getChildAt() или getChildByName() если конечно им задано имя. Других нет, это же локальные переменные

romanlysenko 28.05.2015 01:25

Разобрался с методами getChildAt() и getChildByName(), все работает...
Всплыл только один вопрос, если я задаю 4-м тайлам одинаковое имя через свойство
Код AS3:

.name

например имя "wall", то 1-му тайлу присваивается имя, а 2, 3 и 4-му - нет, то есть они то присваиваются всем 4-м тайлам, но при некоторых манипуляциях 2, 3 и 4-й тайлы игнорируются, я написал небольшой код чтобы проверить:

Код AS3:

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");
                        }
 
                }

Как видим если первый по диагонали тайл с именем wall перекрыть объектом shape, то условный оператор if выполнит первый блок кода, так как значение условного выражения является true, а если мы сместим объект shape на координаты x и y = 70 например, то срабатывает второй блок кода, потому что почему-то значение условного оператора равняется значению false, вопрос - почему?
Кстати если отдельно менять разным объектам tile разные имена, например wall2, wall3 и т.д. и в условном операторе тоже проверять именно имена wall2, wall3 и т.д. и в перекрывать нужный тайл то будет срабатывать 1-й блок кода, то есть значение условного оператора будет true.

Добавлено через 3 минуты
Задача заключается в том чтобы перекрывая объектом shape объекты tile всегда выполнялся первый блок кода в условном операторе
Код AS3:

if () { ... }


KiL33 28.05.2015 11:39

Может, как то так, но это все же с массивом, тогда нужно совсем отказаться от 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);
        }
}


callme 28.05.2015 12:22

help.adobe.com
Цитата:

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

Почему вы не хотите поместить тайлы в массив?

romanlysenko 29.05.2015 01:45

Цитата:

Почему вы не хотите поместить тайлы в массив?
Я не то чтобы не хочу, там им и место (тайлам в массиве) на самом деле, я просто хочу узнать все виды возможностей обращений к объекту, массивы то само собой... В основном форумчане упомянули массивы и такие методы как getChildAt(), getChildByName и т.д. Я переписал код, добавил тайлы в массив и вспомнил ещё способ (который никто не упомянул) как обратится к объекту без id, в общем через события (передача ссылки через параметр), который извлекается через свойство target...

Код AS3:

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;
                }
 
        }
}

В общем освежил знания так сказать, если у кого-то ещё есть какие-то идеи по поводу обращения к объектам без знания id - пишите сюда, я же больше ничего припомнить не могу )))

KiL33 29.05.2015 07:36

Цитата:

обращения к объектам без знания id
Ну, вы можете каждому объекту назначить слушателя клик и с помощью курентТаргет работать с ним, если я правильно понял о чем речь.


Часовой пояс GMT +4, время: 22:58.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.