2014-10-30 4 views
0

Я импортировать внешний SWF в мой основной проект, используя код: благородные предшественникиAS3 TypeError: Error # 1009: Не удается получить доступ к свойству или методу нулевой ссылки на объект при импорте внешних .swf

var FirstLevelLoader:Loader = new Loader(); 
var FirstLevelFile:URLRequest = new URLRequest("Mainlv.swf"); 


//load level one 
startlevelbttn.addEventListener(MouseEvent.CLICK, LoadFirstLevel); 

function LoadFirstLevel(e:Event){ 
FirstLevelLoader.load(FirstLevelFile); 
addChild(FirstLevelLoader); 
} 

Этот же тип кода отлично работает при импорте других swf, но для Mainlv он не делает этого, он говорит мне об ошибке.

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
at Mainlv/createPlayer() 
at Mainlv() 

Так что я предполагаю, что ошибка в файле Mainlv.swf, но я не понимаю, что это неправильно и работает этот файл самостоятельно не производит никаких ошибок. Вот код для файла.

package 
{ 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.events.MouseEvent; 
import flash.utils.Timer; 
import flash.events.TimerEvent; 



public class Mainlv extends MovieClip 

{ 


    // player settings  
    private var _moveSpeedMax:Number = 1000; 
    private var _rotateSpeedMax:Number = 15; 
    private var _decay:Number = .98; 
    private var _destinationX:int = 150; 
    private var _destinationY:int = 150; 

    // player 
    private var _player:MovieClip; 

    // global 
    private var _isActive:Boolean = false; 

    private var _dx:Number = 0; 
    private var _dy:Number = 0; 

    private var _vx:Number = 0; 
    private var _vy:Number = 0; 

    private var _trueRotation:Number = 0; 

    private var allbullets:Array = new Array(); 

    private var allast:Array = new Array(); 

    private var score:int=0; 

    /** 
    * Constructor 
    */ 
    public function Mainlv() 
    { 
     // create player object 
     createPlayer(); 


     // add listeners 
     stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
     stage.addEventListener(MouseEvent.MOUSE_OVER, onMouseUpHandler); 
     stage.addEventListener(MouseEvent.MOUSE_OVER, onMouseDownHandler); 
     stage.addEventListener(MouseEvent.CLICK, triggerbullet); 


    } 


    private function triggerbullet(event:Event){ 
     var mybullet:Bullet= new Bullet(); 
     stage.addChild(mybullet); 
     mybullet.x=_player.x; 
     mybullet.y=_player.y; 
     mybullet.rotation=_player.rotation; 

     allbullets.push(mybullet); 


    } 

    /** 
    * Creates player 
    */ 
    private function createPlayer():void 
    {   
     _player = new Player(); 
     _player.x = stage.stageWidth/2; 
     _player.y = stage.stageHeight/1.15; 
     stage.addChild(_player); 
    } 

    /** 
    * EnterFrame Handlers 
    */ 
    private function enterFrameHandler(event:Event):void 
    { 
     updatePosition(); 
     updateRotation(); 

     scorebox.text=String(score); 

     var t:Number = Math.random(); 
     if(t>0.98) { 
      addasteroid(); 
     } 

     for (var a:int = 0;a<allast.length;a++) { 
      for (var b:int = 0;b<allbullets.length;b++) { 

       if (allbullets[b].hitTestObject(allast[a])) { 
        //removeChild(allbullet[b]); 
        removeChild(allast[a]); 

        //score  
        score+=5; 

        if (score==100) { 
         dispatchEvent(new Event("next_level")); 
        } 

       } 
       if (allast[a].hitTestObject(_player)) { 
        //removeChild(allbullet[b]); 
        trace("hitplayer"); 
        endGame(); 
       } 


      } 

      allast[a].y += 3; 
     } 

    }//function 



    /*END GAME*/ 
    private function endGame() { 
     stage.removeChild(_player); 
     dispatchEvent(new Event("END_GAME")); // call End_game function to exit external swf 
    } 



    /** 
    * Calculate Rotation 
    */ 
    private function updateRotation():void 
    { 
     // calculate rotation 
     _dx = _player.x - _destinationX; 
     _dy = _player.y - _destinationY; 

     // which way to rotate 
     var rotateTo:Number = getDegrees(getRadians(_dx, _dy)); 

     // keep rotation positive, between 0 and 360 degrees 
     if (rotateTo > _player.rotation + 180) rotateTo -= 360; 
     if (rotateTo < _player.rotation - 180) rotateTo += 360; 

     // ease rotation 
     _trueRotation = (rotateTo - _player.rotation)/_rotateSpeedMax; 

     // update rotation 
     _player.rotation += _trueRotation;   
    } 

    /** 
    * Calculate Position 
    */ 
    private function updatePosition():void 
    { 
     // check if mouse is down 
     if (_isActive) 
     { 
      // update destination 
      _destinationX = stage.mouseX; 
      _destinationY = stage.mouseY; 

      // update velocity 
      _vx += (_destinationX - _player.x)/_moveSpeedMax; 
      _vy += (_destinationY - _player.y)/_moveSpeedMax; 
     } 
     else 
     { 
      // when mouse is not down, update velocity half of normal speed 
      _vx += (_destinationX - _player.x)/_moveSpeedMax * .25; 
      _vy += (_destinationY - _player.y)/_moveSpeedMax * .25; 
     } 

     // apply decay (drag) 
     _vx *= _decay; 
     _vy *= _decay; 

     // if close to target, slow down turn speed 
     if (getDistance(_dx, _dy) < 50) 
     { 
      _trueRotation *= .5; 
     }   

     // update position 
     _player.x += _vx; 
     _player.y += _vy; 
    } 

    /** 
    * Mouse DOWN handler 
    * @param e 
    */ 
    private function onMouseDownHandler(e:MouseEvent):void 
    { 
     _isActive = true; 
    } 

    /** 
    * Mouse UP handler 
    * @param e 
    */ 
    private function onMouseUpHandler(e:MouseEvent):void 
    { 
     _isActive = false; 
    } 

    /** 
    * Get distance 
    * @param delta_x 
    * @param delta_y 
    * @return 
    */ 
    public function getDistance(delta_x:Number, delta_y:Number):Number 
    { 
     return Math.sqrt((delta_x*delta_x)+(delta_y*delta_y)); 
    } 

    /** 
    * Get radians 
    * @param delta_x 
    * @param delta_y 
    * @return 
    */ 
    public function getRadians(delta_x:Number, delta_y:Number):Number 
    { 
     var r:Number = Math.atan2(delta_y, delta_x); 

     if (delta_y < 0) 
     { 
      r += (2 * Math.PI); 
     } 
     return r; 
    } 

    /** 
    * Get degrees 
    * @param radians 
    * @return 
    */ 
    public function getDegrees(radians:Number):Number 
    { 
     return Math.floor(radians/(Math.PI/180)); 
    } 


    public function addasteroid() { 
     var newast:asteroid = new asteroid(); 
     newast.x=Math.random()*950; 
     newast.y=Math.random()*200; 

     addChild(newast); 

     allast.push(newast); 
    } 





} //don't code outside of here 

} // конец

+0

Один из миллионов точно таких же вопросов, когда кодер использует этап в конструкторе, а затем не может понять, почему он выдает ошибку, так как этап имеет значение null в конструкторе ... миллионы. – BotMaster

ответ

0

Ваша задача прийти с помощью stage в классе без добавления экземпляра класса к родительскому стадии.

Так что ваш код должен выглядеть так:

... 

public function Mainlv() {   
    this.addEventListener(Event.ADDED_TO_STAGE, init) 
} 

private function init(e:Event){ 
    this.removeEventListener(Event.ADDED_TO_STAGE, init); 
    stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
    stage.addEventListener(MouseEvent.MOUSE_OVER, onMouseUpHandler); 
    stage.addEventListener(MouseEvent.MOUSE_OVER, onMouseDownHandler); 
    stage.addEventListener(MouseEvent.CLICK, triggerbullet); 
    createPlayer() 
} 

... 

И не забудьте добавить экземпляр Mainlv родительской стадии:

import Mainlv 

var m:Mainlv = new Mainlv() 

addChild(m) 

Я тестировал этот код и он работает отлично.

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

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