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(delta); } public void ProcessOnBump(Node2D body) { GD.Print(body); } public void ProcessOnMovement() { } public void Start(Vector2 position) { Position = position; Show(); GetNode("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(double delta) { if (LinearVelocity.Length() > 0 && !Sleeping) { if (!Moving) { Moving = true; EmitSignal(SignalName.Move); } } if (Moving) { ProcessOnMovement(); Vector2 Scroll = -LinearVelocity / 100; Sprite2D sprite = (Sprite2D)GetNode("Sprite2D"); ShaderMaterial material = (ShaderMaterial)sprite.Material; float CurrentScrollX = (float)material.GetShaderParameter("scroll_x"); material.SetShaderParameter("scroll_x", (CurrentScrollX + Scroll.X * (float)delta) % 1.0f); float CurrentScrollY = (float)material.GetShaderParameter("scroll_y"); material.SetShaderParameter("scroll_y", (CurrentScrollY + Scroll.Y * (float)delta) % 1.0f); 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); } } }