Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.05.2015, 04:01
romanlysenko вне форума Посмотреть профиль Отправить личное сообщение для romanlysenko Найти все сообщения от romanlysenko
  № 1  
Ответить с цитированием
romanlysenko
 
Аватар для romanlysenko

Регистрация: May 2015
Сообщений: 19
По умолчанию Обращение к объекту без идентификатора

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

Код 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-м, как узнать их идентификаторы?

Старый 26.05.2015, 07:24
KiL33 вне форума Посмотреть профиль Отправить личное сообщение для KiL33 Найти все сообщения от KiL33
  № 2  
Ответить с цитированием
KiL33
 
Аватар для KiL33

Регистрация: Jul 2007
Адрес: Гражданин Российской Федерации
Сообщений: 1,122
Отправить сообщение для KiL33 с помощью ICQ
Сохранить на каждый созданный tile ссылку в массив.

Старый 26.05.2015, 07:56
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 3  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Самый правильный вариант уже предложен. Но если кроме этих тайлов в данный контейнер больше ничего не добавляется, то можно еще getChildAt() использовать

Старый 26.05.2015, 08:40
romanlysenko вне форума Посмотреть профиль Отправить личное сообщение для romanlysenko Найти все сообщения от romanlysenko
  № 4  
Ответить с цитированием
romanlysenko
 
Аватар для romanlysenko

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

Старый 26.05.2015, 09:42
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Неужели на эти тайлы нету никакой ссылки? (кроме как создать массив) ((
Есть только у родительского контейнера, в который они добавлены, и вытащить их как раз и можно методами типа getChildAt() или getChildByName() если конечно им задано имя. Других нет, это же локальные переменные

Старый 28.05.2015, 01:25
romanlysenko вне форума Посмотреть профиль Отправить личное сообщение для romanlysenko Найти все сообщения от romanlysenko
  № 6  
Ответить с цитированием
romanlysenko
 
Аватар для romanlysenko

Регистрация: May 2015
Сообщений: 19
Разобрался с методами 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 () { ... }
__________________
Писать код или не писать, вот то, что отличает профессионала от дилетанта. ©

Старый 28.05.2015, 11:39
KiL33 вне форума Посмотреть профиль Отправить личное сообщение для KiL33 Найти все сообщения от KiL33
  № 7  
Ответить с цитированием
KiL33
 
Аватар для KiL33

Регистрация: Jul 2007
Адрес: Гражданин Российской Федерации
Сообщений: 1,122
Отправить сообщение для KiL33 с помощью ICQ
Может, как то так, но это все же с массивом, тогда нужно совсем отказаться от 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);
	}
}

Старый 28.05.2015, 12:22
callme вне форума Посмотреть профиль Отправить личное сообщение для callme Найти все сообщения от callme
  № 8  
Ответить с цитированием
callme
 
Аватар для callme

Регистрация: Dec 2014
Сообщений: 312
help.adobe.com
Цитата:
Возвращает экземпляр дочернего экранного объекта с заданным именем. Если заданное имя соответствует нескольким дочерним экранным объектам, метод возвращает первый из списка.

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

Старый 29.05.2015, 01:45
romanlysenko вне форума Посмотреть профиль Отправить личное сообщение для romanlysenko Найти все сообщения от romanlysenko
  № 9  
Ответить с цитированием
romanlysenko
 
Аватар для romanlysenko

Регистрация: May 2015
Сообщений: 19
Цитата:
Почему вы не хотите поместить тайлы в массив?
Я не то чтобы не хочу, там им и место (тайлам в массиве) на самом деле, я просто хочу узнать все виды возможностей обращений к объекту, массивы то само собой... В основном форумчане упомянули массивы и такие методы как 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 - пишите сюда, я же больше ничего припомнить не могу )))
__________________
Писать код или не писать, вот то, что отличает профессионала от дилетанта. ©

Старый 29.05.2015, 07:36
KiL33 вне форума Посмотреть профиль Отправить личное сообщение для KiL33 Найти все сообщения от KiL33
  № 10  
Ответить с цитированием
KiL33
 
Аватар для KiL33

Регистрация: Jul 2007
Адрес: Гражданин Российской Федерации
Сообщений: 1,122
Отправить сообщение для KiL33 с помощью ICQ
Цитата:
обращения к объектам без знания id
Ну, вы можете каждому объекту назначить слушателя клик и с помощью курентТаргет работать с ним, если я правильно понял о чем речь.

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:58.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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