ActionScript 3 - 错误 #1010:术语未定义且没有属性

ActionScript 3 - Error #1010: A term is undefined and has no properties

在测试我的项目时,我遇到了这个错误:

TypeError: Error #1010: A term is undefined and has no properties. firegame.as:115]
at firegame/checkhitammo()[..\Desktop\Flash\firegame.as:115
at firegame/mainloop()[..Desktop\Flash\firegame.as:77

我不明白为什么,如果我将 if 语句更改为简单的语句,一切正常。

这是我的代码:

package {

    import flash.display.*;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.Event;

    public class firegame extends MovieClip {

        var tiger:Tiger = new Tiger();
        var enemys:Array = new Array();
        var scorea:Number = 0;
        var ammoleft:Number = 0;
        var ammo:Array = new Array();
        var setint:Timer = new Timer(110);
        var setenemy:Timer = new Timer(980);
        var newenemy:Number;
        var hitcheck:Array = new Array();
        var totallength:Number;

        public function firegame() {
            startgame();
        }

        public function startgame() {
            addplayer();
            stage.addEventListener(MouseEvent.MOUSE_MOVE, moveplayer);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, shotfire);
            stage.addEventListener(MouseEvent.MOUSE_UP, shotfirestop);
            setint.addEventListener(TimerEvent.TIMER, shotfirestart);
            setenemy.addEventListener(TimerEvent.TIMER, addenemy);
            stage.addEventListener(Event.ENTER_FRAME, mainloop);
            setenemy.start();

        }
        public function addplayer():void {
            tiger.y = 200;
            tiger.x = 507;
            addChild(tiger);
        }

        public function moveplayer(e:MouseEvent):void {
            tiger.y = mouseY;
            tiger.x = 507;
        }

        public function shotfire(e:MouseEvent):void {
            setint.start();
        }

        public function shotfirestop(e:MouseEvent):void {
            setint.stop();
        }

        public function shotfirestart(e:TimerEvent):void {
            var fire:Fire = new Fire();
            fire.x = 460;
            fire.y = mouseY;
            addChild(fire);
            ammoleft -=  1;
            ammo.push(fire);
        }

        public function addenemy(e:TimerEvent):void {
            var enemy:Enemy = new Enemy();
            enemy.x = 0;
            enemy.y = Math.floor(Math.random() * (370 - 30) + 30);
            addChild(enemy);
            enemys.push(enemy);
        }

        public function mainloop(e:Event):void {

            setscoreandammo();
            moveammo();
            moveenemy();
            checkhitammo();

        }

        public function moveammo():void {
            for (var i:int = 0; i < ammo.length; i++) {
                ammo[i].x -=  15;
                if (ammo[i].x < -30) {
                    removeChild(ammo[i]);
                    ammo[i] = null;
                    ammo.splice(i, 1);
                }
            }
        }

        public function moveenemy():void {
            for (var b:int = 0; b < enemys.length; b++) {
                enemys[b].x +=  5;
                if (enemys[b].x > 590) {
                    removeChild(enemys[b]);
                    enemys[b] = null;
                    enemys.splice(b, 1);
                }

            }
        }

        public function setscoreandammo():void {
            score.text = String(scorea);
            leftammo.text = String(ammoleft);
        }

        public function checkhitammo():void {
            for (var i:int = ammo.length; i >= 0; i--) {
                for (var b:int = enemys.length; b >= 0; b--) {

                    if (ammo[i].hitTestObject(enemys[b])) {    // <--- this is the line where the error is fired

                        removeChild(ammo[i]);
                        ammo[i] = null;
                        ammo.splice(i, 1);
                        removeChild(enemys[b]);
                        enemys[b] = null;
                        enemys.splice(b, 1);
                        scorea +=  50;
                        break;

                    }
                }
            }
        }

    }
}

首先,你所有的 for 循环只有递增 1 你可能想像这样使用

for (var i in ammo) {
    for (var b in enemys) {

你只需要遍历数组直到发生某些事情并跳出循环以确保它不会检查两次。

在这一行

if (ammo[i].hitTestObject(enemys[b])) {

错误说程序在数组列表中找不到对象,因为它只是数组所以不会抛出空指针异常之类的错误

如果你与敌人交换弹药,你会看到 hitTestObject 正在尝试访问空对象

你真的不需要调用这个

ammo[i] = null;

因为它已经被删除了

您的具体问题就在这里...

   public function checkhitammo():void {
        for (var i:int = ammo.length; i >= 0; i--) {
            for (var b:int = enemys.length; b >= 0; b--) {

...您正在使用数组的 length 开始计数器 i 和 b,而不是最后一个索引的位置。它应该读作...

   public function checkhitammo():void {
        for (var i:int = ammo.length - 1; i >= 0; i--) {
            for (var b:int = enemys.length - 1; b >= 0; b--) {

即长度从1开始,位置从0开始