Actionscript 3 Actionscript 3:如何访问document类的属性?

Actionscript 3 Actionscript 3:如何访问document类的属性?,actionscript-3,Actionscript 3,当我试图从另一个类访问document类的某些私有属性时,它会输出以下错误: 1119: Access of possibly undefined property _player through a reference with static type flash.display:Stage. 以下是document类中的代码: package { import flash.display.MovieClip; import flash.events.Event;

当我试图从另一个类访问document类的某些私有属性时,它会输出以下错误:

1119: Access of possibly undefined property _player through a reference with static type flash.display:Stage.
以下是document类中的代码:

    package 
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.ui.Keyboard;
    import collision;
    import player;
    import ground;

    public class engine extends MovieClip
    {
        public var _player:player;
        private var _ground:ground;
        private var _collision:collision;
        private var _right:Boolean;
        private var _space:Boolean;
        private var _left:Boolean;
        private var _touchGround:Boolean;
        private var _jump:Boolean;
        private var _jumpVel:int;
        private var _q:int;
        private var _vx:int;
        private var _vy:int;

        public function engine()
        {
            _player = new player();
            _ground = new ground();
            _collision = new collision();
            addChild(_player);
            addChild(_ground);
            _player.x = stage.stageWidth/2 - _player.width/2;
            _player.y = stage.stageHeight/2 - _player.height/2;
            _ground.x = stage.stageWidth/2 - _ground.width/2;
            _ground.y = stage.stageHeight/2 - _ground.height/2;
            _ground.y += 150;
            _ground.x += 300;
            _q = 0;
            stage.addEventListener(Event.ENTER_FRAME, enterFrame);
            stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
            stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler);
        }
        private function enterFrame(e:Event) 
        {
            if(_right)
            {
                if(_vx > 15) 
                {
                    _vx = 15;
                }
                _vx += 2;
            }
            if(_left) 
            {
                if(_vx < -15)
                {
                    _vx = -15;
                }
                _vx -= 2;
            }
            if(_space && _touchGround)
            {
                _jump = true;
            }
            if(_jump)
            {
                _jumpVel = 20 - _q;
                if(_q == 20)
                {
                    _q = 0;
                    _jumpVel = 0;
                    _jump = false;
                }
                else
                {
                    _ground.y += _jumpVel;
                    _q ++;
                }
            }
            _collision.detectCollisions();
            _ground.x -= _vx;
            _ground.y += _vy;
            if(_vx > 0)
            {
                _vx--;
                if(_vx < 0)
                {
                    _vx = 0;
                }
            }
            else if(_vx < 0)
            {
                _vx++;
                if(_vx > 0)
                {
                    _vx = 0;
                }
            }
            if(_vy > 0) 
                {
                    _vy = 0;
                }
            else if(_vy < -10) 
                {
                    _vy = -10;
                }
                trace(_vy);
        }

        private function keyDownHandler(e:KeyboardEvent)
        {
            if(e.keyCode == Keyboard.RIGHT)
            {
                _right = true;
            }
            if(e.keyCode == Keyboard.LEFT) 
            {
                _left = true;
            }
            if(e.keyCode == Keyboard.SPACE)
            {
                _space = true;
            }
        }
        private function keyUpHandler(e:KeyboardEvent)
        {
            if(e.keyCode == Keyboard.RIGHT)
            {
                _right = false;
            }
            if(e.keyCode == Keyboard.LEFT) 
            {
                _left = false;
            }
            if(e.keyCode == Keyboard.SPACE)
            {
                _space = false;
            }

        }
    }
}

我正试图从碰撞类访问属性“\u player”,但出现错误。

Root.\u player不存在。尝试通过engine类访问它

因此,如果根目录中存在一个引擎对象,称为_engine,您可以访问_player,如下所示:

var plyr:player = _engine._player;
编辑:碰撞类不“知道”引擎类;它们都是分开存在的,所以如果不做一些不同的事情,就无法让它们彼此交流。注释中提到的一种方法是在引擎中使_player属性保持静态。所以

public static var _player:player;
另一种方法是将引擎类设为单例(如另一个答案中所述)

另一种方法是将引擎类的实例传递给碰撞类;这样,碰撞类就能够“查看”引擎中可用的实例变量(属性)。为此,您可以执行以下操作:

// do this inside the engine constructor
_collision = new collision();
_collision._engine = this;
(当然,要做到这一点,碰撞应该有一个名为_engine:engine的var。)


您可能希望从设计中退一步,思考每个部分应该如何相互作用。可能有一种不同的方法可以使每个对象更好地相互通信(或者,通过分离关注点,在不直接与其他类交互的情况下负责每个类应该做的事情)。

如果您想进一步使用更高级的方法,您还可以将Engine类实现为(有一个很好的flash示例)

使引擎类成为单实例意味着您要确保内存中只有一个引擎类实例,并且只有一个实例,直到应用程序的一部分需要它为止。您可以访问静态庄园中单个个体的所有属性

访问播放器属性将归结为:

private var _playerCol:player = Engine.instance._player;
优点是现在可以轻松访问引擎类的所有公共函数和变量


singleton模式用于分配Flash库和应用程序,因此值得花时间对其进行一点探索。

此时,您正试图访问player,就好像它是Engine类的静态成员一样。您可以使_播放器静止,但这会导致代码气味。安全的方法是将引用传递给构造函数:

private var _engine:Engine
private var _playerCol:player;
public function collision(engine:Engine){        

   _engine = engine;
   _playerCol = _engine._player
}        
所以在你的Doc类中,你会有这一行

_collision = new collision(this);

作为提示,类在一开始就应该有一个大写字母,如果一个变量是公共的,请删除下划线,否则将该变量保留为私有的,并为其创建公共属性。此外,你可能想改变你的结构,因为它有点笨拙。我建议查看组件实体系统。

uhh。。。“私人”这个词由此而来?是的。也许我说得不够好。所以我试图从另一个类访问document类的这个特定属性。当我尝试使用“root.property”访问它时,我得到一个错误。即使我将属性更改为public,也会发生这种情况。您能再添加一点代码吗?主要是你试图读取的变量的定义和对该变量的调用。好的,只是添加了两个类。如果您想知道我到底在做什么,我将让碰撞类来处理碰撞。Atm,引擎(文档)类正在执行此操作。我对as3还比较陌生,所以我只是想看看是否可以先访问该房产。谢谢你的回答。实际上,engine是document类的名称,我应该澄清一下。我正在尝试从“碰撞”访问引擎中的_player属性。无论哪种方式,我都尝试了您所说的方法,在碰撞类中创建了一个属性,该属性引用引擎中的_player属性,但我仍然得到了错误。我会更新问题中的代码,这样你就可以看到我做了什么。再次感谢你的回答。让玩家保持静止。公共静态变量播放器:播放器;然后你就可以使用它了。@AdityaGameProgrammer不用担心:)编辑了一点
_collision = new collision(this);