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().OnCollisionDetected += OnCollisionDetected; rigidBody = BehaviourController.GetRequiredBehaviour(); } 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; }