Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Работа с stage, обязательно ли добавлять в него контейнер типа sprite (http://www.flasher.ru/forum/showthread.php?t=136660)

Killer_13 22.02.2010 19:20

Работа с stage, обязательно ли добавлять в него контейнер типа sprite
 
Прив всем.
Хочу убрать масштабирование флешки.
Делаю

Код AS3:

import flash.display.StageScaleMode;
 
                public function MainScreen (){
                        stage.scaleMode = StageScaleMode.NO_SCALE;
 
                }

при этом
Код AS3:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
        at MainScreen()
        at Main()

мое мнение - это может быть из-за того, что я не добавлял свой главный контейнер, в котором все отображается на stage , а просто добавил его
Код AS3:

addChild(contaier);

может правильно переписать
Код AS3:

stage.addChild(contaier);

и все заработает?


Подскажите как исправить...

wvxvw 22.02.2010 19:30

Искать по ключу Event.ADDED_TO_STAGE.

Killer_13 22.02.2010 20:12

Чет не оч работает..
Или я неправильно понял работу команды

Я хочу, чтоб когда я скомпилирую проект - исчезла возможность растягивать ролик. У меня к примеру размеры 900 на 500, и я хочу, чтоб они так и оставались без изменений. Чтоб пользователь не смог расширить окно.
Код AS3:

                public function MainScreen (){
 
                        if(stage) init();
                                  else addEventListener(Event.ADDED_TO_STAGE, init);
 
 
                }
 
//-----------------------------------------------------------
 
                private function init(event:Event=0):void{
 
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        lobbyBtn();
                        optBtn();
                        exitBtn();
                        player();
                }

Отключение меню клика правой клавишей работает.
Код AS3:

stage.showDefaultContextMenu = false;


wvxvw 22.02.2010 20:21

http://flasher.ru/forum/showthread.p...ADDED_TO_STAGE

Killer_13 22.02.2010 20:27

... Насколько я понимаю, stage у меня определяется, поскольку этот код работает.
Код AS3:

                private function init(event:Event=null):void{
 
                        stage.scaleMode = StageScaleMode.NO_SCALE;//эта не работает..
                        stage.showDefaultContextMenu = false;//Эта строка работает
                        lobbyBtn();
                        optBtn();
                        exitBtn();
                        player();
                }

а первый свой контейнер, я добавляю в
Код AS3:

private function lobbyBtn(){
 
                        var lab:TextField = crLabel(37,70,95,35,"LOBBY");
 
                        Btn1.x = 95;
                        Btn1.y = 88;
 
                        btn_Box1.addChild(Btn1);
                        btn_Box1.addChild(lab);
                        addChild(btn_Box1);
 
                        btn_Box1.addEventListener(MouseEvent.ROLL_OVER, over_Btn);
                        btn_Box1.addEventListener(MouseEvent.ROLL_OUT, out_Btn);
                        btn_Box1.addEventListener(MouseEvent.CLICK, box);
                }


wvxvw 22.02.2010 20:38

OK, событие называется ADDED_TO_STAGE, что в переводе на общедоступный значит - "добавлен на сцену". По-моему, из названия события очевидно зачем оно нужно - просигналить, когда объект попал в дисплей лист.

Killer_13 22.02.2010 20:46

Я так понимаю, вы меня хотите навести на правильный ответ, что есть очень хорошо.
Но я написал, все что понял из ваших подсказок, и прошу помочь подправить в коде то, что я хочу осуществить...

Добавлено через 54 минуты
=========================

Ну вот никак не пойму, почему

Код AS3:

                        stage.scaleMode = StageScaleMode.NO_SCALE;//НЕ работает!!!
                        stage.align = StageAlign.TOP_LEFT;//работает
                        stage.showDefaultContextMenu = false;//работает

подскажите... :(

wvxvw 22.02.2010 22:25

Код AS3:

package tests 
{
        //{ imports
        import flash.display.Sprite;
        import flash.events.Event;
        //}
 
        /**
        * Main class.
        * @author wvxvw
        * @langVersion 3.0
        * @playerVersion 10.0.32
        */

        public class Main extends Sprite
        {
                //--------------------------------------------------------------------------
                //
                //  Constructor
                //
                //--------------------------------------------------------------------------
 
                public function Main()
                {
                        super();
                        // если stage доступен - значит этот класс был добавлен на сцену из timeline
                        if (super.stage) this.addedToStageHandler(null);
                        // в противном случае - подождем
                        else super.addEventListener(
                                Event.ADDED_TO_STAGE, this.addedToStageHandler);
                }
 
                //--------------------------------------------------------------------------
                //
                //  Protected methods
                //
                //--------------------------------------------------------------------------
 
                protected function addedToStageHandler(event:Event):void
                {
                        // Entry point
                }
        }
}


Killer_13 23.02.2010 01:05

Сделал так как вы написали, - но результат прежний...

Не в обиду, но мне кажется что вы не дочитали до конца в чем вопрос, и что у меня не получается...
Или я совсем нуб, если это так, то прошу прощения, что морочу голову...

Код AS3:

                public function Main() {
 
                        super();
                        // если stage доступен - значит этот класс был добавлен на сцену из timeline
                        if (super.stage) this.addedToStageHandler(null);
                        // в противном случае - подождем
                        else super.addEventListener(
                                Event.ADDED_TO_STAGE, this.addedToStageHandler);
 
 
                }
 
                protected function addedToStageHandler(event:Event):void
{
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        stage.scaleMode = StageScaleMode.NO_SCALE;// не работает!!!
                        stage.align = StageAlign.TOP_LEFT;// работает
                        stage.showDefaultContextMenu = false;// работает
 
                        var scrTimer:Timer = new Timer(1000, 1);
 
                        scrTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
 
                        scrTimer.start();
                        addChild(fon);
 
                }


GentleFLASH 23.02.2010 01:16

В смысле не работает? Все так же ошибки выдает?

Кстати removeEventListener(Event.ADDED_TO_STAGE, init) почему то снимается с функции init, а не с addedToStageHandler..

wvxvw 23.02.2010 01:16

Ну может вы его переназначаете где-то в другом месте :S У меня все нормально работает.

Killer_13 23.02.2010 01:18

Нет, - все прекрасно компилируется.!!
Но мне нужно, отменить масштабироавние ролика!!!

Как я писал раньше...

Цитата:

Я хочу, чтоб когда я скомпилирую проект - исчезла возможность растягивать ролик. У меня к примеру размеры 900 на 500, и я хочу, чтоб они так и оставались без изменений. Чтоб пользователь не смог расширить окно.
Из трех строк кода которые дописал
Код AS3:

stage.scaleMode = StageScaleMode.NO_SCALE;// не работает!!!
stage.align = StageAlign.TOP_LEFT;// работает
stage.showDefaultContextMenu = false;// работает


ps_spectre 23.02.2010 01:22

Killer_13, все прекрасно работает.

кстате, а что это у тебя за
removeEventListener(Event.ADDED_TO_STAGE, init);
если
super.addEventListener(Event.ADDED_TO_STAGE, this.addedToStageHandler);
тем более, раз уж на то пошло, то лучше еще добавить
if (super.hasEventListener(Event.ADDED_TO_STAGE))
{
super.removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}


wvxvw, кста, а зачем super? если можно this ? Ну в смысле, как лучше использовать?.. или больше дело вкуса?

GentleFLASH 23.02.2010 01:23

В смысле не работает? Все так же ошибки выдает?

Кстати removeEventListener(Event.ADDED_TO_STAGE, init) почему то снимается с функции init, а не с addedToStageHandler..

Killer_13 23.02.2010 01:31

ps_spectre - сейчас вопрос в этом не стоит!!!
Смотрите пожалуйста пост №12.

GentleFLASH 23.02.2010 01:36

В смысле "// не работает!!!"? Все так же ошибки выдает?

Если ошибки, то напиши:

Код AS3:

trace( "stage: " + stage );
trace( "stage.scaleMode: " + stage.scaleMode );
trace( "StageScaleMode.NO_SCALE: " + StageScaleMode.NO_SCALE );
 
stage.scaleMode = StageScaleMode.NO_SCALE; // не работает!!!
 
trace( "stage.scaleMode: " + stage.scaleMode );
 
stage.align = StageAlign.TOP_LEFT;// работает
stage.showDefaultContextMenu = false;// работает

А там увидим, что выдаст

Killer_13 23.02.2010 01:42

Вложений: 1
Я же написал - не ошибки, все компилирется, не работает нужная мне строка - я незнаю почему!
Код AS3:

stage.scaleMode = StageScaleMode.NO_SCALE;// не работает!!!


GentleFLASH 23.02.2010 01:43

Все прекрасно работает! Так и должно быть!
Смысл StageScaleMode.NO_SCALE - не менять масштаба флэшки, т.е оставлять все на 100%, а не предоставлять возможность не растягивать окно плеера.

ps_spectre 23.02.2010 01:45

Killer_13, слух, я кажется догадываюсь что ты пытаешься сказать...
ты имеешь ввиду, как запретить пользователю растягивать окно флеш плеера? Если так - то этого не сделать.
А если то, что все подразумевают, то stage.scaleMode = StageScaleMode.NO_SCALE работает, и работает правильно => если пользователь меняет размер окна флеш плеера, то содержимое никуда не растягивается, а остается неизмененным, но при этом, прекрасно отрабатывает событие Event.RESIZE.
ты можешь на него подписаться, и посмотреть, если отрабатывает RESIZE, значит NO_SCALE правильно выставлен.
this.stage.addEventListener(Event.RESIZE, метод);

пока писал, скриншота не видел => все у тебя работает правильно.

Killer_13 23.02.2010 01:53

Всем спасибо. Значит такое сделать невозможно. :)
Вопрос решен.

ps_spectre 23.02.2010 01:56

Killer_13, в догонку: если ты пишешь под веб - тогда это решается при встраивание флешки в html страницу. Если хочешь делать настольное приложение - тогда смотри в сторону AIR.

Killer_13 23.02.2010 02:02

Спасибо.
Пока только настольное, первая игрушка, много косяков, сного делается неправильно, и так д...
Нууу.. как наверное и все первые приложения, - начинания..
:)

wvxvw 23.02.2010 02:19

Цитата:

Сообщение от ps_spectre (Сообщение 888548)
wvxvw, кста, а зачем super? если можно this ? Ну в смысле, как лучше использовать?.. или больше дело вкуса?

Я пишу this если именно этот класс объявил метод / свойство, либо этот метод предназначен для того, чтобы его переопределил наследник и при этом нужно чтобы другие ссылки на этот метод в в классе наследнике тоже указывали не переопределенный метод. (Второй враиант - довольно редкая ситуация). Например, у нас есть функция invalidateSize() которая в свою очередь вызывает invalidateWidth() и invalidateHeight(), предположим, наследник переопределил invalidateWidth(), в таком случае, чтобы наследник из invalidateSize() вызвал свою (а не super) функцию, я буду писать this. По умолчанию - я всегда пишу super (птому что если не указывать, то по умолчанию - this).
Кроме того, мне так удобнее ориентироваться - т.как если я вижу super - я уже знаю, что это "не родное". Ну и если ошибки - сразу знаешь где искать.

ps_spectre 23.02.2010 02:30

wvxvw, спасибо за развернутый ответ, все стало понятно.

ERrorMAKros 24.02.2010 08:37

Цитата:

Сообщение от GentleFLASH (Сообщение 888543)
Кстати removeEventListener(Event.ADDED_TO_STAGE, init) почему то снимается с функции init, а не с addedToStageHandler..

тогда попробуем:
Код AS3:

removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);



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

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