0

メイン、プレーヤー、車の3つのクラスがあります。

メインは車とプレーヤーを作成します。車はプレーヤーのx位置をトレースする必要があります。しかし、以下のコードは機能していません。調査したところ、静的であると宣言すると問題が解決するはずですが、それが最善の方法ではないことがわかりました。

主要:

package { 

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;

public class Main extends MovieClip
{       
    public static var _player:Player;
    public static var _car:Car;

    public function Main() 
    {
        createPlayer();
    }

    public function createPlayer():void
    {

        _player= new Player();
        _car = new Car();

        _player.x = stage.stageWidth / 2;
        _player.y = stage.stageHeight / 2;

        stage.addChild(_player);
        stage.addChild(_car);
    }

}

}

車両:

package { 

import flash.display.MovieClip;
import Main;

public class Player extends MovieClip
{
    public function Player()
    {
        trace(Main._car.x);

    }
}

}

ただし、これによりエラーが発生します。TypeError:エラー#1009:nullオブジェクト参照のプロパティまたはメソッドにアクセスできません。Main()のPlayer()でMain()のcreatePlayer()

これがエラーを引き起こしている理由と、これを行うための他の良い方法は何ですか?

//編集:申し訳ありませんが、_heroは私の間違いでした、実際には_carです。どうもありがとうございます...........

4

2 に答える 2

1

まず第一に:これはプログラムする正しい方法ではありません!どこでも静的プロパティを使用するべきではありません。次に、_carインスタンスに割り当てる前に、_playerインスタンスが作成されnew Car()ます。そのため、まだnullです。次のように、行を変更してみてください。

_car = new Car();
_player = new Player();

繰り返しますが、これで問題は解決しますが、コーディングは正しい方法ではありません。_carオブジェクトへの参照が必要な場合は、Playerクラスのコンストラクターに渡します。

PSそれがあなたを助けたなら、この投稿を答えとしてマークすることを忘れないでください。

編集:

始めるためのコードは次のとおりです。

Playerクラスに、Carオブジェクトに参照を格納するためのプライベートプロパティを追加します。次に、Playerのコンストラクターにパラメーターを追加します。このパラメーターは、新しいPlayerを作成するときに渡します。これは、Carオブジェクトへの参照をMainクラスにも保存する場合にのみ使用することに注意してください。

package { 

import flash.display.MovieClip;
import Main;

public class Player extends MovieClip
{
    private var _car:Car; // add a property to store a reference to the Car object

    public function Player(car:Car) //add a parameter to your Player constructor to pass in a Car object
    {
        _car = car; //assign passed Car object to your property _car
        trace(_car.x) //now you can use _car as you wish
    }
}
}

Playerオブジェクトを定義するときは、Carオブジェクトをそのコンストラクターに渡す必要があります。したがって、次のようにします。

_player = new Player(_car);

MainクラスのCarオブジェクトへの参照が必要ない場合、またはCarがPlayerに割り当てられているかどうかを言う方がよい場合は、各Playerが独自のCarを持つように、Playerでプロパティを定義することをお勧めします。このようなクラス:

 package { 

import flash.display.MovieClip;
import Main;

public class Player extends MovieClip
{
    public var car:Car; // add a property to store a reference to the Car object, note that now we made the car a public property, so that it can be accessed from outside.

    public function Player() //add a parameter to your Player constructor to pass in a Car object
    {
        car = new Car(); // initialize your variable
        trace(car.x) //now you can use car as you wish from this class
    }
}
}

また、Playerクラスで初期化したこのCarオブジェクトには、次のようにMainクラスからアクセスできることに注意してください。

_player = new Player();
trace(_player.car.x);

カプセル化、継承、ポリモーフィズムなど、OOP(オブジェクト指向プログラミング)の基本的な概念を読むことをお勧めします。あなたがあなたの足に乗るのを助けるいくつかの良い本をグーグルで検索してください。

于 2012-08-15T08:18:52.767 に答える
0

クラスでMainオブジェクトを見ることができません。また、でオブジェクトを見ることができません。したがって、はNULLです。PlayerheroMainMain._hero.x

于 2012-08-15T07:29:56.627 に答える