-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リンケージ名は上記で定義した変数とまったく同じです。たぶん、いくつかの余分な目で、ここで何が問題になっているのかを確認し、その理由を説明することができます。

前もって感謝します!

4

1 に答える 1

1

livedocsによると:

サウンドカードがない場合、または使用可能なサウンドチャネルが不足している場合、winFX.play()メソッドはnullを返すことがあります。一度に利用できるサウンドチャンネルの最大数は32です。

上記の問題のいずれかがあなたに当てはまるかどうかを確認してください。


マークが言ったように、クラスwinGameSoundがここの犯人です。winFX.play()を呼び出すと、サウンドチャネルではなくnullが返されます。したがって、nullオブジェクトにサウンド変換を適用することはできません。

現在取得できる唯一の情報は、クラスがSoundクラスを継承し、play()呼び出しでnullを返すことです。

于 2012-10-17T05:57:55.950 に答える