207 lines
4.3 KiB
C#
207 lines
4.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 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(Marble marble);
|
|
[Signal]
|
|
public delegate void DefenseDownEventHandler(int damage);
|
|
|
|
[Export]
|
|
public bool Holding = false, Placed = false, Hovered = false, Selected = false, Aimed = false, Launched = false, Moving = false;
|
|
[Export]
|
|
public int Defense = 10, Speed = 400;
|
|
[Export]
|
|
public Vector2 Force = Vector2.Zero, Velocity = Vector2.Zero;
|
|
[Export]
|
|
public Vector2 ScreenSize; // Size of the game window.
|
|
|
|
public int _defenseMax;
|
|
|
|
public override void _Ready()
|
|
{
|
|
ScreenSize = GetViewportRect().Size;
|
|
_defenseMax = Defense;
|
|
|
|
//Hide();
|
|
}
|
|
|
|
public override void _PhysicsProcess(double delta) //THIS IS LIKE THE UPDATE FUNCTION
|
|
{
|
|
if (Placed)
|
|
{
|
|
TrySelect();
|
|
TryAim();
|
|
TryLaunch();
|
|
TryMovement(delta);
|
|
}
|
|
else if (Holding)
|
|
{
|
|
GetNode<CollisionShape2D>("Bounds").Disabled = true;
|
|
Position = GetGlobalMousePosition();
|
|
if (Input.IsActionJustReleased("left_click"))
|
|
{
|
|
Start(Position);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void DefenseChange(int change)
|
|
{
|
|
Defense += change;
|
|
if (Defense < 0)
|
|
{
|
|
EmitSignal(SignalName.DefenseDown, Defense); // 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;
|
|
//Rotation = Force.Angle() - 180; // if i want to implement this i need to work out the shader to accept rotation
|
|
|
|
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(Marble))
|
|
{
|
|
EmitSignal(SignalName.BumpMarble, (Marble)body);
|
|
}
|
|
}
|
|
}
|