Ejemplo n.º 1
0
        private void NetworkGameStateUpdate()
        {
            var header = new SGameStateHeader(World.physicsFrameIter);

            states.Clear();
            //List<S_GameStateSlice> states = new List<S_GameStateSlice>();
            // TODO: big optimization candidate
            foreach (var ent in World.GetEntities())
            {
                if (ent is IPhysical phys)
                {
                    var newState = new SGameStateSlice {
                        EntityID  = phys.EntityID,
                        NextX     = phys.NextPosition.X,
                        NextY     = phys.NextPosition.Y,
                        VelocityX = phys.Velocity.X,
                        VelocityY = phys.Velocity.Y
                    };

                    // TODO: come up with better flag handler than this.
                    if (ent is Player plr)
                    {
                        newState.Flag0 = (byte)plr.Facing;
                        newState.Flag1 = (byte)plr.Looking;
                    }
                    states.Add(newState);
                }
            }
            SendToAll(header, states.ToArray());
        }
Ejemplo n.º 2
0
        private void OnGameStateUpdate(SGameStateHeader header, List <SGameStateSlice> slices)
        {
            int physicsFrame = World.physicsFrameIter;

            World.physicsFrameIter = header.PhysicsStep;

            // grab each entity in the world
            // and make a dataslice for their physical state
            // send the batch off to clients to process
            foreach (SGameStateSlice slice in slices)
            {
                if (World.HasEntity(slice.EntityID))
                {
                    IPhysical ent = World.GetEntity(slice.EntityID) as IPhysical;

                    // if state implements Position, make sure to add here
                    ent.NextPosition = new Vector2(slice.NextX, slice.NextY);
                    ent.Velocity     = new Vector2(slice.VelocityX, slice.VelocityY);

                    for (int i = header.PhysicsStep; i < physicsFrame; i++)
                    {
                        if (ent is Player player)
                        {
                            player.Facing  = (Facing)slice.Flag0;
                            player.Looking = (Looking)slice.Flag1;
                            if (player.EntityID == ourPID)
                            {
                                var input = InputHistory.Get(i);
                                player.MovingLeft  = input.Left;
                                player.MovingRight = input.Right;
                                player.Jumping     = input.Jump;
                                player.LookingDown = input.Down;
                                player.LookingUp   = input.Up;
                            }
                        }
                        World.ProcessEntityPhysics(ent, PhysicsProperties.PHYSICS_TIMESTEP);
                    }
                }
            }
        }