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

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

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

Регистрация: Mar 2011
Сообщений: 38
По умолчанию Как обратиться к внешним объектам из описания класса?

Имеется объект-контейнер (DisplayObjectContainer), созданный на Timeline.

Имеется класс в описании которого необходимо использовать обращение к этому контейнеру.

Возможно ли это? Если да, то как?
Заранее спасибо)))

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Из описания класса DisplayObjectContainer:
Цитата:
Класс DisplayObjectContainer — это абстрактный базовый класс для всех объектов, содержащих дочерние объекты. Он не поддерживает непосредственное создание экземпляров. При вызове конструктора new DisplayObjectContainer() выдается исключение ArgumentError.
1) Каким образом вы смогли создать его на Timeline? Полагаю, под Timeline вы подразумевали stage.
2) Где, по отношению к контейнеру, располагается экземпляр класса, в описании которого необходимо к нему обратиться?
3) Или вы имеете в виду Document class?
4) Это наверняка возможно.

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

Регистрация: Mar 2011
Сообщений: 38
Да, контейнер является дочерним к stage. Экземпляр класса, из которого требуется вызвать контейнер, тоже является дочерним к stage.

Контейнер - не экземпляр DisplayObjectContainer - он экземпляр Sprite, но но выполняет функцию контейнера.


Последний раз редактировалось MAPUTO; 07.04.2011 в 11:20.
Старый 07.04.2011, 12:17
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 4  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Можно в Document class'е при создании экземпляра вашего класса передавать ему ссылку на требуемый контейнер. Например так:
Код AS3:
// Document class
package 
{
    import flash.display.MovieClip;
 
    public class Main extends MovieClip
    {
        private var subject:Subject;
        public function Main()
        {
            // Создаем объект. Предполагается, что на сцене
            // существует контейнер с именем cont.
            subject = new Subject(this.cont);
        }
    }
}
 
import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
 
// Разумеется правильнее описывать классы в отдельных файлах.
class Subject extends Sprite
{
    private var container:DisplayObjectContainer;
 
    public function Subject(container:DisplayObjectContainer)
    {
        this.container = container;
        trace("Yep!");
    }
}

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

Регистрация: Mar 2011
Сообщений: 38
Код в первом кадре на Timeline:

Код AS3:
...
var BULET:Sprite = new Sprite();
addChild(BULET);
...
var personag=new pers(this.BULET);
personag.x=300;
personag.y=240;
addChild(personag);
...
Код класса pers:
Код AS3:
package {
 
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.DisplayObjectContainer;
	import flash.events.*;
 
 
	public class pers extends Sprite {
 
		private var BuletContainer:DisplayObjectContainer;
 
		public function pers(container:DisplayObjectContainer) {
 
			BuletContainer = container;
 
		}
	}
}
В Output выдается сообщение:
Код:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
	at pers()
	at 002_BOOM_fla::MainTimeline/frame1()
Если заменить DisplayObjectContainer на Sprite в описании класса - результат тотже.


Последний раз редактировалось MAPUTO; 07.04.2011 в 14:19.
Старый 07.04.2011, 14:13
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 6  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Кажется, в следующей строчке не нужно писать this, вы же имеете в виду переменную BULET, а не поле в главном классе приложения.
Код AS3:
var personag=new pers(BULET);
Поскорее отучайтесь писать код в кадрах. Вообще же это можно проверить трейсом:
Код AS3:
trace(this.BULET); // если выдаст null, значит я прав.

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

Регистрация: Mar 2011
Сообщений: 38
В том то и проблема, что я хочу перенести весь код в описание классов, но вот взаимодействие между объектами получается только внутри одной иерархической цепочки через parent и child
Код AS3:
trace(this.BULET); //[object Sprite]
без директивы this все тоже самое...


Последний раз редактировалось MAPUTO; 07.04.2011 в 15:14.
Старый 07.04.2011, 15:13
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 8  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Выложу мой исходник (CS5).
Вложения
Тип файла: rar classTest.rar (6.8 Кб, 36 просмотров)

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

Регистрация: Mar 2011
Сообщений: 38
Перенес все в класс Main

Код AS3:
package {
	import flash.display.*;
 
	public class Main extends MovieClip {
 
		var BULET:Sprite = new Sprite();
		var personag:pers;
 
		public function Main() {
 
			addChild(this.BULET);
			trace(this.BULET);
			var personag=new pers(this.BULET);
			personag.x=300;
			personag.y=240;
			addChild(personag);
		}
	}
}
Output:
Код:
[object Sprite]
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
	at pers()
	at Main()
Сделал так:

Код AS3:
trace(personag); // null
где ошибка?


Последний раз редактировалось MAPUTO; 07.04.2011 в 15:47.
Старый 07.04.2011, 15:52
Juice_Green вне форума Посмотреть профиль Отправить личное сообщение для Juice_Green Посетить домашнюю страницу Juice_Green Найти все сообщения от Juice_Green
  № 10  
Ответить с цитированием
Juice_Green
 
Аватар для Juice_Green

Регистрация: Dec 2005
Адрес: Новосибирск
Сообщений: 529
Отправить сообщение для Juice_Green с помощью ICQ Отправить сообщение для Juice_Green с помощью Skype™
зачем в конструкторе объявляете personag как локальную?

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

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

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


 


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


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