Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   общение между классами и базовые концепции (http://www.flasher.ru/forum/showthread.php?t=97663)

danhuu 26.06.2007 20:16

общение между классами и базовые концепции
 
Надо сделать такую штуку: появляется текстовое поле со словом (вариант ответа теста), оно таскается мышью, через 10 секунд исчезает и появляется следующее. За эти 10 с слово (если ответ верный) надо оттащить на мувик, который так или иначе среагирует.
С помощью советов форума, хелпа, О'Рейли и Гурского удалось сделать появление и исчезновение слов, и мышью они успешно таскаются.
Дальше картинку кораблика на сцене конвертирую в символ, класс назначаю "ship", базовый класс - flash.display.Sprite, instance name - caravella. Почему-то в Output всё равно считается MovieClip-ом. В ship.as создаю одноимённый класс, наследуя его от Sprite, импортирую и основной класс документа. В основной функции ship пытаюсь для начала оттрассировать hitTestObject каравеллы с объектом box из осн. класса документа (в нём сидит вариант ответа). Должно бы появиться "false", а появляется ругань на "possibly undefined variables". Проверял видимость переменных одного класса из другого в той же директории на более простых вещах (оттрассировать функцией одного класса переменную из другого) - то же самое. Всё объявлял "public". Ничего не понимаю! В хелпе и О'Рейли не смог найти объяснения, вроде, сказано, что если в публичном классе объявить публичную переменную или функцию, то её вполне можно прочитать в другом классе. Пожалуйста, если у кого найдётся время помотреть исходники и объяснить ошибки, сделайте это!
Я какие-то базовые понятия путаю? В php, например, переменные любого публичного класса можно (импортировав) прочитать и даже переопределить в любом же.
Исходники не могу загрузить. Вставляю код основного класса:
Код:

package
{
        import flash.display.Sprite;
        import flash.text.*;
        import flash.events.MouseEvent;
        import flash.events.TimerEvent;
        import flash.utils.Timer;

        public class answers extends Sprite
        {
                var words:Array =[
                {val:"Гаити",flag:true}, 
                {val:"Ньюфаундленд",flag:false}, 
                {val:"Гренландия",flag:false}, 
                {val:"Куба",flag:true}, 
                {val:"Цейлон",flag:false},
                {val:"Великобритания",flag:false}, 
                {val:"Ямайка",flag:true},
                {val:"Антарктида",flag:false},
                {val:"табак",flag:true},
                {val:"индейцы",flag:true},
                {val:"золото",flag:false},
                {val:"Тринидад",flag:true},
                {val:"Шпицберген",flag:false},
                {val:"мыс Дежнёва",flag:false},
                {val:"Амазонка",flag:false}
                  ];
                var i:int =0;// итератор слов
                // создаём 10-секундный таймер и поле отсчёта
                var timer:Timer = new Timer(1000, 10);
                var timerField:TextField=new TextField;
                // создаём клип-контейнер
                var box:Sprite=new Sprite;
                // создаем поле ответа
                var tf:TextField=new TextField;

                public function answers():void
                {
                        //добавляем листенеры к таймеру
                        timer.addEventListener(TimerEvent.TIMER, onTick);
                        timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
                        // Перехватываем нажатие кнопки мыши
                        box.addEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown);
                        // Отпускание мышки
                        box.addEventListener(MouseEvent.MOUSE_UP,handleMouseUp);
                        //Отпускание мышки за пределами флэшки
                        box.addEventListener(MouseEvent.MOUSE_OUT,handleMouseUp);

                        //запускаем первое слово
                        newWord(i);
                }
                //собственно функция появления варианта ответа
                private function newWord(i):void
                {
                        //запускаем таймер
                        timer.reset();
                        timer.start();
                        //поле таймера
                        timerField.x =450;
                        timerField.text = "Осталось " + timer.repeatCount + " с.";
                        addChild(timerField);
                        //заполняем и форматируем поле ответа
                        tf.autoSize=TextFieldAutoSize.LEFT;
                        tf.selectable=false;
                        tf.text=words[i].val;
                        var format:TextFormat=new TextFormat;
                        format.font="Verdana";
                        format.size=16;
                        format.bold=true;
                        tf.setTextFormat(format);
                        //выводим клип и суём туда текстовое поле
                        box.x =10;
                        box.y =10;
                        addChild(box);
                        box.addChild(tf);
                }
                //Функции Drag&Drop
                private function handleMouseDown(event:MouseEvent):void
                {
                        box.startDrag();
                }
                private function handleMouseUp(event:MouseEvent):void
                {
                        box.stopDrag();
                }
                //функции таймера
                private function onTick(event:TimerEvent):void
                {
                        // показывает счётчик
                        var t:int = event.target.repeatCount-event.target.currentCount;
                        timerField.text="Осталось " + t + " с.";
                }
                private function onTimerComplete(event:TimerEvent):void
                {
                        //клип-контейнер и счётчик исчезают
                        removeChild(timerField);
                        box.removeChild(tf);
                        removeChild(box);
                        //если не дошли до конца, сдвигаем итератор и запускаем следующее слово
                        if (i < words.length-1) {
                                i++;
                                newWord(i);
                        }

                }
        }
}

...и класса ship:
Код:

package
{
        import flash.display.Sprite;
        import answers;
        public class ship extends Sprite
        {
                public function ship():void
                {
                        trace(this.caravella.hitTestObject(answers.box));
                }
        }
}

Заранее благодарен, хотя, похоже, вакансию я уже пролохал :mad:

danhuu 27.06.2007 14:10

Граждане, это я такую каку написал, что отвечать противно, или что-то непонятно?

derhab 27.06.2007 14:46

Если хочешь обратится из конструктора ship к box, то напиши так:
Код:

Object(root).box

silin 27.06.2007 15:13

не очень-то ясно как объяснить:
вот ты смотришь хиттест this.caravella с неким answers.box
оба объекта не существуют :
-у this(т.е. ship) нет сойства caravella , если надо смотреть хиттест этого объекта (ship), то и пиши this.hitTestObject, а по сути просто trace(hitTestObject(answers.box));
-дальше: у answers нет статического свойства box, сделай его статическим (static var box:Sprite=new Sprite; в классе answers)и тогда ship его увидит..
зы: а иначе, правильно derhab говорит, надо искать этот бокс не в классе, а в экземпляре (руте или где-ты там это добро создаешь)

danhuu 27.06.2007 15:18

Цитата:

Object(root).box
Я правильно понял, что Object - это класс Object, а root - это сцена (основная timeline?), где живут все дети DisplayObject? Или root - это Document Class, в моём случае - answers?
Надоело извиняться за глупые вопросы, но если я их не буду задавать, то ничему не научусь.

danhuu 27.06.2007 15:19

Цитата:

Сообщение от silin
не очень-то ясно как объяснить:
вот ты смотришь хиттест this.caravella с неким answers.box
оба объекта не существуют :
-у this(т.е. ship) нет сойства caravella , если надо смотреть хиттест этого объекта (ship), то и пиши this.hitTestObject, а по сути просто trace(hitTestObject(answers.box));
-дальше: у answers нет статического свойства box, сделай его статическим (static var box:Sprite=new Sprite; в классе answers)и тогда ship его увидит..
зы: а иначе, правильно derhab говорит, надо искать этот бокс не в классе, а в экземпляре (руте или где-ты там это добро создаешь)

Вот, пока писал ответ derhab-у, ещё появилось... СПАСИБО! Буду разбираться.

derhab 27.06.2007 15:24

Цитата:

Сообщение от silin
-дальше: у answers нет статического свойства box, сделай его статическим (static var box:Sprite=new Sprite; в классе answers)и тогда ship его увидит..
зы: а иначе, правильно derhab говорит, надо искать этот бокс не в классе, а в экземпляре (руте или где-ты там это добро создаешь)

ну да...я просто решил, что если danhuu не сделал box статическим, значит ему так нужно..

silin 27.06.2007 15:33

:) я со своей стороны подумал: раз answers.box, то имеется ввиду статик..
чего лучше, не всегда ясно, хотя если это document class, то чего бы ему не быть статиком

danhuu 28.06.2007 13:45

Цитата:

Сообщение от derhab
ну да...я просто решил, что если danhuu не сделал box статическим, значит ему так нужно..

Вы меня сильно переоцениваете :)
Спасибо за советы! Сделал box статическим, каравеллу добавил, как на AS3.ru написано (и Miramax спасибо!), вроде заработало. Но, естественно, один раз - листенер ENTER_FRAME после срабатывания убирается, иначе постоянно генерит. Пытаюсь присобачить проверку столкновения к box:
Код:

package
{
        import flash.display.Sprite;
        import flash.display.Stage;
        import flash.text.*;
        import flash.events.*;
        import flash.utils.Timer;

        public class answers extends Sprite
        {
                var words:Array=[{val:"Гаити",flag:true},{val:"Ньюфаундленд",flag:false},{val:"Гренландия",flag:false},{val:"Куба",flag:true},{val:"Цейлон",flag:false},{val:"Великобритания",flag:false},{val:"Ямайка",flag:true},{val:"Антарктида",flag:false},{val:"табак",flag:true},{val:"индейцы",flag:true},{val:"золото",flag:false},{val:"Тринидад",flag:true},{val:"Шпицберген",flag:false},{val:"мыс Дежнёва",flag:false},{val:"Амазонка",flag:false}];
                var i:int=0;// итератор слов
                // создаём 10-секундный таймер и поле отсчёта
                var timer:Timer=new Timer(1000,10);
                var timerField:TextField=new TextField  ;
                // создаём клип-контейнер
                static var box:Sprite=new Sprite  ;
                // создаем поле ответа
                var tf:TextField=new TextField  ;

                public function answers():void
                {
                        //создаём каравеллу
                        var caravella:ship=new ship  ;
                        caravella.x=stage.stageWidth / 2;
                        caravella.y=stage.stageHeight / 2;
                        addChild(caravella);
                        //добавляем листенеры к таймеру
                        timer.addEventListener(TimerEvent.TIMER,onTick);
                        timer.addEventListener(TimerEvent.TIMER_COMPLETE,onTimerComplete);
                        // Перехватываем нажатие кнопки мыши
                        box.addEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown);
                        // Отпускание мышки
                        box.addEventListener(MouseEvent.MOUSE_UP,handleMouseUp);
                        //Отпускание мышки за пределами флэшки
                        box.addEventListener(MouseEvent.MOUSE_OUT,handleMouseUp);
                        //запускаем первое слово
                        newWord(i);
                }
                //собственно функция появления варианта ответа
                private function newWord(i):void
                {
                        //запускаем таймер
                        timer.reset();
                        timer.start();
                        //поле таймера
                        timerField.x=450;
                        timerField.text="Осталось " + timer.repeatCount + " с.";
                        addChild(timerField);
                        //заполняем и форматируем поле ответа
                        tf.autoSize=TextFieldAutoSize.LEFT;
                        tf.selectable=false;
                        tf.text=words[i].val;
                        var format:TextFormat=new TextFormat  ;
                        format.font="Verdana";
                        format.size=16;
                        format.bold=true;
                        tf.setTextFormat(format);
                        //выводим клип и суём туда текстовое поле
                        box.x=10;
                        box.y=10;
                        addChild(box);
                        box.addChild(tf);
                        box.addEventListener(Event.ENTER_FRAME,efHandler);
                }
                //Функции Drag&Drop
                private function handleMouseDown(event:MouseEvent):void
                {
                        box.startDrag();
                }
                private function handleMouseUp(event:MouseEvent):void
                {
                        box.stopDrag();
                }
                //функция столкновения
                private function efHandler(event:Event):void
                {
                        if (box.hitTestObject(Object(answers).caravella)) {
                                trace("ку-ку");
                                removeEventListener("enterFrame",efHandler);
                        }
                }
                //функции таймера
                private function onTick(event:TimerEvent):void
                {
                        // показывает счётчик
                        var t:int=event.target.repeatCount - event.target.currentCount;
                        timerField.text="Осталось " + t + " с.";
                }
                private function onTimerComplete(event:TimerEvent):void
                {
                        //клип-контейнер и счётчик исчезают
                        removeChild(timerField);
                        box.removeChild(tf);
                        removeChild(box);
                        //если не дошли до конца, сдвигаем итератор и запускаем следующее слово
                        if (i < words.length - 1) {
                                i++;
                                newWord(i);
                        }

                }
        }
}

Класс ship пока пустой, туда собираюсь сделать функцию утопления/всплывания.
Теперь соответственно, ругань на каравеллу. Статической я её сделать не могу, так? По-всякому пробовал к ней обращаться - либо undefined, либо possibly undefined, либо, в последнем варианте (в коде выделено красненьким) Type error: hitTestObject param must not be null. Почему такой вариант - trace(caravella.parent), если добавить сразу после addChild(caravella), выводит [object answers]
Просветите, пожалуйста, где я опять ошибся?

derhab 28.06.2007 14:47

что ж ты пишешь?)
Код:

(box.hitTestObject(Object(answers).caravella))
у тебя answers документ класс, базовый, это твой рут. А каравелла это объект в руте. Из класса answers обращайся к нему просто:
Код:

(box.hitTestObject(caravella))


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

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