坦克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
相关产品推荐
相关产品推荐

