Files
hotdesking/Gameplay/Marble.cs
2025-07-08 18:02:01 -04:00

182 lines
3.3 KiB
C#

using Godot;
using System;
public partial class Marble : RigidBody2D
{
// Don't forget to rebuild the project so the editor knows about the new signal.
[Signal]
public delegate void HitEventHandler();
[Signal]
public delegate void HoverEventHandler();
[Signal]
public delegate void HoverFalseEventHandler();
[Signal]
public delegate void SelectEventHandler();
[Signal]
public delegate void SelectFalseEventHandler();
[Signal]
public delegate void AimEventHandler();
[Signal]
public delegate void AimFalseEventHandler();
[Signal]
public delegate void LaunchEventHandler();
[Signal]
public delegate void MoveEventHandler();
[Signal]
public delegate void StopEventHandler();
[Export]
public int Speed { get; set; } = 400; // How fast the player will move (pixels/sec).
public bool Hovered = false, Selected = false, Aimed = false, Launched = false, Moving = false;
public Vector2 Force = Vector2.Zero, Velocity = Vector2.Zero;
public Vector2 ScreenSize; // Size of the game window.
public override void _Ready()
{
ScreenSize = GetViewportRect().Size;
//Hide();
}
public override void _PhysicsProcess(double delta) //THIS IS LIKE THE UPDATE FUNCTION
{
TrySelect();
TryAim();
TryLaunch();
TryMovement();
}
public void ProcessOnBump(Node2D body)
{
GD.Print(body);
}
public void ProcessOnMovement()
{
}
public void Start(Vector2 position)
{
Position = position;
Show();
GetNode<CollisionShape2D>("CollisionShape2D").Disabled = false;
}
public void TryAim()
{
if (Selected && Input.IsActionPressed("left_click") && !Hovered && !Aimed)
{
Aimed = true;
EmitSignal(SignalName.Aim);
}
if (Aimed)
{
Vector2 mousePosition = GetGlobalMousePosition();
Force = Position - mousePosition;
if (!Input.IsActionPressed("left_click"))
{
if (!Hovered)
{
Launched = true;
EmitSignal(SignalName.SelectFalse);
}
else
{
Aimed = false;
EmitSignal(SignalName.AimFalse);
}
}
}
}
public void TryLaunch()
{
if (Aimed && Input.IsActionJustReleased("left_click"))
{
Selected = false;
EmitSignal(SignalName.SelectFalse);
Aimed = false;
EmitSignal(SignalName.AimFalse);
Launched = true;
EmitSignal(SignalName.Launch);
ApplyCentralForce(Force * Speed);
Force = Vector2.Zero;
}
}
public void TryMovement()
{
if (LinearVelocity.Length() > 0 && !Sleeping)
{
if (!Moving)
{
Moving = true;
EmitSignal(SignalName.Move);
}
}
if (Moving)
{
ProcessOnMovement();
if (Sleeping)
{
Moving = false;
EmitSignal(SignalName.Stop);
}
}
}
public void TrySelect()
{
if (Hovered)
{
if (Input.IsActionJustPressed("left_click") && !Selected)
{
Selected = true;
EmitSignal(SignalName.Select);
}
}
if (Selected)
{
if (!Hovered)
{
if (Input.IsActionJustPressed("left_click") && Selected)
{
Selected = false;
EmitSignal(SignalName.SelectFalse);
}
}
}
}
private void OnMouseEntered()
{
Hovered = true;
EmitSignal(SignalName.Hover);
}
private void OnMouseExited()
{
Hovered = false;
EmitSignal(SignalName.HoverFalse);
}
private void OnBodyEntered(Node2D body)
{
if (body.GetType() == typeof(Marble))
{
Marble marble = (Marble)body;
ProcessOnBump(marble);
marble.ProcessOnBump(this);
}
}
}