从类访问时间线对象,提供空对象引用?

Posted

技术标签:

【中文标题】从类访问时间线对象,提供空对象引用?【英文标题】:Accessing timeline objects from a class, giving null object reference? 【发布时间】:2015-02-22 17:23:17 【问题描述】:

所有迟到的人,这个问题仍然有效,尚未得到答案,您可能会在下面看到一个不相关的语法错误,一位好成员为我找到了

错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at Player()
    at Maintest_fla::MainTimeline/createPlayer()

当我尝试添加实例名称为 world 的对象中的实例名称 wall0x 对象时,我发现我收到了一个空对象错误。 也忽略一长串不相关的变量。

package 


    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.filters.BlurFilter;
    import flash.utils.Timer;



    public class Player extends MovieClip
    
        // player settings



        private var _rotateSpeedMax:Number = 20;
        public var _gravity:Number = .10;
        // projectile gun settings
        public var _bulletSpeed:Number = 4;
        public var _maxDistance:Number = 200;
        public var _reloadSpeed:Number = 250;//milliseconds
        public var _barrelLength:Number = 20;
        public var _bulletSpread:Number = 5;
        // gun stuff
        private var _isLoaded:Boolean = true;
        private var _isFiring:Boolean = false;
        private var _endX:Number;
        private var _endY:Number;
        private var _startX:Number;
        private var _startY:Number;
        private var _reloadTimer:Timer;
        private var _bullets:Array = [];

        // array that holds walls

        public var _solidObjects:Array = [];

        //
        private var _player:MovieClip;
        private var _dx:Number;
        private var _dy:Number;
        private var _pcos:Number;
        private var _psin:Number;
        public var _trueRotation:Number;



        public function Player()
        

            // constructor code   //Right hereVVVthe instance name is wall0x and it's in the object world on the stage.                            
                _solidObjects = [MovieClip(root).world.wall01,MovieClip(root).world.wall02,MovieClip(root).world.wall03,MovieClip(root).world.wall04];


            /*addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler);
            addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);*/
           

        

我在第 2 帧中使用的代码创建播放器,然后不断将其和弦设置为另一个对象。

stage.addEventListener(Event.ENTER_FRAME, createPlayer);
function createPlayer(e:Event):void
        


            // attach player movieclip from library

            // position player in center
            if (character!=null&&_player!=null)
            

                _player.x = character.x + 5;
                _player.y = character.y + 5;
            
            else if (_player ==null && world.wall01 != null)
            
            var _player:Player;


                _player = new Player();

                // add to display list
                stage.addChild(_player);
            
        

【问题讨论】:

何时调用 Player 构造函数?它是在第 2 帧中调用的吗?如果您的变量在第 2 帧上,那么我认为您必须在第 2 帧中创建 Player 对象... 是的,我正在第 2 帧中创建一个播放器对象。不过,当我将对象添加到这样的列表时,它给了我一个语法错误。 那么,在你的主时间线的 frame2 上,world 存在吗? (以及所有的墙壁?)还是只存在于第 1 帧? 它只存在于第 2 帧,即我在其中创建播放器的帧 即使我这样运行它也会抛出空对象引用错误else if (_player ==null && world.wall01 != null) var _player:Player; _player = new Player(); // add to display list stage.addChild(_player); 【参考方案1】:

首先:这两行有语法错误:

_player.x = MovieClip.(root).character.x + 5;
_player.y = MovieClip.(root).character.y + 5;

MovieClip 后面不应该有句号,所以应该是这样的:

_player.x = MovieClip(root).character.x + 5;
_player.y = MovieClip(root).character.y + 5;

第二:你总是在每一帧创建一个新的播放器。在您的 createPlayer 方法中,您有以下条件:

if(character != null && _player != null)  //_player is not a defined in this scope, so it will either throw an error, or always return null/undefined

您没有在该框架的范围或createPlayer 方法的范围内定义_player var,您已在else 语句的范围内定义它(这仅在else 中可用声明)

var _player:Player 与其他帧范围变量一起移动到时间线代码的顶部。

第三:您试图在Player 构造函数中访问root,问题在于,当构造函数运行时,您的Player 尚未出现在显示树上,因此在您将播放器添加到舞台之前,root 为空。

示例:

_player = new Player(); //this will run your contructor, but root will be null
stage.addChild(_player); //after this, your Player class will now have access to root/stage/parent object

更改您的Player 类,使其在尝试访问root 之前侦听ADDED_TO_STAGE

    public function Player()
    
        this.addEventListener(Event.ADDED_TO_STAGE, init);
        // constructor code

    

    private function init(e:Event):void 
        this.removeEventListener(Event.ADDED_TO_STAGE, init);
        _solidObjects = [MovieClip(root).world.wall01,MovieClip(root).world.wall02,MovieClip(root).world.wall03,MovieClip(root).world.wall04];
        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler);
        addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
    

【讨论】:

已编辑这不是一个真正的问题,因为该代码是来自主时间线的参考,我认为我什至不需要 root。 我不明白你在说什么?无论如何,这是一个语法错误,需要纠正您的应用程序才能正常运行(即使这不是您的主要问题) 哇,谢谢。这确实帮助我理解了类和对象如何与时间线交互。在实施您建议的修复后,仍然有一个 TypeError: Error #1034: Type Coercion failed: cannot convert flash.display::Stage@447ec041 to flash.display.MovieClip. at Player/init() at flash.display::DisplayObjectContainer/addChild() at flash.display::Stage/addChild() at Maintest_fla::MainTimeline/createPlayer() 不太确定这意味着什么,如果您阅读此内容,我会回复是否可以修复它并且我还没有回复,如果您可以看一下,那就太好了。 当我早些时候用你的 .fla 进行尝试时,我没有收到任何错误。不过,我现在离开工作站几天了,无法测试任何东西。看起来像是在 createPlayer 方法中的某个地方,您必须尝试将舞台转换为 MovieClip。 该死,好的,我再试一次。

以上是关于从类访问时间线对象,提供空对象引用?的主要内容,如果未能解决你的问题,请参考以下文章

SyntaxError:错误 #1009:无法访问空对象引用的属性或方法

引用还是指针?

错误 #1009:无法访问空对象引用的属性或方法。 [好郁闷]

对象和引用

如何摆脱空的 StyleProtoChain 对象引用?

错误 #1009:无法访问空对象引用 AS3 项目的属性或方法