-1

我正在 AS3 中创建“太空入侵者”游戏。现在一切正常,但不断出现 #1009 错误,我正在查看它很长一段时间,但我只是看不到问题所在。一些额外的眼睛可以帮助我想!

这是调试器所说的:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at testbestandkopie_fla::MainTimeline/winGame()[testbestandkopie_fla.MainTimeline::frame1:352]
at testbestandkopie_fla::MainTimeline/enemyHitTest()[testbestandkopie_fla.MainTimeline::frame1:338]
at testbestandkopie_fla::MainTimeline/onTick()[testbestandkopie_fla.MainTimeline::frame1:117]
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

下面我将粘贴与错误有关的代码:

1:创建 AS 链接名称:

//Sound FX-------------------------------------------------------------------------
var startFX:Sound = new startGameSound();
var laserFX:Sound = new laserSound();
var explosionFX:Sound = new explosionSound();
var musicFX:Sound = new backgroundMusic();
var loseFX:Sound = new endGameSound();
var winFX:Sound = new winGameSound();
var SfxTransform = new SoundTransform();
var myChannelMisc:SoundChannel = new SoundChannel();
var myChannelMusic:SoundChannel = new SoundChannel();
var myChannelWin:SoundChannel = new SoundChannel();
var myChannelLose:SoundChannel = new SoundChannel();
//---------------------------------------------------------------------------------

2:[第 117 行] AS 第 117 行是突出显示的:

//Handlers Functions---------------------------------------------------------------
function onTick(e:TimerEvent) { //A continuous run of some functions below.
moveCharacter();
moveEnemyField(); 

playerCollisionDetectWall();
enemyCollisionDetectWall();
enemyCollisionDetectWallBottom();

moveLasers();
enemyHitTest(); <---- line 117
}

3: [第 338 行] 函数enemyHitTest(); winGame() 开始的地方;功能:

function enemyHitTest() {
//For each of the three enemys
for (var i:int = 0; i < enemyArray.length; i++) {
    //the each of the six lasers
    for (var j:int = 0; j < 6; j++) {
        //don't consider lasers that aren't in play:
        if (laserArray[j].y > SpelerMC.y) continue;
        if (enemyArray[i].visible &&     enemyArray[i].hitTestObject(laserArray[j])) {
            score += 10;
            myChannelMisc = explosionFX.play();
            SfxTransform.volume = 0.3;
            myChannelMisc.soundTransform = SfxTransform;
            scoreTxt.text = score.toString();
            trace("Invader nummer " + i + " neergeschoten!");
            enemyArray[i].visible = false;
            //Now we remove the laser when hitting.
            laserArray[j].x = j * 70 + 100; 
            laserArray[j].y = 895;
        }
        else if(score == 660) { 
        //If you reach a score of 660 (66 enemy's x 10 = 660) you win the game.
            winGame(); <---- Line 338
        }
    }
}
}

4: [第 352 行] winGame(); 在敌人命中获得 660 分后运行函数。

function winGame() {
winScreen.visible = true;
gameTimer.stop();
//Stop the music.
myChannelMusic.stop();
//Start the "You Win" music.
myChannelWin = winFX.play();
SfxTransform.volume = 0.02;
myChannelWin.soundTransform = SfxTransform; <---- line 352
}

如您所见,它通过这些功能运行。我已经检查了我在库中的文件是否有问题,但是 AS Linkage 名称与我在上面定义的 var 完全相同。也许一些额外的眼睛可以看到这里出了什么问题,并解释我为什么..

提前致谢!

4

1 回答 1

1

根据livedocs

如果您没有声卡或没有可用的声道,winFX.play()方法可能会返回 null。一次可用的最大声道数为 32。

检查上述任何一个问题是否适用于您....


正如马克所说,类winGameSound是这里的罪魁祸首。调用winFX.play()返回空值,而不是声道。所以你不能对空对象应用声音变换。

目前可以得到的唯一信息是该类继承了 Sound 类并通过 play() 调用返回 null。

于 2012-10-17T05:57:55.950 回答