0

基本的には、ランダムに生成されたキャラクターが一連のウェイポイントをたどって、ステージの壁などに足を踏み入れることなく、必要な場所に到達できるようにしようとしています。

ポイントの配列をエンジンからキャラクターの followPath 関数に渡すことでこれを行っています (これはループになりますが、まだその段階には達していません)。

この followPath 関数の一部は、キャラクターがウェイポイントに十分に近づいたことを検出し、次のウェイポイントに移動することです。これを行うには、現在選択されているウェイポイントとキャラクターの現在の位置を表すポイントとの間の距離を計算するために Point.distance(p1,p2) を使用しようとしています。

これは、私がこの問題に直面しているところです。キャラクターの現在の (x,y) ポイント位置を更新しようとするのは難しいことがわかっています。ドキュメントに記載されているにもかかわらず、何らかの理由で Point.setTo 関数が存在しないようです。その結果、私は使用しています

        currentPos.x = x;
        currentPos.y = y;
        //update current position point x and y

これを試してみると、1009 エラーが発生します。

これまでの私の完全な Character クラスは次のとおりです。

package  {
import flash.display.MovieClip;
import flash.geom.Point;

public class Character extends MovieClip {

    public var charType:String;
    private var charList:Array = ["oldguy","cloudhead","tvhead","fatguy","speakerhead"];
    private var numChars:int = charList.length;
    private var wpIndex:int = 0;
    private var waypoint:Point;
    private var currentPos:Point;
    private var wpDist:Number;
    private var moveSpeed:Number = 5;

    //frame labels we will need: charType+["_walkingfront", "_walkingside", "_walkingback", "_touchon", "_touchonreaction", "_sitting"/"_idle", "_reaction1", "_reaction2", "_reaction3", "_reaction4"]

    public function Character() {
        trace("new character:");
        charType = charList[Math.floor(Math.random()*(numChars))];
        //chooses a random character type based on a random number from 0-'numchars'
        trace("char type: " + charType);

        gotoAndStop(charType+"_walkingfront");

        x = 600;
        y = 240;
    }

    public function followPath(path:Array):void {
        if(wpIndex > path.length){ //if the path has been finished
            gotoAndStop(charType+"_sitting"); //sit down
            return;//quit
        }

        waypoint = path[wpIndex];
        //choose the selected waypoint
        currentPos.x = x;
        currentPos.y = y;
        //update current position point x and y

        wpDist = Point.distance(currentPos,waypoint);
        //calculate distance

        if(wpDist < 3){ //if the character is close enough to the waypoint
            wpIndex++; //go to the next waypoint
            return; //stop for now
        }
        moveTo(waypoint);
    }

    public function moveTo(wp:Point):void {
        if(wp.x > currentPos.x){
            currentPos.x += moveSpeed;
        } else if(wp.x < currentPos.x){
            currentPos.x -= moveSpeed;
        }

        if(wp.y > currentPos.y){
            currentPos.y += moveSpeed;
        } else if(wp.y < currentPos.y){
            currentPos.y -= moveSpeed;
        }
    }

}

}

なぜこれが起こっているのか誰にも説明できますか?この段階で克服できなかった障害です。

ファントム Point.setTo メソッドを使用できない理由について、誰かが情報を提供できるかどうかも知りたいです。

4

2 に答える 2

3

存在しない Point オブジェクトの x プロパティと y プロパティを割り当てようとしています。

ポイントを作成する必要があります。

currentPos = new Point ();

次に、x と y を割り当てます

于 2012-09-24T08:30:44.703 に答える
1

問題は、最初に Point コンストラクターを使用していないことです。単純なデータ型 (Int、Number、String など) ではない変数を作成する場合は、最初にコンストラクターを呼び出し、その後でのみオブジェクトのフィールドにプロパティを割り当てる必要があります。これは、そのプロパティにアクセスする前にクラス Point のインスタンスを初期化する必要があるためです。同じことが他のクラスにも当てはまります。

http://en.wikipedia.org/wiki/Constructor_%28オブジェクト指向プログラミング%29

「オブジェクト指向プログラミングでは、クラスのコンストラクター (ctor に短縮されることもあります) は、オブジェクトの作成時に呼び出される特別なタイプのサブルーチンです。使用する新しいオブジェクトを準備します..」

基本的に、新しい Point オブジェクトを用意しませんでした。

この例では、コンストラクター (パブリック関数 Character) 中に

public function Character() {
        //add these lines (you can omit the zeroes as the default value is zero)
        //I added the zeroes to show that the constructor can set the initial values.
        wayPoint = new Point(0, 0);
        currentPos = new Point(0, 0);
        trace("new character:");
        charType = charList[Math.floor(Math.random()*(numChars))];
        //chooses a random character type based on a random number from 0-'numchars'
        trace("char type: " + charType);

        gotoAndStop(charType+"_walkingfront");

        x = 600;
        y = 240;
    }

オブジェクトを構築するか、このようなことを行うまで、すべての新しいオブジェクト識別子が NULL (何もない) を参照することを覚えておいてください。

var pointA = pointB;
//where pointB is already not null
//You can also check this
if(currentPos != null)
{
   currentPos.x = X;
   currentPos.y = Y;
}

最初にコンストラクターを使用すると、currentPos は null になりません。

幸運を。

于 2012-09-24T08:39:10.597 に答える