using System; using LiteNetLib.Utils; using Microsoft.Xna.Framework.Input; using Syntriax.Engine.Core; using Syntriax.Engine.Input; using Syntriax.Engine.Network; using Syntriax.Engine.Network.Abstract; namespace Pong.Behaviours; public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Speed) : NetworkBehaviour { private Keys Up { get; } = Up; private Keys Down { get; } = Down; public float High { get; } = High; public float Low { get; } = Low; public float Speed { get; set; } = Speed; private bool isUpPressed = false; private bool isDownPressed = false; private IButtonInputs inputs = null!; protected override void OnUpdate() { if (isUpPressed && isDownPressed) return; if (isUpPressed) Move(Vector2D.Up); else if (isDownPressed) Move(-Vector2D.Up); } private void Move(Vector2D vectorToMove) { GameObject.Transform.Position = GameObject.Transform.Position + vectorToMove * (float)Time.Elapsed.TotalSeconds * Speed; GameObject.Transform.Position = new Vector2D(GameObject.Transform.Position.X, MathF.Max(MathF.Min(GameObject.Transform.Position.Y, High), Low)); } protected override void OnFirstActiveFrame() { if (!BehaviourController.TryGetBehaviour>(out var behaviourResult)) inputs = behaviourResult ?? BehaviourController.AddBehaviour(); inputs.RegisterOnPress(Up, OnUpPressed); inputs.RegisterOnRelease(Up, OnUpReleased); inputs.RegisterOnPress(Down, OnDownPressed); inputs.RegisterOnRelease(Down, OnDownReleased); } protected override void OnFinalize() { inputs.UnregisterOnPress(Up, OnUpPressed); inputs.UnregisterOnRelease(Up, OnUpReleased); inputs.UnregisterOnPress(Down, OnDownPressed); inputs.UnregisterOnRelease(Down, OnDownReleased); } private void OnUpPressed(IButtonInputs inputs, Keys keys) { isUpPressed = true; SendData(new PaddleInputs() { IsUpPressed = isUpPressed, IsDownPressed = isDownPressed, PositionY = Transform.Position.Y }); } private void OnUpReleased(IButtonInputs inputs, Keys keys) { isUpPressed = false; SendData(new PaddleInputs() { IsUpPressed = isUpPressed, IsDownPressed = isDownPressed, PositionY = Transform.Position.Y }); } private void OnDownPressed(IButtonInputs inputs, Keys keys) { isDownPressed = true; SendData(new PaddleInputs() { IsUpPressed = isUpPressed, IsDownPressed = isDownPressed, PositionY = Transform.Position.Y }); } private void OnDownReleased(IButtonInputs inputs, Keys keys) { isDownPressed = false; SendData(new PaddleInputs() { IsUpPressed = isUpPressed, IsDownPressed = isDownPressed, PositionY = Transform.Position.Y }); } public override void ReceiveData(T data) { if (data is not PaddleInputs paddleInputs) return; Transform.Position = new(Transform.Position.X, paddleInputs.PositionY); isUpPressed = paddleInputs.IsUpPressed; isDownPressed = paddleInputs.IsDownPressed; } [System.Serializable] public struct PaddleInputs : INetworkPacket { public float PositionY { get; set; } public bool IsUpPressed { get; set; } public bool IsDownPressed { get; set; } public void Deserialize(NetDataReader reader) { PositionY = reader.GetFloat(); IsUpPressed = reader.GetBool(); IsDownPressed = reader.GetBool(); } public void Serialize(NetDataWriter writer) { writer.Put(PositionY); writer.Put(IsUpPressed); writer.Put(IsDownPressed); } } }