0

TypeError: エラー #2007: パラメータ hitTestObject は非 null でなければなりません。

私は現在ゲームに取り組んでおり、プレイヤーが地面に衝突するようにしようとしています (彼はすでにテーブルに衝突しています)

playerOneCollisions で問題が発生していると表示されます

テーブルとグラウンドは、ムービークリップにリンクされた基本的なクラス コードを持つ単なるクラスであり、拡張されたムービークリップ (重要な場合) であり、ステージとムービークリップがインポートされています (重要な場合)。

(重要だと思う部分)

Player.as

public var main:Main;
public var table:Table;
public var player:Player;
public var ground:Ground;

        public function playerOneCollisions(table, ground)
        {
            if(this.hitTestObject(table))
            {
                trace("tabled");
                animation = "kong";
            }
            if(this.hitTestObject(ground))
            {
                trace("grounded");
                animation = "idle";
            }
        }

関数 playerOneCollisions は Main.as で呼び出されます

public function GameClock(timerEvent:TimerEvent):void
        {
            player.playerOnePress();
            player.playerOneKeyResults();
            player.playerOneCollisions(table, ground);
            player.playerAnimaitons();
        }

重要な部分について間違っていた場合のコードの残りの部分

Player.as

package
{
    import flash.display.Stage;
    import flash.display.MovieClip;
    import flash.events.Event;
    import KeyObject;
    import Table;

    public class Player extends MovieClip
    {
        public var stageRef:Stage;
        public var key:KeyObject;
        public var main:Main;
        public var table:Table;
        public var player:Player;
        public var ground:Ground;       

        public var leftPressed:Boolean = false;
        public var rightPressed:Boolean = false;
        public var upPressed:Boolean = false;
        public var downPressed:Boolean = false;

        public var grounded:Boolean = false;

        public var animation:String = "idle";

        public var runSpeed:Number = 5;

        public var animationState:String = "idle";

        public function Player (stageRef:Stage, X:int, Y:int):void
        {
            this.stageRef = stageRef;
            this.x = X;
            this.y = Y;

            key = new KeyObject(stageRef);
        }
        public function playerOnePress()
        {
            if(key.isDown(37) || key.isDown(65)){ // if left arrow or A is pressed
                leftPressed = true;
                //trace("left pressed");
            } else {
                leftPressed = false;
            }

            if(key.isDown(38) || key.isDown(87)){ // if up arrow or W is pressed
                upPressed = true;
                //trace("up pressed");
            } else {
                upPressed = false;
            }

            if(key.isDown(39) || key.isDown(68)){ //if right arrow or D is pressed
                rightPressed = true;
                //trace("right pressed");
            } else {
                rightPressed = false;
            }

            if(key.isDown(40) || key.isDown(83)){ //if down arrow or S is pressed
                downPressed = true;
                //trace("down pressed");
            } else {
                downPressed = false;
            }
        }
        public function playerOneKeyResults()
        {
            if(leftPressed)
            {
//              trace("left");
                this.x -= runSpeed;
            }else if(rightPressed)
            {
//              trace("right");
                this.x += runSpeed;
            }
        }
        public function playerOneCollisions(table, ground)
        {
            if(this.hitTestObject(table))
            {
                trace("tabled");
                animation = "kong";
            }
            if(this.hitTestObject(ground))
            {
                trace("grounded");
                animation = "idle";
            }
        }
        public function playerAnimaitons()
        {
            if(animation == "kong")
            {
                this.gotoAndStop(2);
            }
            if(animation == "idle")
            {
                this.gotoAndStop(1);
            }
        }
    }
}

Main.as

package
{
    import flash.display.Stage;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    public class Main extends MovieClip
    {
        public var gameTimer:Timer;
        public var player:Player;
        public var table:Table;
        public var ground:Ground;

        public function Main():void
        {
            gameTimer = new Timer (30);
            gameTimer.addEventListener(TimerEvent.TIMER, GameClock);
            gameTimer.start();

            player = new Player(stage, 80, 420);
            stage.addChild(player);
        }
        public function GameClock(timerEvent:TimerEvent):void
        {
            player.playerOnePress();
            player.playerOneKeyResults();
            player.playerOneCollisions(table, ground);
            player.playerAnimaitons();
        }   
    }
}
4

1 に答える 1

0

私が気づいたことの 1 つは、のクラス プロパティとしてと がtableあり、それらが問題を抱えているメソッドのパラメーターでもあることです。groundPlayer

Player クラスのtableand/orgroundプロパティは、それらを設定するコードが表示されないため、null である可能性があります。

クラス プロパティと同じ名前のメソッド パラメーターを使用することはお勧めできません。

Player クラスのプロパティを削除してみてください。(私はそれらが設定または使用されているのを見ません)

それでもエラーが発生する場合は、メソッドの先頭にある値をトレースして、playerOneCollisionsnull でないことを確認してください。

それらが null の場合、問題はこのクラスの外部に存在し、null 値を渡しています。

tableまたはプロパティを設定した Main クラスのどこにも表示されないことにも注意してくださいground。したがって、すべてのコードを表示しない限り、それらは null です。それらがnullの場合、それは確かにあなたが経験している問題を引き起こします.

于 2013-09-19T21:03:29.800 に答える