簡體   English   中英

AS3-錯誤#1009:無法訪問空對象引用的屬性或方法

[英]AS3 - Error #1009: Cannot access a property or method of a null object reference

我對此有問題:

錯誤#1009:無法訪問空對象引用的屬性或方法。

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at spyhookerproject_fla::MainTimeline/mapGen()
at spyhookerproject_fla::MainTimeline/startGame()
at spyhookerproject_fla::MainTimeline/gameLoop()

所以它的錯誤發生在mapGen()的某個地方,我知道很多,但我不知道如何解決。

注意:MP01,MP02 ...尚未設置AS鏈接,因為我無法使用AS鏈接集來設置可見性。

而且我對removeMuzzle()遇到了同樣的問題;

繼承人代碼:

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.text.engine.SpaceJustifier;
import flashx.textLayout.operations.MoveChildrenOperation;

/*----------------------------Main VARs-----------------------------*/
var STATE_START:String="STATE_START";
var STATE_START_PLAYER:String="STATE_START_PLAYER";
var STATE_PLAY:String="STATE_PLAY";
var STATE_END:String="STATE_END";
var gameState:String;

var player:MovieClip;
var playerSpeed:Number;
var speedLimit:Number;
var speedLimitInc:Number;
var map:Array;
var bullets:Array;
//holds civil vehicles
var civil:Array; 
//holds enemy vehicles
var enemy:Array; 
var explosions:Array;

var BBullet:MovieClip;
var FireBTN:MovieClip;
var muzzle:MovieClip;
var muzzleArray:Array;

//maps
//var mp1:MP00;
var mp3:MovieClip;
var mp1:Array;
/*
var MP_01:MovieClip;
var MP_02:MovieClip;
var MP_03:MovieClip; 
*/

//sets the bullet type and properties
var BType = "BBasic";
var BProp:Array;

//bullet preperties by type

var BBasic:Array = new Array(1, 1, 100, 50, 0, new BBasicA());

/**
ARRAY SETTING
0 = bullet position (middle , back, sides etc...)
    1-middle front
    2-left side front
    3-right side front
    4-left and right side middle
    5-back
    7-left and right side wheels

1 = bullet direction
    1-forward
    2-back
    3-sides

2 = fire speed (in millisecounds so 1000 = 1sec)

3 = speed of movement

4 = damage 10-100

5 = name of the firing animation in library

6 = name of launch animation in library

7 = name of impact animation in library 
**/

var level:Number;

//BCivil speed and randomness
var BCSpeed:Number = 3;
var BCRand:Number = 120;

/*------------------------------Setup-------------------------------*/


introScreen.visible = false;
loadingScreen.visible = false;
gameScreen.visible = false;
endScreen.visible = false;
//map visibility
MP00.visible = false;
MP01.visible = false;
MP02.visible = false;
//MpRSimple.visible = false;

/*---------------------------Intro screen--------------------------*/


/*-----------------------------mainScreen---------------------------*/

mainScreen.play_btn.addEventListener(MouseEvent.CLICK, clickAway);
function clickAway(event:MouseEvent):void
{
    gameStart();
    }

function gameStart():void
{
    //Move main screen from stage
    mainScreen.visible = false;

    //Begin loading the game
    gameState = STATE_START;
    trace (gameState);
    addEventListener(Event.ENTER_FRAME, gameLoop);
    }

/*----------------------------gameLoop-----------------------------*/

function gameLoop(e:Event):void
{
    switch(gameState)
    {
        case STATE_START:
            startGame();
            break;

        case STATE_START_PLAYER:
            startPlayer();
            break;

        case STATE_PLAY:
            playGame();
            break;

        case STATE_END:
            endGame();
            break;

        }
    }
/*-_________________________-Game STATES-_________________________-*/

/*---------------------------STATE_START---------------------------*/

function startGame():void
{

    level = 1; //setting level for enemies
    playerSpeed = 1;
    speedLimit = 10;
    speedLimitInc = 1;

    //Graphics
        //player icon
    player = new Player(); 
        //add bullet holder
    bullets = new Array();
        //basicCivil icon
    civil = new Array(); 
        //basicEnemy icon
    enemy = new Array(); 
        //holds explosions
    explosions = new Array(); 

    //mapGen();

    FireBTN = new fireBTN();
    FireBTN.y = stage.stageHeight - FireBTN.height;
    FireBTN.x = stage.stageWidth - FireBTN.width;

    //map
    mp3 = MP00;

    //Load map parts

    //End startGame
    gameState = STATE_START_PLAYER;
    trace(gameState);
    }

/*------------------------STATE_START_PLAYER-----------------------*/

function startPlayer():void
{
    //start the player

    //set possition of player
    player.y = stage.stageHeight - player.height;
    addChild(player);
    addEventListener(Event.ENTER_FRAME, movePlayer);

    //changing screens

    //start game
    gameState = STATE_PLAY;
    trace(gameState);

    }

//player controll
function movePlayer(e:Event):void 
{
    //mouse\touch recognition
    player.x = stage.mouseX;
    player.y = stage.mouseY;

    //player does not move out of the stage
    /*
    if (player.x < 0)
    {
        player.x = 0;
    }
    else if (player.x > (stage.stageWidth - player.width))
    {
        player.x = stage.stageWidth + player.width;
    }*/

    }

//setting bullet type
/*
if (BType == "BBasic")
{
        BProp = BBasic;
    /*case BMissile;
        BProp = BMissile;
        break;
    }*/
//creating bullets
var bulletTimer:Timer = new Timer (100);
bulletTimer.addEventListener(TimerEvent.TIMER, timerListener);
bulletTimer.start();
trace("nja");

function timerListener(e:TimerEvent):void
{
    //need and if statement to determine the bullet speed and travel depended on type of bullet
    var tempBullet:MovieClip = new BBasicA();
    var mF:MovieClip = new BBMF();
    //shoots bullets in the middle
    mF.x = player.x; 
    mF.y = player.y;
    tempBullet.x = player.x; 
    tempBullet.y = player.y - player.height / 2;
    //shooting speed
    tempBullet.speed = 50; 
    bullets.push(tempBullet);
    addChild(tempBullet);
    addChild(mF);
    //bullets movement forward
    for(var i=bullets.length-1; i>=0; i--)
    {
        tempBullet = bullets[i];
        tempBullet.y -= tempBullet.speed;
        }
    }
/*----------------------------STATE_PLAY---------------------------*/

function playGame():void
{
    //gameplay
    speedUp();
    mapMove();
    //fire();
    makeBCivil();
    makeBEnemy();
    moveBCivil();
    moveBEnemy();
    vhDrops();
    testCollision();
    testForEnd();
    removeExEplosions();
    removeMuzzle();
    }

function speedUp():void
{

    //making speed limit
    if (playerSpeed < speedLimit)
    {
        playerSpeed ++;
        }
    //increasing speed limit
    if (speedLimitInc == 60)
    {
        speedLimit ++;
        speedLimitInc = 1;
        }
    speedLimitInc ++;
    trace("player speed:", playerSpeed);
    trace("speed limit:", speedLimit);
    trace("speed limit inc:", speedLimitInc);
    }

function mapMove(){
    for(var i:int = mp1.length; i>=0; i--)
    {
        var tempMap:MovieClip;
        tempMap = new mp1[i];
        trace ("tempMap", tempMap);
        tempMap.visible = true;
        tempMap.y = tempMap.y + playerSpeed;
        var k:Number = 0;
        setChildIndex(mp3, k);
        }
    trace ("mapMove");
    if(mp3.y >= 0 )
    {
        trace ("mapMove, if");
        mapGen();
        }
    }


function mapGen()
{
    trace ("mapGen");
    var mapRand:Number = Math.floor(Math.random()*3);
    trace ("mapRand:", mapRand);
    switch (mapRand)
    {
        case 0:
            mp3 = MP00;
            break;

        case 1:
            mp3 = MP01;
            break;

        case 2:
            mp3 = MP02;
            break;
        }
    mp3.x = stage.stageWidth / 2;
    mp3.y = stage.stageHeight - 1000;
    addChild(mp3);
    mp1.push(mp3);
    }

function makeBCivil():void
{
    //random chance
    var chance:Number = Math.floor(Math.random()*BCRand);
    if (chance <= 1 + level) 
    {
        var tempBCivil:MovieClip;
        //generate enemies
        tempBCivil = new BCivil();
        tempBCivil.speed = BCSpeed + playerSpeed;
        tempBCivil.x = Math.round(Math.random()*800);

        addChild(tempBCivil);
        civil.push(tempBCivil);
        }
    }

function moveBCivil():void
{
    //move enemies
    var tempBCivil:MovieClip;
    for(var i:int = civil.length-1; i>=0; i--)
    {
        tempBCivil = civil[i];
        tempBCivil.y += tempBCivil.speed
        }

    //testion colision with the player and screen out
    if (tempBCivil.y > stage.stageHeight /* || tempBCivil.hitTestObject(player) */)
    {
        trace("ds hit");
        //makeExplosion (player.x, player.y);
        removeCivil(i);
        //gameState = STATE_END;
        }
    }

//Test bullet colision
function testCollision():void
{
    var tempBCivil:MovieClip;
    var tempBEnemy:MovieClip;
    var tempBullet:MovieClip;

    //civil/bullet colision
    civils:for(var i:int=civil.length-1; i>=0; i--)
    {
        tempBCivil = civil[i];
        for (var j:int=bullets.length-1; j>=0; j--)
        {
            tempBullet = bullets[j];
            if (tempBCivil.hitTestObject(tempBullet))
            {
                trace("laser hit the civil");
                makeExplosion (tempBCivil.x, tempBCivil.y);
                removeCivil(i);
                removeBullet(j);
                break civils;
                }
            }
        }

    //enemy/bullet colision
    enemy:for(var k:int=enemy.length-1; k>=0; k--)
    {
        tempBEnemy = enemy[k];
        for (var l:int=bullets.length-1; l>=0; l--)
        {
            tempBullet = bullets[l];
            if (tempBEnemy.hitTestObject(tempBullet))
            {
                trace("bullet hit the Enemy");
                makeExplosion (tempBEnemy.x, tempBEnemy.y);
                removeEnemy(k);
                removeBullet(l);
                break enemy;
                }
            }
        }
    }

function makeExplosion(ex:Number, ey:Number):void
{
    var tempExplosion:MovieClip;
    tempExplosion = new boom();
    tempExplosion.x = ex;
    tempExplosion.y = ey;
    addChild(tempExplosion)
    explosions.push(tempExplosion);
    }

function makeBEnemy():void
{
    //random chance
    var chance:Number = Math.floor(Math.random()*BCRand);
    if (chance <= 1 + level) 
    {
        var tempBEnemy:MovieClip;
        //generate enemies
        tempBEnemy = new BEnemy();
        tempBEnemy.speed = BCSpeed + playerSpeed;
        tempBEnemy.x = Math.round(Math.random()*800);

        addChild(tempBEnemy);
        enemy.push(tempBEnemy);
        }

    }

function moveBEnemy():void
{
    //move enemies
    var tempBEnemy:MovieClip;
    for(var i:int = enemy.length-1; i>=0; i--)
    {
        tempBEnemy = enemy[i];
        tempBEnemy.y += tempBEnemy.speed
        }

    //testion colision with the player and screen out
    if (tempBEnemy.y > stage.stageHeight /* || tempBCivil.hitTestObject(player) */)
    {
        trace("enemy");
        //makeExplosion (player.x, player.y);
        removeEnemy(i);
        //gameState = STATE_END;
        }
    }

function vhDrops():void
{}

function testForEnd():void
{
    //check damage


    //end game
    //gameState = STATE_END;
    trace(gameState);
    }

/*--------------------REMOVING BS FROM STAGE-----------------------*/
//removing civils
function removeCivil(idx:int):void 
{
    if(idx >= 0)
    {
        removeChild(civil[idx]);
        civil.splice(idx, 1);
        }
    }

//removing enemies
function removeEnemy(idx:int):void 
{
    if(idx >= 0)
    {
        removeChild(enemy[idx]);
        enemy.splice(idx, 1);
        }
    }

//removing civils
function removeBullet(idx:int):void 
{
    if(idx >= 0)
    {
        removeChild(bullets[idx]);
        bullets.splice(idx, 1);
        }
    }

//removing expired explosions
function removeExEplosions():void 
{
    var tempExplosion:MovieClip;
    for(var i=explosions.length-1; i>=0; i--)
    {
        tempExplosion = explosions[i];
        if (tempExplosion.currentFrame >= tempExplosion.totalFrames)
        {
            removeExplosion(i);
            }
        }
    }

//removing civils
function removeExplosion(idx:int):void 
{
    if(idx >= 0)
    {
        removeChild(explosions[idx]);
        explosions.splice(idx, 1);
        }
    }

function removeMuzzle():void
{
    var mF:MovieClip;
    for(var i=muzzleArray.length-1; i>=0; i--)
    {
        mF = muzzleArray[i];
        if (mF.currentFrame >= mF.totalFrames)
        {
            removeChild(muzzleArray[i]);
            }
        }
    }

/*--------------------------STATE_END------------------------------*/

function endGame():void
{

    }


/*gameScreen*/

/*endScreen*/

注意:該代碼是沒有完成的地方,並沒有將所有內容都放在適當的位置,有些東西是占位符。

提前致謝!

編輯:將此添加到mapMove();

if(mp1 == null)
    {
        trace ("mp1 null, MAPGEN");
        mapGen();
        }

編輯:突出顯示錯誤

僅關注您的MapMoveMapGen函數:

看起來MP00 / MP01 / MP02是某種顯示對象,並且您將它們存儲在名為mp1的數組中。

在您的MapMove函數中,您具有以下這一行:

tmpMap = new mp1[i];

這應該引發錯誤,因為數組mp1不存儲類名,而是實例化顯示對象。

如果刪除new關鍵字,則它將只是將數組中的對象分配給tmpMap var。

這可能不是您唯一的問題,但絕對是您需要解決的問題。


其他事宜:

永遠不會實例化mp1數組:您需要執行mp1 = new Array(); mp1.push起作用之前。

您的for循環為i創建的值超出范圍:

更改for(var i:int = mp1.length; i>=0; i--)for(var i:int = mp1.length; i>=0; i--)為:

for(var i:int = mp1.length - 1; i>=0; i--)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM