感谢stackoverflow社区,我昨天可以解决我的flash项目中的一些问题。我仍然收到错误消息,但它来自网站中的不同行为。这是我收到的错误消息:
TypeError:错误#1009:无法访问空对象引用的属性或方法。 在MethodInfo-6()
当我离开雪花(颗粒)落下的页面时,此消息会一次又一次出现。当我返回此页面时,错误消息停止。我的猜测是,当我试图将孩子从父母那里移走时,这与雪花有关。
我也将此错误代码与另一个错误代码混合在一起,但这个代码并不经常出现:
TypeError: Error #1009: Cannot access a property or method of a null object
reference.at Snowflake/update()[C:\Users\JPL\Documents\ranchleblanc\New Ranch
Leblanc\website 2012\Snowflake.as:27]
第27行是以下代码中的第一行:“parent.removeChild(this);”
我一直在互联网上搜索解决这个问题的方法,我被困住了。这是雪花的代码。此影片剪辑正在另一个影片剪辑中播放。
package
{
import flash.display.MovieClip;
import flash.events.Event;
public class Snowflake extends MovieClip
{
var yVel:Number;
var xVel:Number;
var stageheight:Number = 405;
function Snowflake(xvel:Number, yvel:Number)
{
yVel = yvel;
xVel = xvel;
this.addEventListener(Event.ENTER_FRAME, update);
}
function update(e:Event):void
{
this.x += xVel;
this.y += yVel;
if (this.y > stageheight)
{
this.removeEventListener(Event.ENTER_FRAME, update);
parent.removeChild(this);
}
}
}
}
任何人都可以指出我正确的方向吗?
答案 0 :(得分:2)
用
替换违规行(27)if(parent){
parent.removeChild(this);
this.removeEventListener(Event.ENTER_FRAME, update);
}
确保父亲实际存在。
你也想删除事件监听器,以防止可怕的内存泄漏。
在MethodInfo-6()
中所以,我之前看过那种消息,但已经很久了。 MethodInfo-函数实际上是Flash Player中的内部函数,不应该误解你的错误...如果我的记忆正确地为我服务,我在其他人写的代码中遇到了这个,他们试图用swf执行一个动作还没有加载...或者可能从加载的swf内部执行一个动作,它在调用代码时实际上还没能执行。
所以在这里,让我们看看我们是否可以稍微解决你的问题。
在您的acuiel_fla文件中,您在第1帧上做了很多事情,假设acuiel_fla 是主时间轴,它不会是!尝试这样的事情......
// on frame 1...
// first, check if you even have a stage. If not, wait to be added!
if(stage){
init();
}else{
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
// MOVE THE addEventListener call for ENTER_FRAME here!
function init(e:Event = null):void{
this.addEventListener(Event.ENTER_FRAME, newFlake);
this.addEventListener(Event.REMOVED_FROM_STAGE, removedFromStage);
}
// AND REMOVE the ENTER_FRAME listener if you are ever removed
// from the stage.
function removedFromStage(e:Event):void{
this.removeEventListener(Event.ENTER_FRAME, newFlake);
}
function randRange(low:Number, high:Number):Number
{
var randNum:Number = Math.random() * (high - low) + low;
return randNum;
}
// DO NOT CALL IT HERE.
//this.addEventListener(Event.ENTER_FRAME, newFlake);
function newFlake(e:Event):void
{
if(!stage) return; // we are not on stage so we can't
// do anything here!
var flake:Snowflake = new Snowflake(randRange(-1,1), randRange(2,5));
flake.x = Math.random() * stage.stageWidth;
flake.y = -5;
flake.alpha = randRange(.3,1);
flake.scaleX = flake.scaleY = randRange(.3,1);
addChild(flake);
}
// do not instantiate your new flake here... just leave it for the enterframe.
答案 1 :(得分:1)
尝试:
if(parent)
parent.removeChild(this);