Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   [AS2]метод "не видит" свойство класса (http://www.flasher.ru/forum/showthread.php?t=66160)

genius 29.06.2005 17:32

а что делать с watch? какой у него scope?

есть следующий код (при успешной загрузке у класса MusicFile устанавливается атрибут loaded=true, что работает 100%):

Код:

            musicFile = new MusicFile(scopeRef);
            musicFile.watch("loaded", ifLoaded);           
            musicFile.load("music.mp3");
            musicFile.loaded = true;

и метод класса:

Код:

        private function ifLoaded ():Void{
                if (musicFile.loaded == true) {
                        recordBeat();
                } else if (musicFile.loaded == false) {
                } else {
                        TRACE(Flashout.FATAL + "loading terminated without error and success");                       
                }
        }

как не сложно догадаться, дважды выдает "loading teminated". при том, что я точно знаю, что загрузка завершилась успешно. ну и контрольная установка свойства "loaded" тоже приводит к ошибке, чего быть по определению не должно.

как решить эту проблему? какая область видимости у watch? заранее спасибо за помощь :)

Nirth 29.06.2005 17:41

так получилось, что за свою короткую жизнь не юзал watch? но если я понимаю правильно думаю делегейт опять должен придти на помощь
Код:

musicFile.watch("loaded",Delegate.create(this,this.ifLoaded));

silin 29.06.2005 19:31

Цитата:

как решить эту проблему? какая область видимости у watch?
имхо текущая линейка и _global,
т.е.давать ей нада ссылку , которую видно с этой линейки
иными словами вот так работает
Код:

musicFile ={ifLoaded:function(o){trace(o)}};
musicFile.watch("loaded",musicFile.ifLoaded );           
musicFile.loaded = true;

а так уже нет
Код:

musicFile ={ifLoaded:function(o){trace(o)}};
musicFile.watch("loaded",ifLoaded );           
musicFile.loaded = true;


genius 29.06.2005 19:37

2 silin: текущая линейка - это какая?

по поводу вашего примера - работает, да. но меня интересует такой способ решения задачи, чтобы при загрузке вызывался метод родительского класса. то есть в данном случае не метод класса MusicFile, а метод класса, в котором содержится этот самый экземпляр класса MusicFile (в моем случае "главный" класс Game).

silin 29.06.2005 19:55

>>текущая линейка - это какая?

та, где этот код
>>не метод класса MusicFile, а метод класса, в котором содержится этот самый экземпляр класса MusicFile

помедленней пжлста: экземпляр не может содержаться в классе, может наследовать методы..
т.е. у тебя дожен быть экземпляр, несущий такой метод, тогда передаешь ссылку на метод этого экземпляра
или, если метод статический, находишь его в глобал : Game.yourMethod

genius 29.06.2005 20:13

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

в экземпляре game класса Game содержатся экземпляры других классов (например экземпляр musicFile класса MusicFile). хочется, чтобы game сказал musicFile загружаться, а когда тот загрузится - чтобы не в самом musicFile что-то сработало (как это сделать понятно), а чтобы musicFile сказал своему "папе" game (в котором он находится), что он загрузился и можно делать что-то дальше.

надеюсь у меня получилось ясно выразиться :) спасибо за ваше терпение :)

watch, кстати, ведет себя как-то очень странно. у класса Game есть метод ifLoaded (собственно его код привожу только чтобы проиллюстрировать, что со свойством "loaded2" кроме чтения ничего не происходит):

Код:

        private function ifLoaded ():Void{
                TRACE(Flashout.DEBUG + "musicFile.loaded2=" + musicFile.loaded2);
               
                if (musicFile.loaded2 == true) {
                        recordBeat();
                } else if (musicFile.loaded2 == false) {
                } else {
                        TRACE(Flashout.FATAL + "loading finished without error and success");                       
                }
        }

дальше начинается мистика (в моём понимании).

Код:

            musicFile = new MusicFile();
            //musicFile.watch("loaded2", Delegate.create(this, this.ifLoaded));
            musicFile.loaded2 = true;
            TRACE(Flashout.DEBUG + "musicFile.loaded2=" + musicFile.loaded2);

дает на выходе:

[09:59:386] debug: game.Game.Game()
musicFile.loaded2=true //всё как должно быть

Код:

            musicFile = new MusicFile();
            musicFile.watch("loaded2", Delegate.create(this, this.ifLoaded));
            musicFile.loaded2 = true;
            TRACE(Flashout.DEBUG + "musicFile.loaded2=" + musicFile.loaded2);

дает на выходе:

[09:29:033] debug: game.Game.ifLoaded()
musicFile.loaded2=undefined

[09:29:033] fatal: game.Game.ifLoaded()
loading finished without error and success

[09:29:033] debug: game.Game.Game()
musicFile.loaded2=undefined // почему блин?!!

что происходит с переменной? куда девается её значение? почему она становится undefined?

Nirth 29.06.2005 20:25

Цитата:

в экземпляре game класса Game содержатся экземпляры других классов (например экземпляр musicFile класса MusicFile). хочется, чтобы game сказал musicFile загружаться, а когда тот загрузится - чтобы не в самом musicFile что-то сработало (как это сделать понятно), а чтобы musicFile сказал своему "папе" game (в котором он находится), что он загрузился и можно делать что-то дальше.
Либо сделай callBackFunction (тоесть по факту закгрузки вызываеться функция которую можно передать из вне)
либо сделай событие, и назначь "папу" слушателем

silin 29.06.2005 21:02

да вроде ты передаешь ссылку на несуществующий метод, причем тут мистика
Код:

import mx.utils.Delegate
musicFile ={ifLoaded:function(){trace('метод musicFile')}};
this.ifLoaded=function(){trace('метод '+this)}//попробуй закомментровать эту строчку

musicFile.watch("loaded",this.ifLoaded);           
musicFile.loaded = true;//метод [object Object]

musicFile.watch("loaded",Delegate.create(this, this.ifLoaded));           
musicFile.loaded = true;//метод _level0

musicFile.watch("loaded",musicFile.ifLoaded);           
musicFile.loaded = false;//метод musicFile



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

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