54 lines
1.3 KiB
C#
54 lines
1.3 KiB
C#
|
using System;
|
||
|
using Godot;
|
||
|
|
||
|
public partial class ArrowThrower : Node2D
|
||
|
{
|
||
|
[Export] public Node2D ArrowsNode;
|
||
|
|
||
|
private bool isAiming = false;
|
||
|
private Vector2 initialPosition;
|
||
|
|
||
|
private PackedScene arrowRef = null;
|
||
|
private RigidBody2D arrow = null;
|
||
|
|
||
|
// Called when the node enters the scene tree for the first time.
|
||
|
public override void _Ready()
|
||
|
{
|
||
|
arrowRef = GD.Load<PackedScene>("res://Scenes/Entities/arrow.tscn");
|
||
|
|
||
|
MouseInput mouseInput = FindParent("Mouse Input") as MouseInput;
|
||
|
mouseInput.OnMouseDown += OnMouseDown;
|
||
|
mouseInput.OnMouseUp += OnMouseUp;
|
||
|
}
|
||
|
|
||
|
private void OnMouseUp()
|
||
|
{
|
||
|
isAiming = false;
|
||
|
Vector2 direction = (initialPosition - GetGlobalMousePosition()).Normalized();
|
||
|
Vector2 vector2 = GetGlobalMousePosition() - initialPosition;
|
||
|
arrow.Rotation = Mathf.Atan2(-vector2.X, vector2.Y);
|
||
|
arrow.LinearVelocity = direction * 500f;
|
||
|
}
|
||
|
|
||
|
private void OnMouseDown()
|
||
|
{
|
||
|
isAiming = true;
|
||
|
initialPosition = GetGlobalMousePosition();
|
||
|
|
||
|
arrow = arrowRef.Instantiate() as RigidBody2D;
|
||
|
|
||
|
ArrowsNode.AddChild(arrow);
|
||
|
arrow.GlobalPosition = initialPosition;
|
||
|
}
|
||
|
|
||
|
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
||
|
public override void _Process(double delta)
|
||
|
{
|
||
|
if (!isAiming)
|
||
|
return;
|
||
|
|
||
|
Vector2 vector2 = GetGlobalMousePosition() - initialPosition;
|
||
|
arrow.Rotation = Mathf.Atan2(-vector2.X, vector2.Y);
|
||
|
}
|
||
|
}
|