2013-05-10 2 views
-1

Я создаю стреляющую игру. Я столкнулся с проблемой с моим кодом, когда решил создать метод удаления ракеты после достижения вершины сцены. Я могу запустить программу без каких-либо проблем только я понял, что ракета не удалялась со сцены, если я держу кнопку съемки. Однако, если я нажму кнопку съемки, ракета будет удалена с этой ошибкой # 1009, напечатанной на выходе.Actionscript 3 возвращает Ошибка # 1009

У вас есть решение проблемы.

Вот это ошибка после того, как ракета полетела к началу сцены с отладкой:

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
at Missle/destroyMissle()[E:\Experiment\ExperimentProject\Missle.as:39] 
at main/checkMissleOffScreen()[E:\Experiment\ExperimentProject\main.as:63] 
at main/eventUpdated()[E:\Experiment\ExperimentProject\main.as:51] 

Вот основной своим класс:

package 
{ 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.events.KeyboardEvent; 

/** 
* ... 
* @author test 
*/ 
public class main extends MovieClip 
{ 
    //Objects 
    public var rect:MovieClip; 
    public var missle:Missle; 

    //Array 
    private var missleArray:Array; 

    //Keyboard section 
    var leftKeyIsDown:Boolean; 
    var rightKeyIsDown:Boolean; 
    var upKeyIsDown:Boolean; 
    var downKeyIsDown:Boolean; 
    var spaceKeyIsDown:Boolean; 

    //Speed 
    var characterSpeed:Number = 15; 

    //Main constructor 
    public function main() 
    { 
     //Array initializer 
     missleArray = new Array(); 
     missle = new Missle(); 

     //Update events listeners. 
     stage.addEventListener(Event.ENTER_FRAME, eventUpdated); 

     //Update keyboard events listeners 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); 
     stage.addEventListener(KeyboardEvent.KEY_UP, keyUnpressed); 
    } 

    //Events functions 
    //This functions updated everytime the object is move 
    private function eventUpdated(e:Event):void 
    { 
     playerMoving(); 
     playerClampMoving(); 
     checkMissleOffScreen(); 
    } 

    private function checkMissleOffScreen():void 
    { 
     for (var i = 0; i < missleArray.length; i++) 
     { 
      var currentMissle:Missle = missleArray[i]; 

      if (currentMissle.y < 0) 
      { 
       missleArray.splice(i, 1); 
       missle.destroyMissle(); 

      } 
     } 
    } 

    private function playerClampMoving():void 
    { 
     if (rect.x < 0) 
     { 
      rect.x = 0; 
     } 
     if (rect.x > stage.stageWidth - rect.width) 
     { 
      rect.x = stage.stageWidth - rect.width; 
     } 
     if (rect.y < 0) 
     { 
      rect.y = 0; 
     } 
     if (rect.y > stage.stageHeight - rect.height) 
     { 
      rect.y = stage.stageHeight - rect.height; 
     } 
    } 

    private function playerMoving():void 
    { 
     if (leftKeyIsDown == true) 
     { 
      rect.x -= characterSpeed; 
     } 
     if (rightKeyIsDown == true) 
     { 
      rect.x += characterSpeed; 
     } 
     if (upKeyIsDown == true) 
     { 
      rect.y -= characterSpeed; 
     } 
     if (downKeyIsDown == true) 
     { 
      rect.y += characterSpeed; 
     } 
     if (spaceKeyIsDown == true) 
     { 
      shootingMissle(); 
     } 
    } 

    private function shootingMissle():void 
    { 
     missle = new Missle(); 
     missle.x = rect.x + (rect.width/2); 
     missle.y = rect.y; 

     missleArray.push(missle); 
     trace(missleArray.length); 

     stage.addChild(missle); 
    } 

    //Keyboard functions 
    //Check to see whether the user releases the keyboard 
    private function keyUnpressed(e:KeyboardEvent):void 
    { 
     if (e.keyCode == 37) 
     { 
      leftKeyIsDown = false; 
     } 
     if (e.keyCode == 39) 
     { 
      rightKeyIsDown = false; 
     } 
     if (e.keyCode == 40) 
     { 
      downKeyIsDown = false; 
     } 
     if (e.keyCode == 38) 
     { 
      upKeyIsDown = false; 
     } 
     if (e.keyCode == 32) 
     { 
      spaceKeyIsDown = false; 
     } 
    } 

    //Check to see whether the user presses the keyboard 
    private function keyPressed(e:KeyboardEvent):void 
    { 
     if (e.keyCode == 37) 
     { 
      leftKeyIsDown = true; 
     } 
     if (e.keyCode == 39) 
     { 
      rightKeyIsDown = true; 
     } 
     if (e.keyCode == 40) 
     { 
      downKeyIsDown = true; 
     } 
     if (e.keyCode == 38) 
     { 
      upKeyIsDown = true; 
     } 
     if (e.keyCode == 32) 
     { 
      spaceKeyIsDown = true; 
     } 
    } 

    } 

} 

Вот КЛАСС Missle в:

package 
{ 
import flash.display.Sprite; 
import flash.events.Event; 

/** 
* ... 
* @author test 
*/ 
public class Missle extends Sprite 
{ 



    public function Missle() 
    { 
     addEventListener(Event.ADDED_TO_STAGE, onAdd); 
    } 

    private function onAdd(e:Event):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, onAdd); 
     //Objects are on the stage 
     init(); 
    } 

    private function init():void 
    { 
     addEventListener(Event.ENTER_FRAME, missleLaunch); 
    } 

    private function missleLaunch(e:Event):void 
    { 
     this.y -= 15; 
    } 

    public function destroyMissle():void 
    { 
     parent.removeChild(this); 
     removeEventListener(Event.ENTER_FRAME, missleLaunch); 

    } 

    } 

} 

ответ

1

Попробуйте следующее:

public function destroyMissle():void 
{ 
    if(parent !== null) parent.removeChild(this); 
    removeEventListener(Event.ENTER_FRAME, missleLaunch); 
} 

Возможно, вы звонили .destroyMissile() более чем один раз, то есть parent был бы пустым, потому что вы удалили его со сцены и у него нет родителя.

Смежные вопросы