Engine-Pong/Shared/Behaviours/BallBehaviour.cs

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;
}