Files
hotdesking/Gameplay/Ball.cs
cojoedmo 9057a21613 7-10-25 11:32am7-10-25 11:32am7-10-25 11:32am7-10-25 11:32am7-10-25
11:32am7-10-25 11:32am7-10-25 11:32am7-10-25 11:32am7-10-25
11:32am7-10-25 11:32am
2025-07-10 11:31:52 -04:00

210 lines
4.2 KiB
C#

using Godot;
using System;
public partial class Ball : RigidBody2D
{
[Signal]
public delegate void HoverEventHandler(bool tf = true);
[Signal]
public delegate void SelectEventHandler(bool tf = true);
[Signal]
public delegate void AimEventHandler(bool tf = true);
[Signal]
public delegate void LaunchEventHandler(bool tf = true);
[Signal]
public delegate void MoveEventHandler(bool tf = true);
[Signal]
public delegate void BumpMarbleEventHandler(Ball ball);
[Signal]
public delegate void DefenseDownEventHandler(int damage);
public bool _holding, _placed, _hovered, _selected, _aimed, _launched, _moving;
public int _defense, _defenseMax, _speed;
public Vector2 _force, _velocity, _screenSize;
public override void _Ready()
{
_holding = false;
_placed = false;
_hovered = false;
_selected = false;
_aimed = false;
_launched = false;
_moving = false;
_defense = 10;
_defenseMax = _defense;
_speed = 400;
_force = new Vector2(0,0);
_velocity = new Vector2(0,0);
_screenSize = GetViewportRect().Size;
Hide();
}
public override void _PhysicsProcess(double delta) //THIS IS LIKE THE UPDATE FUNCTION
{
Rotation = 0;
if (_placed)
{
TrySelect();
TryAim();
TryLaunch();
TryMovement(delta);
}
else if (_holding)
{
//GetNode<CollisionShape2D>("Bounds").Disabled = true;
Vector2 mousePosition = GetGlobalMousePosition();
if (Input.IsActionJustReleased("left_click"))
{
Start(mousePosition);
}
}
}
public void DefenseChange(int change)
{
_defense += change;
if (_defense < 0)
{
EmitSignal(SignalName.DefenseDown); // transfer damage over 0 to player
_defense = 0; // set defense back to 0
}
}
public void Start(Vector2 position)
{
_holding = false;
_placed = true;
Position = position;
Show();
GetNode<CollisionShape2D>("Bounds").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.Select, false);
}
else
{
_aimed = false;
EmitSignal(SignalName.Aim, false);
}
}
}
}
public void TryLaunch()
{
if (_aimed && Input.IsActionJustReleased("left_click"))
{
_selected = false;
EmitSignal(SignalName.Select, false);
_aimed = false;
EmitSignal(SignalName.Aim, false);
_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)
{
//Vector2 Scroll = -LinearVelocity / 100;
//
//Sprite2D sprite = (Sprite2D)GetNode("Texture");
//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)
{
_launched = false;
_moving = false;
EmitSignal(SignalName.Move, false);
}
}
}
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.Select, false);
}
}
}
}
private void OnMouseEntered()
{
_hovered = true;
EmitSignal(SignalName.Hover);
}
private void OnMouseExited()
{
_hovered = false;
EmitSignal(SignalName.Hover, false);
}
private void OnBodyEntered(Node2D body)
{
if (body.GetType() == typeof(Ball))
{
EmitSignal(SignalName.BumpMarble, (Ball)body);
}
}
}