游戏的运动算法

时间:2011-01-06 05:54:37

标签: algorithm scripting language-agnostic game-physics

我正在为COD4中的地图开发脚本。我认为语言非常简单,我将其标记为与语言无关,因为问题出现在算法中。

有一个宽960个单位的房间。在它里面有一个物体在中间,我们将其视为轴。每次击球时,球应该移动到一个随机位置,但不应该比墙壁更远。这是一个图表:

Image

据我所知,游戏的API只允许相对于其位置移动对象,所以这里是我提出的代码。问题是在第二次调用head_move()之后,它开始产生意想不到的结果,这让我头晕目眩。有人可以帮帮我吗?

movementThink():

while (1)
{
    self waittill ("trigger", player); //Wait till player hits the object       
    head_origin thread head_move();

}



head_move()
{
    /* level.prevx is a global variable which I use to store
    the distance traveled in the previous shot. Defaults to 0 */

    /*This works in the first and second hit, but then it begins to show
    incorrect max and min values*/

    x_min = (0-480) + level.prevx;
    x_max = x_min + 960;

    x_units =  RandomIntRange( x_min, x_max ); //Create a random integrer

    log2screen("MIN: " + x_min + " and MAX: " + x_max + " and MOVED " + x_units);
    log2screen("Moved " + x_units);

    //Movement function, first parameter is the distance to be traveled, and the second one is the speed
    self movex (x_units , level.movespeed); 

    level.prevx = x_units;

}

编辑:只是为了澄清。当用户射球时,其位置变为特定值。现在,如果他再次击中它,随机int发生器的最小值和最大值应该改变,以防止球移动到墙外。例如:

  1. 等级开始。球在房间的中间。最小和最大范围分别为-480和480
  2. 用户击球并移动-200个单位(左侧200个单位)。
  3. 现在,最小和最大范围应为-280和680。
  4. 我希望这很清楚。

    编辑2:按照FlipScript的建议编辑了该符号。这是log2screen函数的输出,实际发生了什么:

    1. MIN:-480和MAX 480.移动67
    2. MIN:-413和MAX 547.移动236
    3. MIN:-244和MAX 716.移动461
    4. 只是一个示例案例。我认为有些事情是倒退的,这些都不是正确的计算方法。

3 个答案:

答案 0 :(得分:2)

只有当self.prevx包含您从起始位置的位移(即您的绝对位置)时,您的代码才有效。但是,您存储的是您从当前位置的位移。它的前两次是因为该位移恰好与您的绝对位置相同,但是一旦再次移动,您将失去所有位置的轨迹。

你应该做的是摆脱min和max,并从边界内的随机绝对位置开始计算。然后使用先前存储的绝对位置来计算到达那里所需的相对运动,并存储新的绝对位置。

head_move()
{    
    new_x = RandomIntRange( -480, 480 ); //create a random location

    delta_x = new_x - level.prev;  //determine relative movement needed to get there

    self movex (delta_x , level.movespeed); //move to new position

    level.prevx = new_x;  //store new position
}

答案 1 :(得分:1)

我对编程环境不太了解,但这一行

    head_origin thread head_move();

怀疑是否有麻烦。这些令牌是什么?任何说线程的东西都可能是复制数据结构并使你的局部变量误入歧途。

为什么x_min和x_max会改变? y_min和y_max在哪里?

答案 2 :(得分:0)

这一行看起来不对劲:

x_max = x_min - 960;

MAX真的是MIN MINUS 960吗?根据您的描述,听起来应该是一个“+”符号。

修改

在你的附加评论中,减号不允许这些真理:

  1. 等级开始......最小和最大范围分别为-480和480
  2. ...
  3. 现在,最小和最大范围应为-280和680。
  4. 评论1和3指出该标志需要'+'标志。