2013-09-19 3 views
0

ТипError: Ошибка # 2007: Параметр hitTestObject должен быть не нулевым.AS3 TypeError: Ошибка # 2007: параметр hitTestObject должен быть не нулевым

Я работаю на игру прямо сейчас, и пытается получить его, так что игрок столкнется с землей (он уже сталкивается со столом)

Он говорит, что проблема происходит в playerOneCollisions

стол и земля просто классы с базовым кодом класса, связанным с мувиклипами, они вытянуты MovieClips (если это имеет значение), и они импортировали сцену и мувиклип (опять же, если это имеет значение)

(части, я думаю, важно)

Player.as

public var main:Main; 
public var table:Table; 
public var player:Player; 
public var ground:Ground; 

     public function playerOneCollisions(table, ground) 
     { 
      if(this.hitTestObject(table)) 
      { 
       trace("tabled"); 
       animation = "kong"; 
      } 
      if(this.hitTestObject(ground)) 
      { 
       trace("grounded"); 
       animation = "idle"; 
      } 
     } 

функция playerOneCollisions называется в Main.as

public function GameClock(timerEvent:TimerEvent):void 
     { 
      player.playerOnePress(); 
      player.playerOneKeyResults(); 
      player.playerOneCollisions(table, ground); 
      player.playerAnimaitons(); 
     } 

Остальная часть кода упаковывают я был неправ о важных частей

Player.as

package 
{ 
    import flash.display.Stage; 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import KeyObject; 
    import Table; 

    public class Player extends MovieClip 
    { 
     public var stageRef:Stage; 
     public var key:KeyObject; 
     public var main:Main; 
     public var table:Table; 
     public var player:Player; 
     public var ground:Ground;  

     public var leftPressed:Boolean = false; 
     public var rightPressed:Boolean = false; 
     public var upPressed:Boolean = false; 
     public var downPressed:Boolean = false; 

     public var grounded:Boolean = false; 

     public var animation:String = "idle"; 

     public var runSpeed:Number = 5; 

     public var animationState:String = "idle"; 

     public function Player (stageRef:Stage, X:int, Y:int):void 
     { 
      this.stageRef = stageRef; 
      this.x = X; 
      this.y = Y; 

      key = new KeyObject(stageRef); 
     } 
     public function playerOnePress() 
     { 
      if(key.isDown(37) || key.isDown(65)){ // if left arrow or A is pressed 
       leftPressed = true; 
       //trace("left pressed"); 
      } else { 
       leftPressed = false; 
      } 

      if(key.isDown(38) || key.isDown(87)){ // if up arrow or W is pressed 
       upPressed = true; 
       //trace("up pressed"); 
      } else { 
       upPressed = false; 
      } 

      if(key.isDown(39) || key.isDown(68)){ //if right arrow or D is pressed 
       rightPressed = true; 
       //trace("right pressed"); 
      } else { 
       rightPressed = false; 
      } 

      if(key.isDown(40) || key.isDown(83)){ //if down arrow or S is pressed 
       downPressed = true; 
       //trace("down pressed"); 
      } else { 
       downPressed = false; 
      } 
     } 
     public function playerOneKeyResults() 
     { 
      if(leftPressed) 
      { 
//    trace("left"); 
       this.x -= runSpeed; 
      }else if(rightPressed) 
      { 
//    trace("right"); 
       this.x += runSpeed; 
      } 
     } 
     public function playerOneCollisions(table, ground) 
     { 
      if(this.hitTestObject(table)) 
      { 
       trace("tabled"); 
       animation = "kong"; 
      } 
      if(this.hitTestObject(ground)) 
      { 
       trace("grounded"); 
       animation = "idle"; 
      } 
     } 
     public function playerAnimaitons() 
     { 
      if(animation == "kong") 
      { 
       this.gotoAndStop(2); 
      } 
      if(animation == "idle") 
      { 
       this.gotoAndStop(1); 
      } 
     } 
    } 
} 

Main.as

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

    public class Main extends MovieClip 
    { 
     public var gameTimer:Timer; 
     public var player:Player; 
     public var table:Table; 
     public var ground:Ground; 

     public function Main():void 
     { 
      gameTimer = new Timer (30); 
      gameTimer.addEventListener(TimerEvent.TIMER, GameClock); 
      gameTimer.start(); 

      player = new Player(stage, 80, 420); 
      stage.addChild(player); 
     } 
     public function GameClock(timerEvent:TimerEvent):void 
     { 
      player.playerOnePress(); 
      player.playerOneKeyResults(); 
      player.playerOneCollisions(table, ground); 
      player.playerAnimaitons(); 
     } 
    } 
} 

ответ

0

Одна вещь, которую я замечаю, что у вас есть table и ground в качестве класса свойств Player, и они также являются параметрами для выбранного метода возникают проблемы.

Свойства вашего класса Player table и/или ground, вероятно, равны нулю, поскольку я не вижу код, который их устанавливает.

Неправильная практика иметь параметры метода, указанные так же, как и свойства вашего класса.

Попробуйте удалить свойства в вашем классе Player. (Я не вижу, чтобы они были установлены или использовались)

Если вы все еще получаете ошибку, проследите их значения в начале метода playerOneCollisions и убедитесь, что они не равны нулю.

Если они равны нулю, проблема существует вне этого класса, и вы передаете нулевое значение.

Следует также отметить, что я не вижу нигде в главном классе, где вы задаете свойства table или ground, поэтому они являются нулевыми, если вы не показали нам весь код. Если они равны нулю, это обязательно вызовет проблему, с которой вы столкнулись.

+0

Когда я трассирую таблицу и землю, она говорит [Таблица объектов] и null для земли, поэтому таблица прекрасна, но земля не является. Я уверен, что я сделал то же самое – user2796950

+0

Правильно, поэтому проблема в том, что вы передаете нулевое значение в эту функцию.Вы не показываете нам код, в котором вы назначаете значение земли. То, где вы должны выглядеть, как мой ответ отметил внизу. – prototypical

+0

Наверное, я действительно не понимаю, я думал, что это то, что я сделал около верхней части main.as, с общественным варном: Ground; по крайней мере, он работал на столе, и я действительно не думаю, что я сделал что-то по-другому, по крайней мере, что я заметил – user2796950

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