从类访问时间线对象,提供空对象引用?
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:无法访问空对象引用的属性或方法