Остановка движения спрайта, если он находится в том же положении, что и мышь

Я пытаюсь заставить спрайт перестать двигаться, когда он x и y такие же, как у мыши.

По какой-то причине, когда изображение оказывается в том же положении, что и мышь, изображение начинает очень быстро перемещаться вперед и назад по одной и той же оси. Мне нужно заставить его перестать двигаться.

func _physics_process(delta):
    var move_vec = Vector2()
    var look_vec = get_global_mouse_position() - global_position
    //this gets the mouse and sprite position

    if move_vec != look_vec: // if mouse and sprite are not the same then move.
        move_vec = look_vec
        move_vec = move_vec.normalized()
        move_and_collide(move_vec * speed * delta)
        global_rotation = atan2(look_vec.y, look_vec.x)
    else:
        pass`enter code here`

person dianesis    schedule 12.03.2019    source источник


Ответы (2)


Ах, это случилось со мной, когда я работал над разработкой игр с Unity.

Проблема в том, что вы слишком сильно переусердствуете.

Скажем, вы хотите перейти в позицию 0. Вы попадаете на такие позиции, как 0,00004, затем -0,0524, затем 0,00242.

По сути, вы колеблетесь около нуля, потому что он никогда не бывает равным.

Предлагаю вам попробовать что-то вроде:

if move_vec - look_vec > someMinValue || move_vec - look_vec < -someMinValue 

(это сравнение абсолютных значений)

В принципе, если оно находится в пределах некоторого небольшого значения, вы можете приказать игре расслабиться и принять это. Затем вы можете настроить значение, чтобы оно точно соответствовало желаемому значению:

move_vec = look_vec

Вероятно, вы можете придумать лучшие ответы. Здесь важно то, что вы понимаете, в чем проблема, и теперь можете исправить ее по своему желанию.

person Helsing    schedule 18.03.2019

Вам нужно установить скорость изображения равной 0 в инструкции else.

Изображение будет иметь остаточную скорость, так как оно ускорялось до того, как было наведено на нее указатель мыши. Установка скорости изображения на 0 остановит изображение в положении мыши, но убедитесь, что вы сделали это после применения ускорения, чтобы оно отменило его.

Я не уверен, что делает move_and_collide(...), но вы можете попробовать передать это 0 в инструкции else?

if move_vec != look_vec:
    ...
else:
    move_and_collide(0)
person TheChubbyPanda    schedule 12.03.2019