Godot 4.3 - 2D 对象移动问题:宠物跟随玩家和随机移动行为

问题描述 投票:0回答:1

我正在开发这个宠物系统。它会朝角色的方向移动,当进入“他们的领域”时,它会在其周围随机移动。问题是宠物的物体会变得“颤抖”,就像物体与其他物体碰撞时一样。我能做什么?

我的代码

    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()
game-development godot
1个回答
0
投票

您的代码存在一些问题。事情是这样的:

  1. 宠物朝玩家移动,直到达到距离限制(代码中为 90 像素)

  2. 在第一秒,random_move()被调用,但random_direction是(0, 0),所以宠物不会移动(除了由于浮点精度而可能出现一些晃动)。这种情况只发生在第一秒,所以这不是主要问题:您可以将此初始化 random_direction 修复为随机向量(标准化)。

  3. 接下来会发生什么,你会得到一个不是 (0, 0) 的 random_direction,它可能指向玩家或远离玩家。

3.a) 如果宠物向玩家移动,这会正常工作:宠物靠近并且没有晃动

3.b) 如果宠物远离玩家,则摇晃发生的地方是:

  • 宠物远离玩家几个像素
  • 在下一帧,距离现在大于 90,因此将执行将宠物移向玩家的代码
  • 下一帧:现在您再次距离玩家更近,因此宠物再次开始移动(在相同的 random_direction 上,因为 random_move_timer 尚未达到 1)
  • 等等远离并靠近玩家

它不会正好是朝向玩家 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。

© www.soinside.com 2019 - 2024. All rights reserved.