Ошибка № 1009, ActionScript 3, Bullet is null - PullRequest
0 голосов
/ 08 марта 2012

TypeError: Ошибка # 1009: Не удается получить доступ к свойству или методу пустой ссылки на объект. в Main_fla :: MainTimeline / BulletFire () [Main_fla.MainTimeline :: frame32: 68]. Происходит, и я понятия не имею, почему ... ПОЖАЛУЙСТА, ПОМОГИТЕ, это были дни, когда я решал эту проблему, и я полностью потерян. Спасибо, также, по какой-то причине, когда я стреляю из пули, она идет только при 45 и 225 градусах ... Спасибо, ребята

    //Create an array to hold multiple sprites
var mySpriteHolder:Array = [];
//Create a counter to keep track of the number of sprites
var lbCounter:int = 0;
//Maximum number of sprites on the canvas
var maxLB:int = 1;
//Keypress Code
stage.addEventListener(MouseEvent.CLICK, dropBullet);
//Function for the mouse event to fire bullet
function dropBullet(evt:MouseEvent):void{

     var bcos:Number = Math.cos((Turret.rotation) * Math.PI / 180);
     var bsin:Number = Math.sin((Turret.rotation) * Math.PI / 180);

     //starting x and y
     var startx:Number = Turret.x + (15 * bcos);
     var starty:Number = Turret.y + (15 * bsin);

    //calculates where the bullet needs to go by aiming in front of the gun
    var endx:Number = Turret.x + (50 * bcos);
    var endy:Number = Turret.y + (50 * bsin);

    var Bullet:MovieClip = new bullet();

    Bullet.x = startx;
    Bullet.y = starty;

    Bullet.xspeed = (endx - startx)/5;
    Bullet.yspeed =  (endx - startx)/5;

    mySpriteHolder.push(Bullet);
    stage.addChild(Bullet);

    //this calls the move down function
    stage.addEventListener(Event.ENTER_FRAME,BulletFire);
}
//Function to shoot bullet
function BulletFire(evt:Event):void{
    var Bullet:MovieClip;
    //Use a for loop to move the Bullets
    for(var i:int=0; i<=mySpriteHolder.length; i++){
        Bullet = mySpriteHolder[i];
    //Bounds Collision
    if(Bullet.hitTestObject(Up)){
        Bullet.yspeed*=-1;
    }
    if(Bullet.hitTestObject(Lower)){
        Bullet.yspeed*=-1;
    }
    if(Bullet.hitTestObject(Left)){
        Bullet.xspeed*=-1;
    }
    if(Bullet.hitTestObject(Right)){
        Bullet.xspeed*=-1;
    }
    //Blockade Collision
    for(var t in myBlockadeHolder){
            if(Bullet.hitTestObject(myBlockadeHolder[t])){
                trace("test");
            }
        }
    //Target Collision
        for(var c in mytargetHolder){
            if(Bullet.hitTestObject(mytargetHolder[c])){
            stage.removeChild(Bullet);
            mySpriteHolder.splice(i,1);
            lbCounter --;
            mytargetHolder[c].y = Math.random()*390 + 10;
            mytargetHolder[c].x = Math.random()*390 + 10;
                while(mytargetHolder[c].hitTestObject(Turret)){
                    mytargetHolder[c].y = Math.random()*390 + 10;
                    mytargetHolder[c].x = Math.random()*390 + 10;
                }
            }
            for(var a in mytargetHolder){
                for(var s in mytargetHolder){
                    while(mytargetHolder[a].hitTestObject(mytargetHolder[s])&& a!=s){
                        mytargetHolder[a].y = Math.random()*390 + 10;
                        mytargetHolder[a].x = Math.random()*390 + 10;
                    }
                }
                for(var g in myBlockadeHolder){
                    while(mytargetHolder[a].hitTestObject(myBlockadeHolder[g])&& a!=g){
                        mytargetHolder[a].y = Math.random()*390 + 10;
                        mytargetHolder[a].x = Math.random()*390 + 10;
                    }
                }
            }
        }
        Bullet.y += Bullet.yspeed;
        Bullet.x += Bullet.xspeed;
    }
}

Ответы [ 2 ]

1 голос
/ 08 марта 2012
mySpriteHolder.splice(i,1);

Эта строка, вероятно, вызывает некоторые неожиданные результаты (и, возможно, вашу ошибку), когда вы склеиваете объекты из массива, из которого работает цикл. Важно понимать, что когда вы соединяете объект в AS3, вы эффективно удаляете этот элемент, и все последующие индексы уменьшаются на величину сращивания. Вместо этого попробуйте поработать в обратном направлении:

 for(var i:int=mySpriteHolder.length-1; i>=0; i--){

Кроме того, эта строка должна быть удалена из вашего события MouseClick, поскольку вы добавляете несколько событий ENTER_FRAME при каждом размещении маркера. Как и сейчас, каждый раз при щелчке мыши будет выполняться дополнительный проход bulletFire ():

stage.addEventListener(Event.ENTER_FRAME,BulletFire);
1 голос
/ 08 марта 2012

Для начала:

for (var i:int = 0; i < mySpriteHolder.length; i++) {
...

т.е. изменить <= на <.Если i становится mySpriteHolder.length, то вы получите исключение за пределами.

Далее:

stage.removeChild(Bullet);
mySpriteHolder.splice(i--, 1);

, т.е. когда вы удаляете текущий элемент из массива, вытакже уменьшить индекс i.Он будет снова увеличен в следующей итерации, поэтому вы будете с тем же индексом.Например, если вы удалите 5-й элемент, вы захотите взглянуть на новый 5-й элемент (ранее 6-й) в следующей итерации, в отличие от нового 6-го элемента (ранее 7-го).В вашем текущем коде вы непреднамеренно пропускаете один - не говоря уже о том, что он сам может дать вам исключение за пределами границ.

Под словом "вне границ" я имею в виду Bullet, являющийся undefined.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...