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

时间:2015-09-08 15:27:07

标签: actionscript-3 flash

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

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;

                    }
                }
            }
        }

    }
}

2 个答案:

答案 0 :(得分:1)

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

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

...您正在使用数组的长度启动计数器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

答案 1 :(得分:0)

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

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

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

在这一行

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

错误说程序无法在数组列表中找到对象,因为它只是数组,它不会像空指针异常那样抛出错误

如果你用enemys交换弹药,你会看到hitTestObject试图访问一个空对象

你真的不需要打电话给这个

ammo[i] = null;

因为它已被删除