我正在开发这个宠物系统。它会朝角色的方向移动,当进入“他们的领域”时,它会在其周围随机移动。问题是宠物的物体会变得“颤抖”,就像物体与其他物体碰撞时一样。我能做什么?
我的代码
extends Node2D
var is_active = false
var move_speed = 90.0
var follow_distance = 90.0
var random_move_timer = 0.0
var random_direction = Vector2()
var random_move_interval = 1.0
var player = null
func random_move(delta):
random_move_timer += delta
if random_move_timer >= random_move_interval:
random_move_timer = 0.0
random_direction = Vector2(randf_range(-1, 1), randf_range(-1, 1)).normalized()
global_position += random_direction * move_speed * delta
func move_towards_player(delta):
if player:
var direction = player.global_position - global_position
var distance = direction.length()
if distance > 0:
direction = direction.normalized()
var speed_factor = clamp(distance / 100.0, 1.0, 3.0)
if distance > 0.5:
global_position += direction * move_speed * speed_factor * delta
func toggle_active(player_node):
is_active = !is_active
if is_active:
player = player_node
show()
else:
player = null
hide()
func update_depth():
if player:
if global_position.y < player.global_position.y:
z_index = -1
else:
z_index = 1
func _process(delta):
if is_active and player:
var distance = global_position.distance_to(player.global_position)
if distance > follow_distance:
move_towards_player(delta)
else:
random_move(delta)
update_depth()
您的代码存在一些问题。事情是这样的:
宠物朝玩家移动,直到达到距离限制(代码中为 90 像素)
在第一秒,random_move()被调用,但random_direction是(0, 0),所以宠物不会移动(除了由于浮点精度而可能出现一些晃动)。这种情况只发生在第一秒,所以这不是主要问题:您可以将此初始化 random_direction 修复为随机向量(标准化)。
接下来会发生什么,你会得到一个不是 (0, 0) 的 random_direction,它可能指向玩家或远离玩家。
3.a) 如果宠物向玩家移动,这会正常工作:宠物靠近并且没有晃动
3.b) 如果宠物远离玩家,则摇晃发生的地方是:
它不会正好是朝向玩家 1 帧和远离玩家 1 帧,但结果是相同的:如果您在玩家周围添加一个半径与距离限制相同的圆圈,您会看到宠物正在摇晃移动并出圈。
你可以做的是:添加一个布尔标志,表示宠物应该使用 random_move 并在计时器到期时重置它;然后当你检查距离时,还要检查标志是否为假。这样,您将在宠物再次开始走向玩家之前完成随机移动。
if distance > follow_distance && not random_move_in_progress:
move_towards_player(delta)
else:
random_move(delta)
您还需要在启动 random_move 时将标志设置为 true,并在计时器到期后将其恢复为 false。