fix: ball sync issues caused by network lerp fixed
This commit is contained in:
parent
43875a6069
commit
648be2738f
@ -6,7 +6,8 @@ using Syntriax.Engine.Systems.Tween;
|
|||||||
namespace Pong.Behaviours;
|
namespace Pong.Behaviours;
|
||||||
|
|
||||||
public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INetworkEntity,
|
public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INetworkEntity,
|
||||||
IPacketListenerClient<BallBehaviour.BallUpdatePacket>
|
IPacketListenerClient<BallBehaviour.BallUpdatePacket>,
|
||||||
|
IPacketListenerClient<BallBehaviour.BallResetPacket>
|
||||||
{
|
{
|
||||||
public float Speed { get; set; } = 500f;
|
public float Speed { get; set; } = 500f;
|
||||||
public float SpeedUpMultiplier { get; set; } = .025f;
|
public float SpeedUpMultiplier { get; set; } = .025f;
|
||||||
@ -16,6 +17,7 @@ public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INe
|
|||||||
private IPhysicsEngine2D physicsEngine2D = null!;
|
private IPhysicsEngine2D physicsEngine2D = null!;
|
||||||
private ITweenManager tweenManager = null!;
|
private ITweenManager tweenManager = null!;
|
||||||
private INetworkCommunicatorServer? networkServer = null;
|
private INetworkCommunicatorServer? networkServer = null;
|
||||||
|
private ITween? networkTween = null;
|
||||||
|
|
||||||
public void FirstActiveFrame()
|
public void FirstActiveFrame()
|
||||||
{
|
{
|
||||||
@ -35,8 +37,11 @@ public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INe
|
|||||||
|
|
||||||
public void ResetBall()
|
public void ResetBall()
|
||||||
{
|
{
|
||||||
|
if (networkTween is not null)
|
||||||
|
tweenManager.CancelTween(networkTween);
|
||||||
Transform.Position = Vector2D.Zero;
|
Transform.Position = Vector2D.Zero;
|
||||||
RigidBody.Velocity = Vector2D.Zero;
|
RigidBody.Velocity = Vector2D.Zero;
|
||||||
|
networkServer?.SendToClient("*", new BallResetPacket());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PhysicsUpdate(float delta)
|
public void PhysicsUpdate(float delta)
|
||||||
@ -60,13 +65,15 @@ public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INe
|
|||||||
public BallBehaviour() { }
|
public BallBehaviour() { }
|
||||||
public BallBehaviour(float speed) => Speed = speed;
|
public BallBehaviour(float speed) => Speed = speed;
|
||||||
|
|
||||||
|
void IPacketListenerClient<BallResetPacket>.OnClientPacketArrived(BallResetPacket packet) => ResetBall();
|
||||||
void IPacketListenerClient<BallUpdatePacket>.OnClientPacketArrived(BallUpdatePacket packet)
|
void IPacketListenerClient<BallUpdatePacket>.OnClientPacketArrived(BallUpdatePacket packet)
|
||||||
{
|
{
|
||||||
Transform.TweenPositionAdditive(tweenManager, .25f, Transform.Position.FromTo(packet.Position));
|
networkTween = Transform.TweenPositionAdditive(tweenManager, .25f, Transform.Position.FromTo(packet.Position));
|
||||||
RigidBody.Velocity = packet.Velocity;
|
RigidBody.Velocity = packet.Velocity;
|
||||||
physicsEngine2D.StepIndividual(RigidBody, new System.DateTime(System.DateTime.UtcNow.Ticks - packet.Timestamp).Second);
|
physicsEngine2D.StepIndividual(RigidBody, new System.DateTime(System.DateTime.UtcNow.Ticks - packet.Timestamp).Second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class BallResetPacket : INetworkPacket;
|
||||||
private class BallUpdatePacket : INetworkPacket
|
private class BallUpdatePacket : INetworkPacket
|
||||||
{
|
{
|
||||||
public Vector2D Position { get; set; } = Vector2D.Zero;
|
public Vector2D Position { get; set; } = Vector2D.Zero;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user