Остановка движения спрайта, если он находится в той же позиции, что и мышь - PullRequest
3 голосов
/ 12 марта 2019

Я пытаюсь остановить остановку спрайта, когда 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`

Ответы [ 2 ]

1 голос
/ 18 марта 2019

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

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

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

.

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

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

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

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

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

move_vec = look_vec

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

1 голос
/ 12 марта 2019

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

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

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

if move_vec != look_vec:
    ...
else:
    move_and_collide(0)
...