Просмотр полной версии : Ошибка при загрузке swf
TurboDizel
13.01.2013, 20:44
Добавляю флешку в флешку (через Loader), всё отлично проходит. При этом я брал какую-то случайно попавшуюся флешку для загрузки. Но если взять флешку именно с моей игрой, то вылазит ошибка Cannot access a property or method of a null object reference. Вылазит она именно тогда, когда флешку нужно показать (на addChild скорее всего), а загружается всё предыдущее время она нормально. Искал проблему в интернете, на зарубежных сайтах тоже смотрел, нашел только единственный совет, который я понял - добавить пустой кадр игре. Не помогло.
Без кода не помогут. Скорее всего идет обращение к stage, которого на момент инициализации конструктора документ класса загружаемой флешки просто нет.
TurboDizel
14.01.2013, 00:55
Без кода не помогут. Скорее всего идет обращение к stage, которого на момент инициализации конструктора документ класса загружаемой флешки просто нет.
Тогда событие ADDED_TO_STAGE? Просто с ним тоже самое выдает:
//импорты
public class main extends MovieClip {
//переменные
public function main() {
addEventListener(Event.ADDED_TO_STAGE, mains);
}
private function mains(e:Event):void {
//тут пошла игра
}
}
Флешка, которая загружает:
public class preloader extends MovieClip {
public function preloader()
{
addChild(Load_perc);
Load_perc.x = 310;
Load_perc.y = 520;
var req:URLRequest = new URLRequest("main.swf");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, timerforgame);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, prog);
loader.load(req);
}
function prog(e:ProgressEvent):void {
loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, prog);
Load_perc.load_text.text = int((e.bytesLoaded / e.bytesTotal) * 100);
}
function timerforgame(e:TimerEvent):void {
timer.removeEventListener(TimerEvent.TIMER_COMPLETE, timerforgame);
removeChild(Load_perc);
addChild(loader);
}
}
Стек ошибки полностью? Может она в подгружаемой?
TurboDizel
14.01.2013, 01:33
Стек ошибки полностью? Может она в подгружаемой?
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at main$iinit()
Если вместо моей флешки main вставить какую-то другую, то всё норм работает.
Названо все не по конвенции, не сразу сообразил, что main - класс. Дайте код iinit()
TurboDizel
14.01.2013, 19:50
Названо все не по конвенции, не сразу сообразил, что main - класс. Дайте код iinit()
Когда попросили код функции iinit, я сразу вспомнил, что такой функции у меня нет вообще. На всякий случай проверил по кодам всё, на самом деле такой нет, ни функции ни её вызова. Решил просто попробовать добавить функцию iinit в загружаемую флеху (main называется) и вот, заработало. Функция пустая ничего не делает, и после того как я её убрал, всё дальше стало работать. Мистика какая-то, будто в какой-то кеш куда-то что-то сохранилось, и теперь эта функция iinit там лежит всегда. И зачем она вообще компилятору нужна?
Потом взял ещё одну свою флеху (называется Menu, но переименовываю потом в main), сделал с ней тоже самое, но вот она уже не работает (та же ошибка).
Ещё кстати с флехой main: если на компе запускать, то норм всё работает, в интернете уже не работает. Скорее всего та же ошибка, там её не показывает просто. Думал может Security.allowDomain("*") поможет, но не помог.
strangedk
14.01.2013, 20:13
Потом взял ещё одну свою флеху (называется Menu, но переименовываю потом в main), сделал с ней тоже самое, но вот она уже не работает (та же ошибка).
:eek:
namespaces
16.01.2013, 00:46
//импорты
public class main extends MovieClip {
//переменные
public function main() {
addEventListener(Event.ADDED_TO_STAGE, mains);
}
private function mains(e:Event):void {
//тут пошла игра
}
}
public class Main extends Sprite
{
public function Main():void
{
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//тут пошла игра
}
}
public class Main extends Sprite
{
public function Main():void
{
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//тут пошла игра
}
}
Фу, как грубо и непрактично! И чой-то у вас конструктор стал что-то возвращать. Это как в -ться ненароком ошибиться. Вроде все понимают, но как-то неудобно среди людей получается.
От как надо!
public class Main extends Sprite
{
public function Main() {
super();
super.addEventListener(Event.ADDED_TO_STAGE, this.init);
}
private function init(event:Event):void {
super.removeEventListener(event.type, arguments.callee);
//тут пошла игра
}
}
Добавлено через 17 минут
Ах, да, при таком способе инициализации
trace(super.loaderInfo.width);
И некоторые другие его свойства выдадут вам
Error: Error #2099: Загружаемый объект не настолько загрузился,
чтобы можно было получить эту информацию.
Потому предлагаю делать
public function Main() {
super();
if (super.stage) // Primary Document Class recieve the Stage in the constructor
super.addEventListener(Event.COMPLETE, this.init);
else // Loadee Document Class
super.addEventListener(Event.ADDED_TO_STAGE, this.init);
}
iflamberg
16.01.2013, 14:49
а зачем уж тогда "public function Main", конструктор никогда не бывает не public. Я всегда пишу просто "function Main".
Здесь возможна путаница. Если для метода или свойства модификатор не указан, то по умолчанию применяется модификатор internal. Но, как вы верно заметили, конструктор не может иметь никаких иных модификаторов, кроме как public. В случае, если не указан модификатор для конструктора, компилятор понимает его как public. Вот в чем дуализм корпускулярно-волновой теории.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.