Форум 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 28.06.2005 18:15

[AS2]метод "не видит" свойство класса
 
есть следующий класс:

Код:

class game.MusicFile extends game.MusicObject {
        private var mp3file:Sound       
       
        public function MusicFile () {
        }
        /*
        * загружаем файл (не закончено)
        */
        public function load(mp3fileLocation:String):Void {       
        TRACE(Flashout.INFO + "mp3 started loading");       
                var z = scopeRef.createEmptyMovieClip("mp3fileContainer", scopeRef.getNextHighestDepth());
                mp3file = new Sound(scopeRef.mp3fileContainer);
                TRACE(Flashout.DEBUG + "setting onLoad");               
                mp3file.onLoad = this.onLoad;
                TRACE(Flashout.DEBUG + "onLoad set");
                mp3file.loadSound("music.mp3", false);
        }
        public function startPlay():Void {
                TRACE(Flashout.DEBUG + "this is mp3file="+mp3file);
                mp3file.start();
                TRACE(Flashout.DEBUG + "mp3 playing");
        }
        private function onLoad(success:Boolean):Void {       
                var suc = success ? "successfully" : "not successfully";
                TRACE(Flashout.DEBUG + "onLoad called. loaded "+suc);
                TRACE(Flashout.DEBUG + scopeRef);
                if (success) {
                        TRACE(Flashout.DEBUG + this);       
                        TRACE(Flashout.INFO + "mp3file=" + mp3file);                       
                        this.startPlay();               
                } else {
                        TRACE(Flashout.ERROR + "mp3 not loaded");
                }
        }
}

на выходе трейсит следующее:

[22:29:180] info: game.MusicFile.load()
mp3 started loading
[22:29:180] debug: game.MusicFile.load()
setting onLoad
[22:29:190] debug: game.MusicFile.load()
onLoad set
[22:29:350] debug: game.MusicFile.onLoad()
onLoad called. loaded successfully
[22:29:350] debug: game.MusicFile.onLoad()
_level0
[22:29:350] debug: game.MusicFile.onLoad()
[object Object]
[22:29:350] info: game.MusicFile.onLoad()
mp3file=undefined // фак!!! почему???

объясните дураку, почему мне говорят, что свойства mp3file не существует? ведь методом выше оно было, а методом ниже его уже нет.

что я делаю не так? заранее спасибо за помощь.

Nirth 28.06.2005 18:30

потому что ты теперь находишься в другой области видимости, используй класс mx.utils.Delegate
Код:

mp3file.onLoad = mx.utils.Delegate(this,this.onLoad)

genius 28.06.2005 18:33

а какой области видимости я нахожусь? и почему в другой, а не в своём объекте?

спасибо за помощь :)

Nirth 28.06.2005 18:35

ты находишься в области видимости объекта Sound. поэтому и не видит.

genius 28.06.2005 18:46

Цитата:

Сообщение от Nirth
ты находишься в области видимости объекта Sound. поэтому и не видит.

ага. у меня была такая мысль. только вот MTASC ругался, не хотел

то есть использование Delegate - это обычный метод, который используют в таких случаях?

Nirth 28.06.2005 18:52

Да это стандарт, в старших языках(Java, C#) есть даже специальные поля в классе, делегаторы,во флэше пока такого нету зато есть класс кое как эмулирующий данную фиговину=)

7thsky™ 28.06.2005 19:12

у функций описанных в классах, всего три звена в цепочке видимости:

локальные данные
объект вызвавший функцию
и глобал

вот пример:
Код:

class test extends Object {
        var a;
        var type = 5;
        function test () {
                var a = {};
                a.type = 100;
                a.test = method;
                a.test ();
        }
        function method () {
                trace ('>> ' + type);
        }
}

в файле
Код:

a = new test (); // в трайс выдаст 100

genius 29.06.2005 02:45

спасибо, друзья, вы мне здорово помогли :)

genius 29.06.2005 17:02

чтобы всё заработало в FAME пришлось поправить класс Delegate: в 27 и 29 строчках заменить func на func2.

2Nirth: вызывается он, конечно, Delegate.create() :) и спасибо за замечательный туториал по FAME!

Nirth 29.06.2005 17:04

писал не я, я просто перевел=)


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

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