Actionscript 3 Actionscript 3:如何访问document类的属性?
当我试图从另一个类访问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;
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);