fix: paddles being knocked back by the ball collision

This commit is contained in:
Syntriax 2025-06-05 23:32:14 +03:00
parent a0a3d97395
commit b835fb1582
3 changed files with 17 additions and 21 deletions

2
Engine

@ -1 +1 @@
Subproject commit c7f63dc63870015ce136100289f1ace246870c90 Subproject commit fbdea47dc7768aea65fe6826020cc6dd79a0b711

View File

@ -9,7 +9,8 @@ using Syntriax.Engine.Systems.Input;
namespace Pong.Behaviours; namespace Pong.Behaviours;
public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Speed) : Behaviour2D, IFirstFrameUpdate, IPostPhysicsUpdate, public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Speed) : Behaviour2D,
IFirstFrameUpdate, IPhysicsIteration, IPostPhysicsUpdate,
IPacketListenerServer<PaddleBehaviour.PaddleKeyStatePacket>, IPacketListenerClient<PaddleBehaviour.PaddleKeyStatePacket> IPacketListenerServer<PaddleBehaviour.PaddleKeyStatePacket>, IPacketListenerClient<PaddleBehaviour.PaddleKeyStatePacket>
{ {
private Keys Up { get; } = Up; private Keys Up { get; } = Up;
@ -27,6 +28,14 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
private IRigidBody2D rigidBody = null!; private IRigidBody2D rigidBody = null!;
private IPhysicsEngine2D physicsEngine2D = null!; private IPhysicsEngine2D physicsEngine2D = null!;
public void PhysicsIterate(float delta)
{
if (isUpPressed)
rigidBody.Transform.Position += Vector2D.Up * Speed * delta;
else if (isDownPressed)
rigidBody.Transform.Position -= Vector2D.Up * Speed * delta;
}
public void PostPhysicsUpdate(float delta) public void PostPhysicsUpdate(float delta)
{ {
Transform.Position = new Vector2D(Transform.Position.X, MathF.Max(MathF.Min(Transform.Position.Y, High), Low)); Transform.Position = new Vector2D(Transform.Position.X, MathF.Max(MathF.Min(Transform.Position.Y, High), Low));
@ -56,26 +65,15 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
inputs.UnregisterOnRelease(Down, OnDownReleased); inputs.UnregisterOnRelease(Down, OnDownReleased);
} }
private void OnUpPressed(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args) { isUpPressed = true; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } private void OnUpPressed(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args) { isUpPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
private void OnUpReleased(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args) { isUpPressed = false; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } private void OnUpReleased(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args) { isUpPressed = false; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
private void OnDownPressed(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args) { isDownPressed = true; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } private void OnDownPressed(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args) { isDownPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
private void OnDownReleased(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args) { isDownPressed = false; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } private void OnDownReleased(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args) { isDownPressed = false; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
private void UpdateVelocity()
{
if (isUpPressed)
rigidBody.Velocity = Vector2D.Up * Speed;
else if (isDownPressed)
rigidBody.Velocity = -Vector2D.Up * Speed;
else
rigidBody.Velocity = Vector2D.Zero;
}
public void OnServerPacketArrived(string sender, PaddleKeyStatePacket packet) public void OnServerPacketArrived(string sender, PaddleKeyStatePacket packet)
{ {
isUpPressed = packet.IsUpPressed; isUpPressed = packet.IsUpPressed;
isDownPressed = packet.IsDownPressed; isDownPressed = packet.IsDownPressed;
UpdateVelocity();
networkServer?.SendToClient("*", new PaddleKeyStatePacket(this)); networkServer?.SendToClient("*", new PaddleKeyStatePacket(this));
} }
@ -86,8 +84,6 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
isDownPressed = packet.IsDownPressed; isDownPressed = packet.IsDownPressed;
Transform.Position = packet.Position; Transform.Position = packet.Position;
UpdateVelocity();
physicsEngine2D.StepIndividual(rigidBody, new DateTime(DateTime.UtcNow.Ticks - packet.Timestamp).Second); physicsEngine2D.StepIndividual(rigidBody, new DateTime(DateTime.UtcNow.Ticks - packet.Timestamp).Second);
} }

View File

@ -77,7 +77,7 @@ public class GamePong : MonoGameWindow
IUniverseObject leftPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Left Paddle"); IUniverseObject leftPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Left Paddle");
leftPaddle.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(-468f, 0f), scale: new Vector2D(15f, 60f)) leftPaddle.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(-468f, 0f), scale: new Vector2D(15f, 60f))
.BehaviourController.AddBehaviour<ShapeBehaviour>(Shape2D.Square) .BehaviourController.AddBehaviour<ShapeBehaviour>(Shape2D.Square)
.BehaviourController.AddBehaviour<RigidBody2D>(); .BehaviourController.AddBehaviour<RigidBody2D>().IsStatic = true;
PaddleBehaviour leftPaddleBehaviour = BehaviourFactory.Instantiate<PaddleBehaviour>(Keys.W, Keys.S, 228f, -228f, 400f); PaddleBehaviour leftPaddleBehaviour = BehaviourFactory.Instantiate<PaddleBehaviour>(Keys.W, Keys.S, 228f, -228f, 400f);
leftPaddleBehaviour.Id = "lp"; leftPaddleBehaviour.Id = "lp";
leftPaddle.BehaviourController.AddBehaviour(leftPaddleBehaviour); leftPaddle.BehaviourController.AddBehaviour(leftPaddleBehaviour);
@ -86,7 +86,7 @@ public class GamePong : MonoGameWindow
IUniverseObject rightPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Right Paddle"); IUniverseObject rightPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Right Paddle");
rightPaddle.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(468f, 0f), scale: new Vector2D(15f, 60f)) rightPaddle.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(468f, 0f), scale: new Vector2D(15f, 60f))
.BehaviourController.AddBehaviour<ShapeBehaviour>(Shape2D.Square) .BehaviourController.AddBehaviour<ShapeBehaviour>(Shape2D.Square)
.BehaviourController.AddBehaviour<RigidBody2D>(); .BehaviourController.AddBehaviour<RigidBody2D>().IsStatic = true;
PaddleBehaviour rightPaddleBehaviour = BehaviourFactory.Instantiate<PaddleBehaviour>(Keys.Up, Keys.Down, 228f, -228f, 400f); PaddleBehaviour rightPaddleBehaviour = BehaviourFactory.Instantiate<PaddleBehaviour>(Keys.Up, Keys.Down, 228f, -228f, 400f);
rightPaddleBehaviour.Id = "rp"; rightPaddleBehaviour.Id = "rp";
rightPaddle.BehaviourController.AddBehaviour(rightPaddleBehaviour); rightPaddle.BehaviourController.AddBehaviour(rightPaddleBehaviour);