You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

坦克AI随机点移动转向异常问题求助(附GDScript代码)

任务

设计代码在地图上初始化一个随机点,随后坦克将向该点平滑移动并转向。

实现尝试

rotation - 全局变量,控制绕Y轴的旋转角度(弧度,范围-PI到+PI)。
global_position - 存储坦克全局坐标的全局变量。
velocity - 坦克移动向量,本案例中始终向上,通过rotate()方法进行旋转。

func _find_random_point():
     var _random_point = Vector2(randf_range(0, 500), randf_range(0, 500))
     # 设置地图上随机点的坐标
     return _random_point

var target_position = _find_random_point() # 将坐标赋值给变量

func _rad_to_rad(rad):
    if rad > PI:
        return PI - rad
    elif rad < -PI:
        return rad - PI
    else:
        return rad

func _abs_rad(rad):
    if rad < 0:
        return PI + (PI - abs(rad))
    else:
        return rad

func _abs_rotation(rad): 
    if rad > 0 and rad < PI / 2:
        return 2*PI + rad
    else:
        return rad

func move_to_random_point(delta):
    # 计算指向目标的向量并转换为弧度角度
    var direction = (target_position - global_position).normalized().angle()
    # 计算到目标的距离
    var distance = global_position.distance_to(target_position)
    # 用于显示目标点的代码
    var a = TRUCK_TRACES.instantiate()
    a.global_position = target_position
    a.top_level = true
    add_child(a)
    a = TRUCK_TRACES.instantiate()
    a.global_position = Vector2(target_position.x, target_position.y + 10)
    a.top_level = true
    add_child(a)

    if not moving:
        moving = true
        timer_for_turn.wait_time = 0.01
        timer_for_turn.start()
    else:
        if _rad_to_rad(direction + PI / 2) < 0:
            direction = PI-0.1
                
        if time_out_for_turn == true:
            time_out_for_turn = false

        # 尝试让旋转角度与目标向量对齐
            if _abs_rotation(_abs_rad(rotation)) < _abs_rad(direction + PI / 2):
                rotation += rotation_speed * delta 
            elif _abs_rotation(_abs_rad(rotation)) > _abs_rad(direction + PI / 2):
                rotation -= rotation_speed * delta
            
            

    if global_position.distance_to(target_position) < 100:
        moving = false
        target_position = _find_random_point()

    velocity = -Vector2(0, max_speed)
    velocity = velocity.rotated(rotation)
    #print(velocity.angle())
    #print(rotation)
    move_and_slide()

我试过用各种方式对比旋转角度和目标角度,通过大小判断来调整旋转量。
我尝试通过相对目标增加或减少旋转角度来实现转向,但当目标位于坦克正垂直方向时,坦克会出现锯齿状偏离目标的移动。

内容的提问来源于stack exchange,提问作者Cat met

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:02:30