2014-11-30 3 views
0

Я проделал работу с ногами и проследил проблему. Когда я звонюas3 - Ошибка # 2007: параметр hitTestObject должен быть не нулевым - найдена ошибка, требуется решение

if (enemy.hitTestObject(bullet)){ 

пуля есть null.

Я считаю, что проблема вызвана тем, что

var bullet:Bullet = new Bullet(stage, player.x, player.y, player.rotation); 

создается внутри функции, вместо того, чтобы быть создан как общественный вар в классе. Однако, когда я перемещаю эту строку кода вместе с другими публичными варами (и меняю их на публичные), он прерывает стрельбу пулями.

Итак, вопрос в том, как я могу сделать пулю не нулевой?

Main.as:

package 
{ 

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


public class zombiestandoffMain extends MovieClip 
{ 
    public var army:Array; 
    public var enemy:Enemy; 
    public var player:Player; 
    public var bullet:Bullet; 
    public var gameTimer:Timer; 
    public var crosshair:Crosshair; 
    public var bulletList:Array = []; //new array for the bullets 



    public function zombiestandoffMain() 
    { 
     army = new Array(); 
     var newEnemy = new Enemy(100, -15); 
     army.push(newEnemy); 
     addChild(newEnemy); 

     player = new Player(stage, 400, 500); 
     stage.addChild(player); 


     crosshair = new Crosshair(); 
     addChild(crosshair); 
     crosshair.x = mouseX; 
     crosshair.y = mouseY; 

     gameTimer = new Timer(25); 
     gameTimer.addEventListener(TimerEvent.TIMER, onTick); 
     gameTimer.start(); 

     stage.addEventListener(MouseEvent.CLICK, shootBullet, false, 0, true); 
     stage.addEventListener(Event.ENTER_FRAME, loop, false, 0, true); //add an EventListener for the loop 
     function loop(e:Event):void //create the loop function 
     { 
      if(bulletList.length > 0) //if there are any bullets in the bullet list 
      { 
       for(var i:int = bulletList.length-1; i >= 0; i--) //for each one 
       { 
        bulletList[i].loop(); //call its loop() function 
       } 
      } 
     } 
     function shootBullet(e:MouseEvent):void 
     { 
      var bullet:Bullet = new Bullet(stage, player.x, player.y, player.rotation); 
      bullet.addEventListener(Event.REMOVED_FROM_STAGE, bulletRemoved, false, 0, true); //triggers the "bulletRemoved()" function whenever this bullet is removed from the stage 
      bulletList.push(bullet); //add this bullet to the bulletList array 
      stage.addChild(bullet); 
     } 

     function bulletRemoved(e:Event):void 
     { 
      e.currentTarget.removeEventListener(Event.REMOVED_FROM_STAGE, bulletRemoved); //remove the event listener so we don't get any errors 
      bulletList.splice(bulletList.indexOf(e.currentTarget),1); //remove this bullet from the bulletList array 
     } 








    } 

    public function onTick(timerEvent:TimerEvent):void 
    { 
     if (Math.random() < 0.1) 
     { 
      var randomX:Number = Math.random() * 400; 
      var newEnemy:Enemy = new Enemy(randomX, -15); 
      army.push(newEnemy); 
      addChild(newEnemy); 
     } 
     crosshair.x = mouseX; 
     crosshair.y = mouseY; 

     for each (var enemy:Enemy in army) 
     { 
      enemy.moveDownABit(); 
      trace(enemy); 
      trace(bullet); 
      if (enemy.hitTestObject(bullet)){ 
        trace("hit!"); 
       } 



     } 
    } 
} 
} 

Bullet.as

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

public class Bullet extends MovieClip 
{ 
    private var stageRef:Stage; 
    private var speed:Number = 10; 
    private var xVel:Number = 0; 
    private var yVel:Number = 0; 
    private var rotationInRadians = 0; 

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

     this.rotation = rotationInDegrees; 
     this.rotationInRadians = rotationInDegrees * Math.PI/180; 
    } 

    public function loop():void 
    { 
     xVel = Math.cos(rotationInRadians) * speed; 
     yVel = Math.sin(rotationInRadians) * speed; 

     x += xVel; 
     y += yVel; 

     if(x > stageRef.stageWidth || x < 0 || y > stageRef.stageHeight || y < 0) 
     { 
      this.parent.removeChild(this); 
     } 
    } 
} 
} 

Спасибо за любую помощь!

+0

Как это сломать стрельбы пулей? Разрывает ли это творение, движение, удар противника или что-то еще? – puggsoy

+0

На самом деле это перерывает всю игру сейчас, когда я перепроверяю. Когда я перехожу к публичному var, я получаю сообщение об ошибке «Ошибка № 1009: не удается получить доступ к свойству или методу ссылки на нулевой объект». ссылается на эту строку кода. – jdfinch3

ответ

2

Проблема в том, что в onTick() вы пытаетесь использовать переменную класса bullet. Это никогда не определяется, так как в shootBullet() вы определяете новую переменную с помощью var ключевого слова и определения его типа:

var bullet:Bullet = new Bullet(stage, player.x, player.y, player.rotation); 

Вы должны вместо этого:

bullet = new Bullet(stage, player.x, player.y, player.rotation); 

var ключевое слово создает новая локальная переменная, независимо от того, содержит ли класс уже свойство с этим именем, и функция будет с этой точки использовать эту переменную.

Однако почему вы только тестируете с созданной последней пулей? Я бы предположил, что вы хотите проверить, если любого пули любой врага, так как:

for each (var enemy:Enemy in army) 
{ 
    enemy.moveDownABit(); 
    for each (var bllt:Bullet in bulletList) 
    { 
     if (enemy.hitTestObject(bllt)){ 
      trace("hit!"); 
     } 
    } 
} 

В этом случае можно удалить переменный класс шириной bullet в целом.

+1

Спасибо! Такое простое решение. Также благодарим вас за добавленный отзыв о проверке всех пуль. :) – jdfinch3

0

Что вы делаете, это определение переменной два раза. Сначала в корне класса;

public var bullet:Bullet; 

Затем второй в стрелковой функции.

function shootBullet(e:MouseEvent):void 
{ 
    var bullet:Bullet = new Bullet(stage, player.x, player.y, player.rotation); 
} 

Таким образом, у вас есть две переменные: одна в корне, другая в разделе функций. Если вы вызовете свою переменную в функции, она вернет ее в функциональном секторе. Если вы звоните в другое место, у вас будет классный. Попробуйте написать

bullet = new Bullet(....) 

вместо

var bullet:Bullet = new Bullet(....) 
Смежные вопросы