Algorithm 博弈的运动算法

Algorithm 博弈的运动算法,algorithm,scripting,language-agnostic,game-physics,Algorithm,Scripting,Language Agnostic,Game Physics,我目前正在为COD4中的地图开发一个脚本。我认为这种语言非常简单,我把它标记为语言不可知论,因为问题在于这种情况下的算法 有一个房间宽960个单元。在里面有一个物体在中间,我们将被视为轴。球应该在每次被击中时移动到一个随机位置,但不应该超过墙壁。下面是一张图表: 据我所知,游戏的API只允许对象相对于它的位置移动,所以下面是我编写的代码。问题是,在第二次调用head_move()之后,它开始产生意外的结果,这让我的脑袋崩溃。谁能帮帮我吗 movementThink(): 编辑:只是澄清一下。当

我目前正在为COD4中的地图开发一个脚本。我认为这种语言非常简单,我把它标记为语言不可知论,因为问题在于这种情况下的算法

有一个房间宽960个单元。在里面有一个物体在中间,我们将被视为轴。球应该在每次被击中时移动到一个随机位置,但不应该超过墙壁。下面是一张图表:

据我所知,游戏的API只允许对象相对于它的位置移动,所以下面是我编写的代码。问题是,在第二次调用head_move()之后,它开始产生意外的结果,这让我的脑袋崩溃。谁能帮帮我吗

movementThink():

编辑:只是澄清一下。当用户投篮时,球的位置会改变到某个值。现在,如果他再次击球,随机整数生成器的最小值和最大值应该改变,以防止球移动到墙外。例如:

  • 一级开始。球在房间的中间。最小和最大范围分别为-480和480
  • 用户击球后,球移动了-200个单位(向左移动200个单位)
  • 现在,最小和最大范围应该是-280和680
  • 我希望这足够清楚

    编辑2:按照FlipScript的建议编辑该标志。以下是Log2屏幕功能的输出,实际发生的情况:

  • 最小值:-480,最大值480。移动67
  • 最小值:-413,最大值547。移动236
  • 最小值:-244,最大值716。移动461

  • 只是一个例子。我认为有些东西是反向的,这些计算是不正确的。

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

        head_origin thread head_move();
    
    他涉嫌制造麻烦。这些代币是什么?任何表示线程的内容都可能会复制数据结构并将局部变量引入歧途


    为什么x_min和x_max会改变?尤敏和尤马克斯在哪里

    在这行中有些地方看起来不对劲:

    x_max = x_min - 960;
    
    最大值真的是最小值减去960吗?根据你的描述,听起来应该是一个“+”符号

    编辑:

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

  • 级别开始…最小和最大范围分别为-480和480
  • 现在,最小和最大范围应该是-280和680

  • 注释1和3指向需要是“+”符号的符号。

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

    你应该做的是去掉最小值和最大值,从计算边界内的一个随机绝对位置开始。然后使用先前存储的绝对位置计算到达该位置所需的相对运动,并存储新的绝对位置

    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
    }
    

    这基本上是:“在新线程的实体head_原点上调用head_move()。head_origin是一个连接球和命中检测器的对象,所以我只需要移动一个东西,但这并不重要。在这种情况下,创建一个新线程不是问题,它结束得如此之快,以至于不可能调用两次。这里没有Y和Z,因为我现在只想让它在X轴上移动。但是你是对的,创建一个新线程确实会导致可能的错误。谢谢你的提醒!
    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
    }