2023-11-27 12:00:25 +03:00
|
|
|
using System;
|
2024-01-28 15:44:20 +03:00
|
|
|
|
2023-11-27 12:00:25 +03:00
|
|
|
using Syntriax.Engine.Core;
|
2024-01-27 21:50:28 +03:00
|
|
|
using Syntriax.Engine.Physics2D;
|
2023-12-04 14:06:52 +03:00
|
|
|
using Syntriax.Engine.Physics2D.Abstract;
|
2023-11-27 12:00:25 +03:00
|
|
|
|
|
|
|
namespace Pong.Behaviours;
|
2024-01-28 15:44:20 +03:00
|
|
|
public class MovementBallBehaviour : BehaviourOverride
|
2023-11-27 12:00:25 +03:00
|
|
|
{
|
2024-01-28 15:44:20 +03:00
|
|
|
public Vector2D StartDirection { get; private set; } = Vector2D.Zero;
|
|
|
|
public float Speed { get; set; } = 500f;
|
2023-11-27 12:00:25 +03:00
|
|
|
|
2024-01-27 21:50:28 +03:00
|
|
|
private IRigidBody2D rigidBody = null!;
|
|
|
|
|
2024-01-28 15:44:20 +03:00
|
|
|
public MovementBallBehaviour(Vector2D startDirection, float speed)
|
|
|
|
{
|
|
|
|
StartDirection = Vector2D.Normalize(startDirection);
|
|
|
|
Speed = speed;
|
|
|
|
}
|
|
|
|
public MovementBallBehaviour() { }
|
|
|
|
|
2024-01-23 12:16:58 +03:00
|
|
|
protected override void OnFirstActiveFrame()
|
2023-11-27 12:00:25 +03:00
|
|
|
{
|
2024-01-27 21:50:28 +03:00
|
|
|
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;
|
2023-12-04 14:06:52 +03:00
|
|
|
|
2024-01-27 21:50:28 +03:00
|
|
|
rigidBody = foundRigidBody;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnCollisionDetected(ICollider2D collider2D, CollisionDetectionInformation information)
|
|
|
|
{
|
|
|
|
rigidBody.Velocity = rigidBody.Velocity.Reflect(information.Normal);
|
2023-11-27 12:00:25 +03:00
|
|
|
}
|
|
|
|
}
|