KeyboardEvent funktioniert nicht

Zelos666

Grünschnabel
Das hier ist mein erster Post, also sag ich einfach direkt mal "Hallo". :)
Ich wurde von diesem Tutorial hier auf das Forum verwiesen:
http://www.tutorialflash.de/flash-as3-kurs-teil-1-grundlagen-von-actionscript/
und habe schon direkt im ersten Kapitel ein Problem.

Ich bin dem Tutorial so gut wie möglich gefolgt, aber es will einfach nicht laufen. Und zwar habe ich drei Frames - Frame 1 fürs Menü, Frame 2 für die Anleitung und Frame 3 ist ein Frame, auf dem sich ein Raumschiff durch Drücken der Richtungstasten bewegen soll. Das tut es aber einfach nicht. Es passiert einfach gar nichts, und wenn ich die Tasten oft genug drücke, kommt das hier:
Code:
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.
at test_fla::MainTimeline/ship_handler()

Das Seltsame ist jetzt, dass alles wunderbar funktioniert, wenn ich die ersten beiden Frames, also das ganze Menüzeug, einfach entferne. Ich poste mal den Code der einzelnen Frames hier und hänge auch die .fla an. Ich hoffe, jemand kann mir helfen.
Außerdem, falls jemand die Datei nicht öffnen kann, habe ich das hier hochgeladen:

http://loppipoppi.lo.funpic.de/schiff/

test.html ist die Datei mit Menü, was nicht geht, und test2.html ist haargenau die gleiche Datei, nur dass ich die ersten beiden Frames "removed" habe, sonst wirklich absolut keine Änderung. Man muss hier einmal draufklicken, damit die Steuerung funktioniert.


Frame 1
(Buttons "rules" und "starter")
Code:
stop();

rules.addEventListener(MouseEvent.CLICK, rules_handler);
starter.addEventListener(MouseEvent.CLICK, starter_handler);


function rules_handler(e:MouseEvent):void 
{
	gotoAndStop(2);
}

function starter_handler(e:MouseEvent):void 
{
	gotoAndStop(3);
}

Frame 2
(Button "btn_back")
Code:
stop();

btn_back.addEventListener(MouseEvent.CLICK, btn_back_handler);

function btn_back_handler(e:MouseEvent):void
{
	gotoAndStop(1);
}

Frame 3
(Movie Clip "raumschiff")
Code:
stop();

var speed:int = 5;

stage.addEventListener(KeyboardEvent.KEY_DOWN, ship_handler)

function ship_handler(e:KeyboardEvent):void
{
	if (e.keyCode == Keyboard.LEFT)
	{
		raumschiff.x -= speed;
	} else if (e.keyCode == Keyboard.RIGHT)
	{
		raumschiff.x += speed;
	} else if (e.keyCode == Keyboard.UP)
	{
		raumschiff.y -= speed;
	} else if (e.keyCode == Keyboard.DOWN)
	{
		raumschiff.y += speed;
	}
}

Ich habe das auch durch den Debugger laufen lassen und der Fehler kommt immer, wenn raumschiff.x oder raumschiff.y aufgerufen werden soll.
 

Anhänge

  • test.fla
    20,6 KB · Aufrufe: 19
Zuletzt bearbeitet:
Hi und Willkommen,

frag mich nicht warum das einmal geht und einmal nicht. Ich vermute, dass die Datei fehlerhaft ist, oder du vermutlich schon in dem Status einen Loader benötigst.

Der Hinweis besagt, dass zum Zeitpunkt des Aufrufs, dein MC raumschiff nicht existiert, weshalb die Anweisungen, es auf der x-Achse etc. zu verschieben ins Leere laufen.

Ich habe jetzt das Symbol kopiert, es "raumschiff_sym" benannt.
Hier habe ich für ActionScript-Export und Bild1 noch einen Haken gesetzt.
Dann eine Instanz auf die Bühne gezogen, zuvor das alte Raumschiff gelöscht, und der neuen Instannz den Namen raumschiff gegeben.
Jetzt geht es auch ohne die 2 Bilder zuvor löschen zu müssen.

VG
 

Anhänge

  • test2.fla
    31,4 KB · Aufrufe: 17
  • test2.swf
    10,8 KB · Aufrufe: 17
Hallo,

deine Datei funktioniert wunderbar. Ich habe es auch nochmal neu erstellt und plötzlich ging es bei mir auch. Wirklich ziemlich seltsam.
Danke für die Antwort. Ich gehe dann einfach mal davon aus, dass es nicht mein Fehler war und die Software einfach ein paar Probleme hatte. :)
 
Hi,

schön, dass es klappt.

Evtl. hat auch mal wieder der "Mach den Rechner aus - probier es morgen noch einmal - Bug" zugeschlagen :)
Ist bei mir auch schon paar mal passiert. Deshalb immer mal wieder eine Version speichern und sichern, nicht dass man nur mit einer Version arbeitet und man die ohne Selbstverschulden mal zerschießt.

Bei Flash immer mal wieder das Programm nach einer längeren Zeit schließen und wieder öffnen.
 
Zurück