Просмотр полной версии : Работа с stage, обязательно ли добавлять в него контейнер типа sprite
Killer_13
22.02.2010, 19:20
Прив всем.
Хочу убрать масштабирование флешки.
Делаю
import flash.display.StageScaleMode;
public function MainScreen (){
stage.scaleMode = StageScaleMode.NO_SCALE;
}
при этом
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at MainScreen()
at Main()
мое мнение - это может быть из-за того, что я не добавлял свой главный контейнер, в котором все отображается на stage , а просто добавил его
addChild(contaier);
может правильно переписать
stage.addChild(contaier);
и все заработает?
Подскажите как исправить...
Искать по ключу Event.ADDED_TO_STAGE.
Killer_13
22.02.2010, 20:12
Чет не оч работает..
Или я неправильно понял работу команды
Я хочу, чтоб когда я скомпилирую проект - исчезла возможность растягивать ролик. У меня к примеру размеры 900 на 500, и я хочу, чтоб они так и оставались без изменений. Чтоб пользователь не смог расширить окно.
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();
}
Отключение меню клика правой клавишей работает.
stage.showDefaultContextMenu = false;
http://flasher.ru/forum/showthread.php?t=136216&highlight=Event.ADDED_TO_STAGE
Killer_13
22.02.2010, 20:27
... Насколько я понимаю, stage у меня определяется, поскольку этот код работает.
private function init(event:Event=null):void{
stage.scaleMode = StageScaleMode.NO_SCALE;//эта не работает..
stage.showDefaultContextMenu = false;//Эта строка работает
lobbyBtn();
optBtn();
exitBtn();
player();
}
а первый свой контейнер, я добавляю в
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);
}
OK, событие называется ADDED_TO_STAGE, что в переводе на общедоступный значит - "добавлен на сцену". По-моему, из названия события очевидно зачем оно нужно - просигналить, когда объект попал в дисплей лист.
Killer_13
22.02.2010, 20:46
Я так понимаю, вы меня хотите навести на правильный ответ, что есть очень хорошо.
Но я написал, все что понял из ваших подсказок, и прошу помочь подправить в коде то, что я хочу осуществить...
Добавлено через 54 минуты
=========================
Ну вот никак не пойму, почему
stage.scaleMode = StageScaleMode.NO_SCALE;//НЕ работает!!!
stage.align = StageAlign.TOP_LEFT;//работает
stage.showDefaultContextMenu = false;//работает
подскажите... :(
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
Сделал так как вы написали, - но результат прежний...
Не в обиду, но мне кажется что вы не дочитали до конца в чем вопрос, и что у меня не получается...
Или я совсем нуб, если это так, то прошу прощения, что морочу голову...
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..
Ну может вы его переназначаете где-то в другом месте :S У меня все нормально работает.
Killer_13
23.02.2010, 01:18
Нет, - все прекрасно компилируется.!!
Но мне нужно, отменить масштабироавние ролика!!!
Как я писал раньше...
Я хочу, чтоб когда я скомпилирую проект - исчезла возможность растягивать ролик. У меня к примеру размеры 900 на 500, и я хочу, чтоб они так и оставались без изменений. Чтоб пользователь не смог расширить окно.
Из трех строк кода которые дописал
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
В смысле "// не работает!!!"? Все так же ошибки выдает?
Если ошибки, то напиши:
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
Я же написал - не ошибки, все компилирется, не работает нужная мне строка - я незнаю почему!
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, кста, а зачем 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
Кстати removeEventListener(Event.ADDED_TO_STAGE, init) почему то снимается с функции init, а не с addedToStageHandler..
тогда попробуем:
removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.