0

我正在寻找一个精灵(更具体地说是子弹),通过单击鼠标左键从另一个精灵(枪的末端)中出来,然后让子弹朝鼠标所在的方向移动,然后在点击发生后不改变位置。我解释得很糟糕,但基本上我正在寻找子弹去鼠标的方向,一旦点击,就不会改变位置并跟随那个方向直到它离开屏幕。我正在尝试做的一个很好的例子是射击和子弹在一个名为 Terraria 的游戏中是如何工作的。

我一直在尝试使用 Position2D 来解决这个问题。我在枪的末端有 Position2D,我想把子弹装进去。我也尝试通过谷歌和 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
4

1 回答 1

1

您需要在实例之前为方向设置一个变量,并且在调用_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

结果 :

在此处输入图像描述

于 2019-10-22T16:11:06.397 回答