Как заставить спрайт двигаться в направлении, зависящем от положения мыши? - PullRequest
0 голосов
/ 17 октября 2019

Я ищу спрайт (пуля, если быть более точным), чтобы выйти из другого спрайта (конца пистолета), щелкнув левой кнопкой мыши, и затем пуля пошла в направлении, гдемышь была, а потом не менялась положение после того, как щелчок произошел. Я объяснил это довольно плохо, но в основном я ищу пулю, чтобы двигаться в направлении мыши, и один раз щелкнул, чтобы не изменить положение и следовать в этом направлении, пока он не исчезнет с экрана. Хороший пример того, что я пытаюсь сделать, - это как стрельба и пули работают в игре под названием Terraria.

Я пытался выяснить это с помощью Position2D. У меня есть Position2D в конце пистолета, где я хочу, чтобы пуля загрузилась. Я также пытался исследовать через Google и Youtube. Прямо сейчас у меня есть спрайт (рука), который вращается в зависимости от положения мыши, и спрайт (пистолет), прикрепленный к руке. Я пытаюсь использовать информацию о руке, чтобы найти направление, но я не могу понять это. Я начинающий с кодирования в целом.

Это код для моей руки, который вращается в зависимости от положения мыши:

extends Sprite
var Mouse_Position


func _process(delta):
    Mouse_Position = get_local_mouse_position()
    rotation += Mouse_Position.angle()*0.2  

Код в настоящее время для моей пули:

extends Area2D

const SPEED = 100
var velocity = Vector2()

var Mouse_Position




func _physics_process(delta):
    velocity.x = SPEED * delta
    Mouse_Position = get_local_mouse_position()
    rotation += Mouse_Position.angle()*0.2
    translate(velocity)

func _on_VisibilityNotifier2D_screen_exited():
    queue_free()


Также здесь некоторые дополнительныедля загрузки в:

const BULLET = preload("res://Bullet.tscn")

    if Input.is_action_just_pressed("shoot"):

        var bullet = BULLET.instance()
        get_parent().add_child(bullet)
        bullet.position = $Position2D.global_position

1 Ответ

0 голосов
/ 22 октября 2019

Вам нужно установить переменную для направления перед экземпляром и не изменять его при вызове функции _process :

Примерно так:

extends Area2D

const SPEED = 100
var velocity = Vector2()
export (int) var dir # <--- Add this variable to modify the direction of the bullet from outside of the scene
var Mouse_Position


func _physics_process(delta):
   $Sprite.position += Vector2(SPEED * delta, 0.0).rotated(dir)
   $Sprite.global_rotation = dir  # Set the rotation of the Bullet


func _on_VisibilityNotifier2D_screen_exited():
    queue_free()

И когда вы запускаете пулю:

var bullet = BULLET.instance()
bullet.dir = $Sprite.global_rotation # <-- Assgin the rotation of the player to the bullet
get_parent().add_child(bullet)
bullet.position = $Sprite/Position2D.global_position # <-- Start the Bullet on the position2D

Результат:

enter image description here

...