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_%28object-oriented_programming%29

“在面向对象的编程中,类中的构造函数(有时缩写为 ctor)是一种特殊类型的子例程,在创建对象时调用。它准备新对象以供使用..”

基本上,您没有准备新的 Point 对象。

在这个例子中,在构造函数期间(公共函数字符)

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 不会为空。

祝你好运。

于 2012-09-24T08:39:10.597 回答