在此代码中可以:
package GameFiles.SourceCode.Classes
{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;
public class User extends MovieClip
{
private var numStars:int = 65;
public static var enemyList:Array = new Array();
private var ourShip:Ship;
private var scoreHUD:ScoreHUD;
public function User() : void
{
var ourShip:Ship = new Ship(stage);
stage.addChild(ourShip);
ourShip.x = stage.stageWidth / 2;
ourShip.y = stage.stageHeight / 2;
ourShip.addEventListener("hit", shipHit, false, 0, true);
scoreHUD = new ScoreHUD(stage);
stage.addChild(scoreHUD);
for (var i:int = 0; i < numStars; i++)
{
stage.addChildAt(new Star(stage), stage.getChildIndex(ourShip));
}
addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
}
private function loop(e:Event) : void
{
if (Math.floor(Math.random() * 90) <= scoreHUD.s_score / 100)
{
var enemy:Astroid = new Astroid(stage, ourShip);
enemy.addEventListener(Event.REMOVED_FROM_STAGE, removeEnemy, false, 0, true);
enemyList.push(enemy);
enemy.addEventListener("Passed", enemyPassed, false, 0, true);
stage.addChild(enemy);
}
}
public function shipHit(e:Event) : void
{
scoreHUD.updateHits(e.currentTarget.points);
ourShip.updateHitCount(1);
}
public function enemyPassed(e:Event) : void
{
scoreHUD.updateScore(10);
}
private function removeEnemy(e:Event)
{
enemyList.splice(enemyList.indexOf(e.currentTarget), 1);
}
}
}
变量ourShip
被定义为对象发货(我可以为大部分代码追踪这个)但是当我到达shipHit
函数并尝试引用ourShip
进行调整时我的船类中的一个变量,它表示它为空,我得到一个错误。我不明白为什么它变成了null,我认为代码的特定部分是更新变量的最佳位置。我已经在scoreHUD
内更新了一个类似的变量。
答案 0 :(得分:0)
几点提示:
变化
public static var enemyList:Array = new Array();
到
public static var enemyList:Array = [];
效果相同,但速度更快。
其次,我认为你没有理由在你的听众中使用弱引用:
ourShip.addEventListener("hit", shipHit, false, 0, true);
改为:
ourShip.addEventListener("hit", shipHit);
与您添加的其他侦听器(FRAME_ENTER)相同。 侦听器中的弱引用只是意味着当垃圾收集器运行时将删除侦听器,因此您没有未使用的对象占用的任何内存。此外,如果对象至少有一个活动侦听器,则无法将其删除。
所以你创建了大量的星星,内存被占用,你的app运行几个周期,Flash Player决定进行垃圾收集运行,清除所有弱侦听器,你有指向空对象引用的指针。 / p>
这是我的猜测,删除弱引用,看看会发生什么;)
答案 1 :(得分:0)
我会改变这一行(在你的构造函数中):
var ourShip:Ship = new Ship(stage);
到
ourShip = new Ship(stage);
我相信我们正在创建myShip的本地范围实例,它不会存在于构造函数之外。