繁体   English   中英

动作3错误1009:无法访问空对象引用的属性或方法

[英]Actionscript 3 error 1009: Cannot access a property or method of a null object reference

我正在尝试在Animate CC上制作一个简单的游戏。 除了在输出中查看时,其他所有内容似乎都可以正常运行,但出现以下错误:

TypeError:错误#1009:无法访问空对象引用的属性或方法。 在_2D_CW2_Game_v10_8_fla :: MainTimeline / move()在_2D_CW2_Game_v10_8_fla :: MainTimeline / updateOb()

所以我知道问题可能在哪里,并且我一直在尝试调整代码几天,使用Google搜索可能的解决方案,但无济于事...

我的整个源代码如下。 任何反馈/建议将不胜感激。

import flash.ui.Keyboard;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.display.MovieClip;
import flash.net.URLRequest;
import flash.media.Sound;
import flash.media.SoundMixer;


//==================================================    
// Variable declaration 
//==================================================

// defines the variables for boundaries
var left:Number = 0;
var top:Number = 0;
var right:Number = stage.stageWidth;
var bottom:Number = stage.stageHeight; 

var velX:Number = 0;
var velY:Number = 0;
var gravity:Number = 1;
var friction:Number = 0.8;
var bounce:Number = -0.5;
var score:Number = 2;
var cv:Number = 0;
var curCount:Number = 30; // countdown 30s

var rightKeyDown:Boolean = false;
var leftKeyDown:Boolean = false;
var upKeyDown:Boolean = false;
var touchGround:Boolean = false;

// create and place player object on stage
var player:Player = new Player();
player.x = 110;
player.y = 460;
addChild(player);

// create obstacle array
var obstacles:Array = new Array();
var numOb:Number = 3;

// create and place enemies on stage
for (var i:Number = 0; i < numOb; i++) {
    var ob:Npc = new Npc();
    ob.x = 800;
    ob.y = 470;
    ob.scaleX = -1;
    ob.vx = Math.random() * 20 + 1;
    addChild(ob);
    obstacles.push(ob);
}


//==================================================    
// Event handlers   
//==================================================

stage.addEventListener(Event.ENTER_FRAME, EntFrame);
addEventListener(Event.ENTER_FRAME, updateOb);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);


//==================================================    
// Functions    
//==================================================

function keyDown(e:KeyboardEvent):void {
    if (e.keyCode == Keyboard.RIGHT) {
        rightKeyDown = true;
    }
    if (e.keyCode == Keyboard.LEFT) {
        leftKeyDown = true;
    }
    if (e.keyCode == Keyboard.UP) {
        // if player isn't already jumping and is on the ground
        if (!upKeyDown && touchGround) {
            // then start jumping
            isJumping();
        }
        upKeyDown = true;
    }
}

function keyUp(e:KeyboardEvent):void {
    if (e.keyCode == Keyboard.RIGHT) {
        rightKeyDown = false;
    }
    if (e.keyCode == Keyboard.LEFT) {
        leftKeyDown = false;
    }
    if (e.keyCode == Keyboard.UP) {
        upKeyDown = false;
    }
}

function EntFrame(e:Event):void {
    player.x += velX;
    player.y += velY;   
    velX *= friction;
    velY += gravity;
    if (player.y >= 450) {
        touchGround = true;
        player.y = 450;
    }
    // boundary checks
    if (player.x + player.width/2 > right) {
        player.x = right - player.width/2;
        player.velX *= bounce;
    } else if (player.x - player.width/2 < left) {
        player.x = left + player.width/2;
        player.velX *= bounce;
    }
    // make player move left or right
    controls();
    if (curCount > 0) {
        cv++;
        if (cv >= 30) {
            curCount--;
            cv = 0;
            timertext.text = String(curCount);
            if (curCount == 0) {
                restart();
                gotoAndStop("gameOverWon");
            }
        }
    }
}

function updateOb(e:Event):void {
    // make obstacles move
    for (var i:Number = 0; i < numOb; i++) {
        var ob:Npc = obstacles[i];
        move(ob);
        if (player.hitTestObject(obstacles[i])) {
        /*if (obstacles[i].hitTestPoint(player.x + player.width/2, player.y + player.height/2, true)
        || obstacles[i].hitTestPoint(player.x + player.width/2, player.y - player.height/2, true)
        || obstacles[i].hitTestPoint(player.x - player.width/2, player.y + player.height/2, true)
        || obstacles[i].hitTestPoint(player.x - player.width/2, player.y - player.height/2, true))*/
            bumpOb(obstacles[i]);
        }
    }
    scoretext.text = String(score);
    if (score == 0) {
        restart();
        gotoAndStop("gameOverLost");
    }
}

// applies basic velocity to enemies
function move(moveOb) {
    moveOb.x -= moveOb.vx;
    if (moveOb.x + moveOb.width/2 > right) {
        moveOb.x = right - moveOb.width/2;
        moveOb.vx *= bounce;
        moveOb.scaleX = -1;
    }
    if (moveOb.x - moveOb.width/2 < left) {
        moveOb.x = left + moveOb.width/2;
        moveOb.vx *= bounce;
        moveOb.scaleX = 1;
    }
}

function bumpOb(p) {
    if (p) {
        p.removeEventListener(Event.ENTER_FRAME, updateOb);
        if (p.parent) {
            removeChild(p);
            score--;
        }
    }
}

function restart() {
    if(contains(player)) {
        removeChild(player);
    }
    for (var i:int = 0; i < numOb; i++) {
        if (contains(obstacles[i]) && obstacles[i] != null) {
            removeChild(obstacles[i]);
            obstacles[i] = null;
        }
    }
    // returns a new array that consists of a range of elements from the original array, 
    // without modifying the original array
    obstacles.slice(0);
}

function controls() {
    if (rightKeyDown) {
        velX += 3;
        player.scaleX = 1;
    }
    if (leftKeyDown) {
        velX -= 3;
        player.scaleX = -1;
    }
}

function isJumping() {
    touchGround = false;
    velY = -15;
}


//==================================================    
// Sound control for background music   
//==================================================

btnMute.addEventListener(MouseEvent.CLICK, mute);

function mute(e:MouseEvent):void {
    SoundMixer.soundTransform = new SoundTransform(0);
    btnMute.removeEventListener(MouseEvent.CLICK, mute);
    btnMute.addEventListener(MouseEvent.CLICK, unmute);
}

function unmute(e:MouseEvent):void {
    SoundMixer.soundTransform = new SoundTransform(1);
    btnMute.removeEventListener(MouseEvent.CLICK, unmute);
    btnMute.addEventListener(MouseEvent.CLICK, mute);
}

为动画创建交互式元素时,我遇到了同样的问题。 检查交互式对象位于哪一层。 当对象与位于上一层的东西重叠时,发生类似的错误。

你可以尝试 ...

1)您的Npc是类/库对象,对不对?

给源MC / Sprite命名为moveObp的实例名称。

2) 否则尝试 ...使用函数参数 (这是一种更好的编码样式)

(2a)自从你说..

var ob:Npc = obstacles[i];
move(ob);

ps: 为什么不简化(不带var )为move( obstacles[i] ); ...?

(2b)您的移动功能应指定数据类型以及参数名称...

//# applies basic velocity to enemies

//# Wrong... 
//function move(moveOb) {

//# Better... 
function move( moveOb : Npc ) {

//# Aso fix as...
function bumpOb(p : Npc ) {

通过使用函数参数,您现在可以为(函数的)输入参数指定唯一的名称,但仍引用相同(或兼容)的数据类型。

让我知道事情的后续。

障碍物阵列的中间可能有空元素。 如果添加条件以继续(如果为null)怎么办?

function updateOb(e:Event):void {
     // make obstacles move
    for (var i:Number = 0; i < obstacles.length; i++) {
        var ob:Npc = obstacles[i];
        if(!ob) continue;
        move(ob);
        if (player.hitTestObject(ob)) {
        /*if (obstacles[i].hitTestPoint(player.x + player.width/2, player.y + 
player.height/2, true)
        || obstacles[i].hitTestPoint(player.x + player.width/2, player.y - 
player.height/2, true)
        || obstacles[i].hitTestPoint(player.x - player.width/2, player.y + 
player.height/2, true)
        || obstacles[i].hitTestPoint(player.x - player.width/2, player.y - 
player.height/2, true))*/
            bumpOb(obstacles[i]);
        }
    }
    scoretext.text = String(score);
    if (score == 0) {
        restart();
        gotoAndStop("gameOverLost");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM