0

我是 AS3 新手,我尝试制作一个简单的 Flash 游戏。我的问题涉及访问其类之外的特定数组。我成功访问了一些变量和函数,但我非常坚持这一点。

有 3 个类:Game 是与 flash 文件相关的主要类,Level1 产生背景元素和敌人,最后是 Enemy 类。

Game 类实例化了 Level1 类,它产生了敌人(使用 Enemy 类)并将它们推送到一个数组中。当敌人被击中时,Enemy 类中的一个方法将其从显示列表中删除,然后尝试将其从位于 Level1 类中的数组中删除,但失败并抛出:

1119:通过静态类型 Class 的引用访问可能未定义的属性 level1。

另一个问题是有时子弹停在屏幕中间,我也无法找到这个错误。

无论如何,这是我的第一篇与代码相关的帖子,如果太乱了,请告诉我,我会尽量让它更具可读性。很抱歉给您带来不便,感谢您的帮助-Yaniv

 package 
{
    import flash.display.MovieClip;

    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.text.*;
    import flash.geom.Point;

    public class Game extends MovieClip
    {
        public var player:Player;
        public var level1:Level1;
        public var bullet:Bullet;
        private var bullets_arr:Array;
        var fire_on : Boolean;
        var fire_counter : int;

        public function Game()
        {
            level1=new Level1(this.stage);

            player = new Player  ;
            addChild(player);
            player.y = 600;
            bullets_arr = [];
            addEventListener(Event.ENTER_FRAME,Main);
            stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
            stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler);
        }

        function mouseDownHandler($e:MouseEvent):void
        {
            fire_on = true;
        }

        function mouseUpHandler($e:MouseEvent):void
        {
            fire_on = false;
            fire_counter = 0;
        }

        function fire():void
        {
            bullet = new Bullet  ;
            addChild(bullet);
            bullet.x = player.x;
            bullet.y = player.y - 32;
            bullets_arr.push(bullet);
        }

        public function Main(e: Event):void
        {
            player.x = mouseX;

            if (bullets_arr)
            {
                for (var m:int = 0; m < bullets_arr.length; m++)
                {
                    bullets_arr[m].y -=  20;

                    if(level1.enemies_arr)
                    {   
                        for (var n:int = 0; n < level1.enemies_arr.length; n++)
                        {
                            if (bullets_arr[m])
                            {
                                if (level1.enemies_arr[n])
                                {
                                    if (level1.enemies_arr[n].hitTestObject(bullets_arr[m]))
                                    {
                                        if(bullets_arr[m].parent)
                                        {
                                            bullets_arr[m].parent.removeChild(bullets_arr[m]);
                                            bullets_arr.splice(bullets_arr[m],1);
                                            level1.enemies_arr[n].DoDamage(10);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if(fire_on)
            {
                fire_counter++;
                if(fire_counter == 01)
                {

                    fire();
                }
                else if(fire_counter >5)
                {
                    fire_counter =0;
                }
            }
        }
    }
}




package  {

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

    public class Level1 extends MovieClip{

        var i:int;
        var j:int;
        var frame :int;
        public var enemy:Enemy;
        public var enemies_arr:Array;


        public function Level1(target:Stage) 
        {
            frame = 0;
            enemies_arr = [];

            for (var i:int = 0; i < 3; i++)
            {
                for (var j:int = 0; j < 3; j++)
                {
                    enemy = new Enemy;
                    enemy.x = j*100 + 260;
                    enemy.y = i*40 - 150;
                    target.addChild(enemy);
                    enemies_arr.push(enemy);
                }
            }
        }
    }
}



package
{
    import flash.display.MovieClip;

    public class Enemy extends MovieClip
    {

        var Health : int;
        var splash:Splash;

        function Enemy()
        {
            Health =30;
        }
        public function DoDamage(Damage:int)
        {
            Health -= Damage;
            if (Health <= 0)
            {
                Die();
            }
        }
        public function Die()
        {
            if(this.parent)
            {
                this.parent.removeChild(this);

                //HERE IS THE ERROR
                Game.level1.enemies_arr.splice(this,1);
            }
        }
    }
}
4

2 回答 2

1

您应该在 Game 实例上调用 level1。

以一种简单的方式,您可以将 Game 定义为 Singleton

public class Game extends MovieClip {

   private static var _instance:Game;

   public static function getInstance():Game {

      if (_instance == null) {

           _instance = new Game();
      }

      return _instance ;

   }
}

所以 Die 函数会是这样的

   public function Die()
    {
        if(this.parent)
        {
            this.parent.removeChild(this);

            //HERE IS THE ERROR
            Game.getInstance().level1.enemies_arr.splice(this,1);
        }
    }
于 2013-10-10T12:27:07.097 回答
1

您遇到的语法问题是您试图从 Game 类中获取 level1,而 level1 是实例变量,而不是静态变量。作为一个实例变量,level1 对于每个游戏实例来说都是一个完全不同的变量,所以如果你简单地说Game.level1,编译器会想,“哪个游戏?”

要改变这一点,您可以简单地将 level1 更改为静态变量,方法是:

public var level1:Level1;

对此:

public static var level1:Level1;

这样,变量在所有实例中都是相同的,并且在此行上访问它应该没有任何问题:

Game.level1.enemies_arr.splice(this,1);

我会说,尽管某些设计原则可能存在问题(可能是您应该使用回调或信号或其他东西来实现模块化),但快速简便的解决方法是将单词添加static到 level1 的声明中。

于 2013-10-10T12:50:20.703 回答