Добрый день! Сказали, что вопрос довольно простой для вас, опытных.
Скачал шаблон игрового меню, поковырял, разобрался что к чему. И столкнулся с проблемой, которую не могу локализовать.
Шаблон в скомпилированном виде:
Пытаясь добавить прослушиватель клавиатуры в класс отвечающий за отображение игры, не получаю никакой отдачи, хотя прослушиватель мыши работает как надо. Если приписываю к прослушивателю stage (ровно, как и к любой другой команде), при запуске уровня (
уточняю: при запуске уровня, не при компиляции; меню запускается нормально) получаю ошибку следующего содержания:
Цитата:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at the_game_itself()
at the_game/play_the_game()
at level_thumbnail/on_level_clicked()
|
???

Не приложу ума, в чем тут может быть загвоздка? Пробовал создать прослушиватель отдельным классом, вызвать addChild'ом - реакции те же.
Если это не напряжно, помогите, пожалуйста, понять как эту неприятность поправить.
Набор классов шаблона содержит 3 класса, которые описывает ошибка (написано много, но код довольно простой и повторяется):
the_game.as

Код AS3:
package {
import flash.display.Sprite;
public class the_game extends Sprite {
public var splash_screen:splash; //создаем переменную MovieClip'а экрана меню из fla-библиотеки, содержащую необходимый текст и кнопки. Переменные ниже - то же самое
public var play_screen:the_game_itself;
public var game_over_screen:game_over;
public var level_select_screen:level_selection;
public var how_to_play_screen:how_to_play;
public var congratz_screen:game_won;
public function the_game() {
show_splash();
}
public function show_splash() {
splash_screen = new splash(this);
how_to_play_screen=remove_movie_clip(how_to_play_screen);
level_select_screen=remove_movie_clip(level_select_screen);
game_over_screen=remove_movie_clip(game_over_screen);
congratz_screen=remove_movie_clip(congratz_screen);
addChild(splash_screen);
}
public function show_how_to_play() {
how_to_play_screen = new how_to_play(this);
splash_screen=remove_movie_clip(splash_screen);
addChild(how_to_play_screen);
}
public function show_game_over(level) {
game_over_screen = new game_over(this,level);
play_screen=remove_movie_clip(play_screen);
addChild(game_over_screen);
}
public function show_congratz(level) {
congratz_screen = new game_won(this,level);
play_screen=remove_movie_clip(play_screen);
addChild(congratz_screen);
}
public function select_the_level() {
level_select_screen = new level_selection(this);
splash_screen=remove_movie_clip(splash_screen);
how_to_play_screen=remove_movie_clip(how_to_play_screen);
game_over_screen=remove_movie_clip(game_over_screen);
congratz_screen=remove_movie_clip(congratz_screen);
addChild(level_select_screen);
}
public function play_the_game(level) {
play_screen = new the_game_itself(this,level);
level_select_screen=remove_movie_clip(level_select_screen);
game_over_screen=remove_movie_clip(game_over_screen);
congratz_screen=remove_movie_clip(congratz_screen);
addChild(play_screen);
}
private function remove_movie_clip(clip:*) {
if (clip) {
removeChild(clip);
}
return null;
}
}
}
level_thumbnail.as

Код AS3:
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.*;
import flash.net.SharedObject;
public class level_thumbnail extends Sprite {
public var main_class:the_game;
public var level_number:int;
public var shared:SharedObject;
public function level_thumbnail(i:int,passed_class:the_game) {
shared = SharedObject.getLocal("savegame");
if (shared.data.level_passed==undefined) {
shared.data.level_passed=1;
}
if (shared.data.level_passed<i) {
alpha = 0.5;
}
else {
this.buttonMode = true;
this.mouseChildren = false;
addEventListener(MouseEvent.CLICK, on_level_clicked);
}
main_class = passed_class;
level_number = i;
y = i*60-10;
leveltext.text = "Level "+i;
shared.close();
}
public function on_level_clicked(event:MouseEvent) {
main_class.play_the_game(level_number);
}
}
}
the_game_itself.as

Код AS3:
package {
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.text.*;
public class the_game_itself extends Sprite {
public var main_class:the_game;
public var current_level:int;
public function the_game_itself(passed_class:the_game,level:int) {
current_level = level;
gametext.text = "Playing level "+level;
main_class = passed_class;
die_button.addEventListener(MouseEvent.CLICK, on_die_button_clicked);
win_button.addEventListener(MouseEvent.CLICK, on_win_button_clicked);
//stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); // Вызывает ошибку 1009
addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); // Ошибок не вызывает, но не работает
}
public function keyPressed(event:KeyboardEvent) {
trace("Contact");
}
public function on_die_button_clicked(event:MouseEvent) {
main_class.show_game_over(current_level);
}
public function on_win_button_clicked(event:MouseEvent) {
main_class.show_congratz(current_level);
}
}
}
Во вложениях залил архив с исходником, если описанных классов не хватит.
Понимаю, что просьба - просмотреть относительно большой объем кода, но уже не знаю, к кому или куда обратиться.