50 lines
1.5 KiB
C#
50 lines
1.5 KiB
C#
using Syntriax.Engine.Core;
|
|
using Syntriax.Engine.Physics2D;
|
|
|
|
namespace Pong.Behaviours;
|
|
|
|
public class BallBehaviour : Behaviour2D
|
|
{
|
|
public float Speed { get; set; } = 500f;
|
|
public float SpeedUpMultiplier { get; set; } = .0125f;
|
|
|
|
public IRigidBody2D rigidBody = null!;
|
|
|
|
protected override void OnFirstActiveFrame()
|
|
{
|
|
BehaviourController.GetRequiredBehaviour<ICollider2D>().OnCollisionDetected += OnCollisionDetected;
|
|
rigidBody = BehaviourController.GetRequiredBehaviour<IRigidBody2D>();
|
|
}
|
|
|
|
public void LaunchBall(Vector2D launchDirection)
|
|
{
|
|
rigidBody.Velocity = launchDirection * Speed;
|
|
}
|
|
|
|
public void ResetBall()
|
|
{
|
|
Transform.Position = Vector2D.Zero;
|
|
rigidBody.Velocity = Vector2D.Zero;
|
|
}
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
if (rigidBody.Velocity.MagnitudeSquared <= 0.01f)
|
|
return;
|
|
|
|
Vector2D speedUp = rigidBody.Velocity.Normalized * Universe.Time.DeltaTime;
|
|
rigidBody.Velocity += speedUp * SpeedUpMultiplier;
|
|
}
|
|
|
|
private void OnCollisionDetected(ICollider2D collider2D, CollisionDetectionInformation information)
|
|
{
|
|
if (Math.Abs(information.Normal.Dot(Vector2D.Right)) > .25)
|
|
rigidBody.Velocity = information.Detected.Transform.Position.FromTo(information.Detector.Transform.Position).Normalized * rigidBody.Velocity.Magnitude;
|
|
else
|
|
rigidBody.Velocity = rigidBody.Velocity.Reflect(information.Normal);
|
|
}
|
|
|
|
public BallBehaviour() { }
|
|
public BallBehaviour(float speed) => Speed = speed;
|
|
}
|