2014-12-24 1 views
3

모든 발주자는 당신이 아래에 볼 수있는 것은 좋은 멤버가 나null 객체 참조를주는 클래스에서 타임 라인 객체에 액세스 하시겠습니까? 여전히 활성 대답이 질문에 아직 도달하지

에러를 발견 의미도 없습니다 구문 오류입니다 :

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

때 'm은 인스턴스 이름이 wall0x 인 객체를 인스턴스 이름 world와 함께 객체에 추가하려고 시도했지만 null 객체 오류가 발생합니다. 관련없는 변수의 긴 목록도 무시하십시오.

package 
{ 

    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.events.TimerEvent; 
    import flash.filters.BlurFilter; 
    import flash.utils.Timer; 



    public class Player extends MovieClip 
    { 
     // player settings 



     private var _rotateSpeedMax:Number = 20; 
     public var _gravity:Number = .10; 
     // projectile gun settings 
     public var _bulletSpeed:Number = 4; 
     public var _maxDistance:Number = 200; 
     public var _reloadSpeed:Number = 250;//milliseconds 
     public var _barrelLength:Number = 20; 
     public var _bulletSpread:Number = 5; 
     // gun stuff 
     private var _isLoaded:Boolean = true; 
     private var _isFiring:Boolean = false; 
     private var _endX:Number; 
     private var _endY:Number; 
     private var _startX:Number; 
     private var _startY:Number; 
     private var _reloadTimer:Timer; 
     private var _bullets:Array = []; 

     // array that holds walls 

     public var _solidObjects:Array = []; 

     // 
     private var _player:MovieClip; 
     private var _dx:Number; 
     private var _dy:Number; 
     private var _pcos:Number; 
     private var _psin:Number; 
     public var _trueRotation:Number; 



     public function Player() 
     { 

      // constructor code //Right hereVVVthe instance name is wall0x and it's in the object world on the stage.        
       _solidObjects = [MovieClip(root).world.wall01,MovieClip(root).world.wall02,MovieClip(root).world.wall03,MovieClip(root).world.wall04]; 


      /*addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
      addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler); 
      addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);*/ 
      } 

     } 
} 

코드 프레임 2에서 플레이어를 만든 다음 코드를 다른 개체에 계속 설정합니다.

stage.addEventListener(Event.ENTER_FRAME, createPlayer); 
function createPlayer(e:Event):void 
     { 


      // attach player movieclip from library 

      // position player in center 
      if (character!=null&&_player!=null) 
      { 

       _player.x = character.x + 5; 
       _player.y = character.y + 5; 
      } 
      else if (_player ==null && world.wall01 != null) 
      { 
      var _player:Player; 


       _player = new Player(); 

       // add to display list 
       stage.addChild(_player); 
      } 
     } 
+0

Player 생성자를 호출 할 때? 프레임 2에서 호출됩니까? 변수가 프레임 2에있는 경우 프레임 2에 Player 객체를 만들어야한다고 생각합니다 ... – tziuka

+0

네, 프레임 2에 플레이어 객체를 만듭니다. 객체를 목록에 추가하면 구문 오류가 발생합니다. 이처럼. – Trows

+0

메인 타임 라인의 frame2에'world'가 있습니까? (그리고 그것의 모든 벽은?) 아니면 프레임 1에만 존재합니까? – BadFeelingAboutThis

답변

3

첫째 : 이러한 두 줄에 구문 오류가 있습니다

_player.x = MovieClip.(root).character.x + 5; 
_player.y = MovieClip.(root).character.y + 5; 

MovieClip 후 기간이 안를, 그래서 다음과 같아야합니다

_player.x = MovieClip(root).character.x + 5; 
_player.y = MovieClip(root).character.y + 5; 

두 번째 : 항상 모든 프레임마다 새 플레이어를 만듭니다. 당신의 createPlayer 방법은 다음과 같은 조건이 있습니다

if(character != null && _player != null) //_player is not a defined in this scope, so it will either throw an error, or always return null/undefined 

당신은 그 프레임 또는 createPlayer 방법의 범위의 범위에 정의 된 _player VAR이없는, 당신은 else의 범위 내에서 그것을 정의 문 (else 문에서만 사용 가능)

var _player:Player을 다른 프레임 범위 지정 바를 사용하여 타임 라인 코드의 맨 위로 이동하십시오.

셋째

가 : 당신이 당신의 Player 생성자에서 root에 액세스하려고이 가진 문제는 생성자가 실행될 때, 당신의 Player 디스플레이 나무에 아직되지 않는 것입니다, 그래서 당신이 추가 할 때까지 루트가 null 플레이어를 무대에 올려 놓으십시오.

예 :이 액세스 root을 시도하기 전에 ADDED_TO_STAGE 인을 청취 있도록

_player = new Player(); //this will run your contructor, but root will be null 
stage.addChild(_player); //after this, your Player class will now have access to root/stage/parent object 
Player 클래스를 변경

.

public function Player() 
    { 
     this.addEventListener(Event.ADDED_TO_STAGE, init); 
     // constructor code 

    } 

    private function init(e:Event):void { 
     this.removeEventListener(Event.ADDED_TO_STAGE, init); 
     _solidObjects = [MovieClip(root).world.wall01,MovieClip(root).world.wall02,MovieClip(root).world.wall03,MovieClip(root).world.wall04]; 
     addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
     addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler); 
     addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler); 
    } 
+0

수정 된 코드는 주요 타임 라인의 레퍼런스이기 때문에 문제가되지 않습니다. 근본적으로 뿌리가 필요하다고 생각하지 않습니다. – Trows

+0

내가 무슨 말하는지 이해가 안 되니? 어떤 경우에도 문법 오류이므로 응용 프로그램이 올바르게 실행되도록 수정해야합니다 (주요 문제가 아니더라도) – BadFeelingAboutThis

+0

언제나 감사드립니다. 항상 도움이됩니다. – Trows

관련 문제