using System; using Syntriax.Engine.Core; using Syntriax.Engine.Physics2D; using Syntriax.Engine.Physics2D.Abstract; namespace Pong.Behaviours; public class MovementBallBehaviour : BehaviourOverride { public Vector2D StartDirection { get; private set; } = Vector2D.Zero; public float Speed { get; set; } = 500f; public float SpeedUpMultiplier { get; set; } = .0125f; private IRigidBody2D rigidBody = null!; protected override void OnFirstActiveFrame() { if (!BehaviourController.TryGetBehaviour(out IRigidBody2D? foundRigidBody)) throw new Exception($"{nameof(IRigidBody2D)} is missing on {GameObject.Name}."); if (!BehaviourController.TryGetBehaviour(out ICollider2D? foundCollider)) throw new Exception($"{nameof(ICollider2D)} is missing on {GameObject.Name}."); foundRigidBody.Velocity = StartDirection * Speed; foundCollider.OnCollisionDetected += OnCollisionDetected; rigidBody = foundRigidBody; } protected override void OnUpdate() { if (rigidBody.Velocity.MagnitudeSquared <= 0.01f) return; Vector2D speedUp = rigidBody.Velocity.Normalized * Time.DeltaTimeFrame; rigidBody.Velocity += speedUp * SpeedUpMultiplier; } private void OnCollisionDetected(ICollider2D collider2D, CollisionDetectionInformation information) { if (Syntriax.Engine.Core.Math.Abs(information.Normal.Dot(Vector2D.Right)) > .25) rigidBody.Velocity = information.Left.Transform.Position.FromTo(information.Right.Transform.Position).Normalized * rigidBody.Velocity.Magnitude; else rigidBody.Velocity = rigidBody.Velocity.Reflect(information.Normal); } public MovementBallBehaviour() { } public MovementBallBehaviour(Vector2D startDirection, float speed) { StartDirection = Vector2D.Normalize(startDirection); Speed = speed; } }