教我通过课堂获取变量

时间:2018-10-12 13:17:40

标签: actionscript-3

感谢您看到我的帖子。我在做游戏。我在敌人的班上工作。如果距离足够近,我希望敌人跟随玩家。我在这里有一个问题。我无法获得播放器和播放器。这是我的课: Main.as

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

    public class Main extends MovieClip
    {
        public var player:Player;


        public function Main():void
        {
            player = new Player
            player.x=400;
            player.y=300;
            stage.addChild(player);
        }
    }
}

enemy.as

package  {

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


    public class enemy extends MovieClip {

        public var enemyhp:Number=100;

        public function enemy() {
            // constructor code
            addEventListener(Event.ENTER_FRAME, enemyLoop);
        }
        function enemyLoop(e:Event):void
        {
            trace(Player.playerx);
            trace(Player.playery);
        }
    }

}

Player.as

package  {

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

    public class Player extends MovieClip {

        public var playerx:Number;
        public var playery:Number;

        public function Player() {
            // constructor code
            addEventListener(Event.ENTER_FRAME, returnxy);
        }
        function returnxy(e:Event):void
        {
            playerx=x;
            playery=y;
        }
    }

}

这是我的错误: D:\ Testtestest \ enemy.as,第18行1119:通过静态类型为Class的引用访问可能未定义的属性playerx。 D:\ Testtestest \ enemy.as,第19行1119:通过静态类型为Class的引用访问可能未定义的属性播放器。

对不起,因为我的英语不好。我是越南人,并且是编码方面的新手。我想像专业人士一样使用Class进行编码。非常感谢你。 <3

1 个答案:

答案 0 :(得分:2)

您正在尝试使用播放器的playerxplayery属性,就像它们是静态属性一样(也就是说,属于该类,而不是实例)。您需要获得对播放器实例的引用,或将属性设为静态。
有几种方法可以做到这一点,这是一种快速的方法,尽管不一定最干净:

在Player类中,创建一个静态变量来存储播放器的单例实例:

public static var me:Player;

然后在播放器类的构造函数(即名为Player的方法)中,将this分配给me var:

me = this;

现在您已经静态引用了播放器实例,并且可以通过执行Player.me(例如,Player.me.x

)在应用程序中的任何位置访问它的公共属性和方法。

它的作用是,无论何时创建新的Player实例,它都会将该实例分配给Player类的me var。大概在任何给定时间只有一个Player实例。

现在,应谨慎使用静态方法和var,因为它们在应用程序的整个生命周期中都存在。一些开发人员努力使用尽可能少的静态变量(或仅用于常量和设置),我通常会同意它们,也就是说,只要您自己清理一下,就可以在显示对象上放置一些静态属性并不坏。正确地。 (例如,null me参考,如果您不再需要播放器在内存中)

当然,还有很多其他方法可以获取您的Player实例,例如执行MovieClip(root).player(不是该语法的狂热者,但可以工作)或使用({{ 1}}),或者拥有一门可以同时管理所有敌人和玩家的职业。如果有时间,我会搜索一些游戏编程模式的最佳实践。