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

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

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

Регистрация: Apr 2006
Сообщений: 165
Отправить сообщение для artfabrique с помощью ICQ
Attention Узнать класс экземпляра вызвавший статичный метод класса. Как?

У меня есть класс Vector2 (обычный математический вектор со всеми функциями)
Я хочу сделать что-то вроде дебаг отрисовки всех его экземпляров.
Но дабы не смешивалить все вектора хочу сделать рисование разными цветами на разных "слоях".
идентификатор слоя — это хэш имени класса экземпляра, который вызвал конструктор Vector2.

Вопрос: Как узнать в конструкторе Vector2 кто его вызвал, НЕ ПЕРЕДАВАЯ ПАРАМЕТРОВ (Хочется универсальности)

Думал как то обыграть через arguments.callee но хозяина функции тоже не понял как найти.
__________________
To beer or no to beer?
That is the question...

Старый 04.02.2011, 13:55
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 2  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Увы, никак. Только даже если можно было бы — Вам бы это не помогло.
Приведите пример кода, как бы Вы хотели это дело видеть, может я не понимаю чего.

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

Регистрация: Apr 2006
Сообщений: 165
Отправить сообщение для artfabrique с помощью ICQ
Класс Main
Код AS3:
Vector2.debug = true;
var tempVector = new Vecto2(10,5);
var box = new MyBox();
Класс MyBox
Код AS3:
public function MyBox() {
    var vec:Vector2 = new Vector2();
}
Класс Vector2
Код AS3:
public static var debug:Boolean = false;
public static var layers:Object;
 
public function Vector2() {
      if(Vector2.debug) draw(ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР);
}
 
public function draw(ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР:Object):void {
    if(!layers) layers = {};
    var color:uint
    if(layers["hash_"+ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР]) {
          color = layers["hash_"+ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР];
    }else {
          color = getRandomColor();
          layers["hash_"+ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР] = color
    }
    drawLine(startPoint,endPoint,color);
}
Добавлено через 1 минуту
ну разумеется соверадийть toString() у всех
__________________
To beer or no to beer?
That is the question...

Старый 04.02.2011, 15:11
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 4  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Код AS3:
public static var layers:Object;
Лучше подойдёт Dictionary и без презервативов вроде "hash"+..

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

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

Регистрация: Apr 2006
Сообщений: 165
Отправить сообщение для artfabrique с помощью ICQ
никто не сказал что в том же объекте.
имена типов нужны для разных цетов, а рисоваться все будет в отдельных дебаг слой

Добавлено через 2 минуты
и да на счет дикшинари - weak references не работают.
GC не отметает удаленные объекты потому что ссылки остаются в словаре.
в каких точно случаях - не знаю, но мемори лики мне не нужны.
__________________
To beer or no to beer?
That is the question...

Старый 04.02.2011, 16:00
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 6  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Цитата:
и да на счет дикшинари - weak references не работают.
Причем тут они? Dictionary нужен вот зачем:
Код AS3:
if(layers["hash_"+ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР])
Код AS3:
  if(layers[ОБЬЕКТ_ВЫЗВАВШИЙ_КОНСТРУКТОР])
Цитата:
никто не сказал что в том же объекте.
имена типов нужны для разных цетов, а рисоваться все будет в отдельных дебаг слой
Хорошо, с этим всё понятно. Но зачем тогда знать экземпляр, который вызвал статичный метод?
У экземпляра должен быть метод debugTrace(), который может дёрнуть статичный метод и передать ему ссылку на себя.

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

Регистрация: Apr 2006
Сообщений: 165
Отправить сообщение для artfabrique с помощью ICQ
дело в том что использование объектов в виде ключей расценивается как ссылка на этот объект и гарбиджколлектор не будет удалять этот объект из оперативки пока на него есть хоть одна ссылка. В случае с объектам дисплей листе (например со снегом программным был случай) по непонятным причинам после удаления они не удаляются из памяти при использовании дишенари.

Зная экземпляр можно узнать тип (класс) и привести его к строке.
Ничего дополнительного в класс Vector2 передаваться не может.
__________________
To beer or no to beer?
That is the question...

Старый 04.02.2011, 16:55
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 8  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Цитата:
дело в том что использование объектов в виде ключей расценивается как ссылка на этот объект и гарбиджколлектор не будет удалять этот объект из оперативки пока на него есть хоть одна ссылка.
В случае значений, кстати, тоже.
Цитата:
В случае с объектам дисплей листе (например со снегом программным был случай) по непонятным причинам после удаления они не удаляются из памяти при использовании дишенари.
Наверное нужно было удалить их из диктионари.
Кстати, а когда использовали Object — проблемы не было? Я всё ещё могу достучаться до объекта через myHash.myObject

Ну как Вы будете вызывать метод, который отрисует этот вектор?

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
дело в том что использование объектов в виде ключей расценивается как ссылка на этот объект и гарбиджколлектор не будет удалять этот объект из оперативки пока на него есть хоть одна ссылка
шаттл запускаете?
или планируется работа приложения в режиме 24х365?

мне кажется, в последнее время вокруг GC какой-то ненужный ажиотаж поднялся.


А по сабжу - я недавно хотел сделать аналогичную штуку типа статического трейсера, который сообщал бы, из какого метода какого экземпляра его вызвали. Общим собранием было решено, что это невозможно. Были идеи насчет анализа стека объекта Error (там есть метод, который возвращает стек вызовов на текущий момент), можно сюда покопать.

Старый 04.02.2011, 17:52
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 10  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Error#getStackTrace.
Он возвратит только строчку кода и имя класса, но не ссылку на экземпляр. К тому же в релиз-плеере данная фишка недоступна.

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

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

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


 


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


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