Example #1
0
        /// <summary>
        /// Ticks up to real time
        /// </summary>
        private void TickRealtimeAsync(WorldPlayer player)
        {
            Task.Run(delegate()
            {
                //Catch up to the server whom is five ticks ahead approximatly
                for (int t = 0; t < 5; t++)
                {
                    this.Tick(player);

                    PhysicsUpdateEvent updateEvent = new PhysicsUpdateEvent()
                    {
                        Player = player
                    };

                    m_WorldConnection.RaiseEventAsync <PhysicsUpdateEvent>(updateEvent);
                }
            });
        }
Example #2
0
        /// <summary>
        /// Updates all players
        /// </summary>
        private void Update()
        {
            try
            {
                Stopwatch sw = Stopwatch.StartNew();
                while (m_Running)
                {
                    if (m_WorldConnection == null)
                    {
                        break;
                    }
                    else if (!m_WorldConnection.Connected)
                    {
                        break;
                    }

                    long frameStartTime = sw.ElapsedMilliseconds;
                    foreach (KeyValuePair <int, WorldPlayer> playerNode in m_WorldConnection.Players.GetDictionary())
                    {
                        this.Tick(playerNode.Value);

                        PhysicsUpdateEvent updateEvent = new PhysicsUpdateEvent()
                        {
                            Player = playerNode.Value
                        };

                        m_WorldConnection.RaiseEventAsync <PhysicsUpdateEvent>(updateEvent);
                    }

                    long frameEndTime = sw.ElapsedMilliseconds;
                    long waitTime     = MsPerTick - (frameEndTime - frameStartTime);
                    if (waitTime > 0)
                    {
                        Thread.Sleep((int)waitTime);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                //Thread is being aborted
            }
        }
Example #3
0
        public override void PhysicsUpdate(PhysicsUpdateEvent ev)
        {
            Stun -= ev.DeltaTime;
            if (Stun < 0f)
            {
                Stun = 0f;
            }

            bool left = Engine.Window.IsKeyDown(Keyboard.Key.Left) || Engine.Window.IsKeyDown(Keyboard.Key.A),
                right = Engine.Window.IsKeyDown(Keyboard.Key.Right) || Engine.Window.IsKeyDown(Keyboard.Key.D),
                up = Engine.Window.IsKeyDown(Keyboard.Key.Up) || Engine.Window.IsKeyDown(Keyboard.Key.W),
                action = Engine.Window.IsKeyDown(Keyboard.Key.Space) ||
                Engine.Window.IsKeyDown(Keyboard.Key.X) ||
                Engine.Window.IsKeyDown(Keyboard.Key.V) ||
                Engine.Window.IsKeyDown(Keyboard.Key.Z);

            if (!Enabled || Stun > 0f)
            {
                left = false;
                right = false;
                up = false;
                action = false;
            }

            if (IsOnGround)
            {
                if (left && !right)
                {
                    Speed.X -= 2400f * ev.DeltaTime;
                    LocalScale = new Vector2(-1f, 1f);
                }

                if (right && !left)
                {
                    Speed.X += 2400f * ev.DeltaTime;
                    LocalScale = new Vector2(1f, 1f);
                }

                if (action && !oldAction)
                {
                    if (currentSnap != null)
                    {
                        currentSnap.LocalCoord = WorldCoord + new Vector2(Size.X / 2f, Size.Y / 2f);
                        currentSnap.LocalCoord -= new Vector2(0f, currentSnap.Size.Y);
                        currentSnap.IsFlipped = LocalScale.X < 0f;
                        if (currentSnap.IsFlipped)
                            currentSnap.LocalCoord -= new Vector2(Size.X + currentSnap.Size.X, 0f);
                    }

                    Program.Cut.Play();
                    var snap = Scene.CreateObject<Snapshot>(null, Vector2.Zero, currentSnap, this);
                    currentSnap = snap;
                    currentSnap.LocalCoord = WorldCoord + new Vector2(Size.X / 2f, Size.Y / 2f);
                    currentSnap.LocalCoord -= new Vector2(0f, currentSnap.Size.Y);
                    currentSnap.IsFlipped = LocalScale.X < 0f;
                    if (currentSnap.IsFlipped)
                        currentSnap.LocalCoord -= new Vector2(Size.X + currentSnap.Size.X, 0f);
                }
            }
            else
            {
                if (left && !right)
                    Speed.X -= 240f * ev.DeltaTime;
                if (right && !left)
                    Speed.X += 240f * ev.DeltaTime;

                if (WorldCoord.Y - 200 > World.SolidsHeight)
                {
                    Engine.SceneHost.Pop();
                    Engine.SceneHost.Push(Engine.SceneHost.CreateGlobal<MainScene>());
                }
            }

            Speed.X = Mathf.Min(Mathf.Abs(Speed.X), 240f) * (Speed.X < 0f ? -1f : 1f);

            if ((left || right) && !(right && left))
                runTime += ev.DeltaTime;
            else
                runTime = 0f;

            if (!IsOnGround)
            {
                sprite.TextureRect = new Rectangle(new Vector2(textureSize.X, 0f), textureSize);
            }
            else if (runTime == 0f)
            {
                sprite.TextureRect = new Rectangle(Vector2.Zero, textureSize);
            }
            else
            {
                sprite.TextureRect = new Rectangle(new Vector2((2 + ((int)(runTime * 12f) % 6)) * textureSize.X, 0f), textureSize);
            }

            if (up && IsOnGround)
            {
                Speed.Y = -400f;
            }

            // Leaning
            if (Stun == 0f)
            {
                Angle angle;
                if (IsOnGround)
                {
                    var leftDist = DistanceToGround(-5, -2, 4);
                    var rightDist = DistanceToGround(5, -2, 4);
                    angle = Angle.FromVector(new Vector2(5f, rightDist) - new Vector2(-5f, leftDist));
                }
                else
                {
                    angle = new Angle(0f);
                }
                var deltaAngle = ((((angle.Degree - rotation.Degree) % 360f) + 540f) % 360f) - 180f;
                rotation += new Angle(deltaAngle * Mathf.Min(1f, ev.DeltaTime * 10f));
                if (LocalScale.X < 0f)
                    LocalRotation = -rotation;
                else
                    LocalRotation = rotation;
            }

            oldAction = action;

            base.PhysicsUpdate(ev);
        }
Example #4
0
        public virtual void PhysicsUpdate(PhysicsUpdateEvent ev)
        {
            World = ((MainScene)Scene).World;
            Speed.Y += Gravity * ev.DeltaTime;

            relPosAcc += Speed * ev.DeltaTime;

            while (Mathf.Abs(relPosAcc.X) >= 1f)
            {
                int sign = relPosAcc.X > 0f ? 1 : -1;
                if (IsFree(new Vector2(sign, 0f)))
                {
                    if (!IsFree(new Vector2(0f, 1f)) && IsFree(new Vector2(sign, 1f)))
                    {
                        if (!IsFree(new Vector2(sign, 2f)))
                            LocalCoord += new Vector2(0f, 1f);
                        else if (!IsFree(new Vector2(sign, 3f)))
                            LocalCoord += new Vector2(0f, 2f);
                    }
                    LocalCoord += new Vector2(sign, 0f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -1f)))
                {
                    LocalCoord += new Vector2(sign, -1f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -2f)))
                {
                    LocalCoord += new Vector2(sign, -2f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -3f)))
                {
                    LocalCoord += new Vector2(sign, -3f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -4f)))
                {
                    LocalCoord += new Vector2(sign, -4f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -5f)))
                {
                    LocalCoord += new Vector2(sign, -5f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -6f)))
                {
                    LocalCoord += new Vector2(sign, -6f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -7f)))
                {
                    LocalCoord += new Vector2(sign, -7f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -8f)))
                {
                    LocalCoord += new Vector2(sign, -8f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -9f)))
                {
                    LocalCoord += new Vector2(sign, -9f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -10f)))
                {
                    LocalCoord += new Vector2(sign, -10f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -11f)))
                {
                    LocalCoord += new Vector2(sign, -11f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -12f)))
                {
                    LocalCoord += new Vector2(sign, -12f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -13f)))
                {
                    LocalCoord += new Vector2(sign, -13f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -14f)))
                {
                    LocalCoord += new Vector2(sign, -14f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -15f)))
                {
                    LocalCoord += new Vector2(sign, -15f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -16f)))
                {
                    LocalCoord += new Vector2(sign, -16f);
                    relPosAcc.X -= sign;
                }
                else
                {
                    relPosAcc.X = 0f;
                    Speed.X = 0f;
                    break;
                }
            }
            while (Mathf.Abs(relPosAcc.Y) >= 1f)
            {
                int sign = relPosAcc.Y > 0f ? 1 : -1;
                if (IsFree(new Vector2(0f, sign)))
                {
                    LocalCoord += new Vector2(0f, sign);
                    relPosAcc.Y -= sign;
                }
                else
                {
                    if (Speed.Y >= 200f)
                    {
                        const int count = 10;
                        Program.Ground.Play();

                        for (int i = 0; i < count; i++)
                        {
                            dustSystem.Add(new Particle
                            {
                                Coordinate = WorldCoord + new Vector2(-Size.X / 2f + ((float)i / ((float)count - 1f)) * Size.X * .5f, Size.Y / 2f),
                                Scale = new Vector2(4f, 4f),
                                Speed = new Vector2(-1f, 0f).Rotate(Angle.FromDegree(45f + Engine.RandomFloat() * 90f)) * 200f,
                                Life = 1f + Engine.RandomFloat() * 0.1f,
                            });
                        }
                    }

                    relPosAcc.Y = 0f;
                    Speed.Y = 0f;
                    break;
                }
            }

            ReEvaluateIsOnGround();

            if (IsOnGround)
                Speed.X = Mathf.Max(0f, Mathf.Abs(Speed.X) - GroundFriction * ev.DeltaTime) * (Speed.X < 0f ? -1f : 1f);
            else
                Speed.X = Mathf.Max(0f, Mathf.Abs(Speed.X) - AirFriction * ev.DeltaTime) * (Speed.X < 0f ? -1f : 1f);
        }
Example #5
0
 internal static void OnPhysicsUpdate()
 {
     PhysicsUpdateEvent?.Invoke();
 }
Example #6
0
        public void PhysicsUpdate(PhysicsUpdateEvent ev)
        {
            if (cd > 0f)
            {
                cd -= ev.DeltaTime;
                if (cd < 0f)
                {
                    cd = 0f;
                }
            }
            while (ParticleCount < 32 && cd == 0f && TimeSinceDraw.Elapsed.TotalSeconds < 0.5f)
            {
                var angle = new Angle(Engine.RandomFloat() * 360f);
                Add(new Particle
                {
                    Life       = 60f,
                    Scale      = new Vector2(4f, 4f),
                    Coordinate = WorldCoord + angle.Unit * 20f,
                    Speed      = (angle + new Angle(90f)).Unit * 300f,
                    Color      = Program.Foreground
                });
                cd = Engine.RandomFloat() * 0.1f;
            }

            var player = ((MainScene)Scene).Player;

            if (player != null)
            {
                var distance = (WorldCoord - player.WorldCoord).Length;
                if (distance < 160)
                {
                    if (distance < 30)
                    {
                        player.WorldScale *= Mathf.Max(0f, 1f - ev.DeltaTime * 5f);
                        player.Speed       = Vector2.Zero;

                        /*Scene.Camera.WorldScale += new Vector2(0.1f, 0.1f) * ev.DeltaTime;
                         * Scene.Camera.WorldRotation -= Angle.FromDegree(90f * ev.DeltaTime);
                         * Scene.Camera.WorldCoord = player.WorldCoord;*/

                        if (player.WorldScale.X <= 0.01f)
                        {
                            World.LevelNum++;
                            Engine.SceneHost.Pop();
                            if (Engine.ResourceHost.GetContainer("main").ReadData(string.Format("level_{0}.png", World.LevelNum)) == null)
                            {
                                Engine.SceneHost.Push(Engine.SceneHost.CreateGlobal <EndScene>());
                            }
                            else
                            {
                                Engine.SceneHost.Push(Engine.SceneHost.CreateGlobal <MainScene>());
                            }
                        }
                    }
                    else
                    {
                        player.Speed += (WorldCoord - player.WorldCoord).Unit * 3000f * ev.DeltaTime;
                    }
                    player.LocalRotation += new Angle(360f * ev.DeltaTime);
                    player.Stun           = 1f;
                }
            }
        }
Example #7
0
        public override void PhysicsUpdate(PhysicsUpdateEvent ev)
        {
            Stun -= ev.DeltaTime;
            if (Stun < 0f)
            {
                Stun = 0f;
            }

            bool left   = Engine.Window.IsKeyDown(Keyboard.Key.Left) || Engine.Window.IsKeyDown(Keyboard.Key.A),
                 right  = Engine.Window.IsKeyDown(Keyboard.Key.Right) || Engine.Window.IsKeyDown(Keyboard.Key.D),
                 up     = Engine.Window.IsKeyDown(Keyboard.Key.Up) || Engine.Window.IsKeyDown(Keyboard.Key.W),
                 action = Engine.Window.IsKeyDown(Keyboard.Key.Space) ||
                          Engine.Window.IsKeyDown(Keyboard.Key.X) ||
                          Engine.Window.IsKeyDown(Keyboard.Key.V) ||
                          Engine.Window.IsKeyDown(Keyboard.Key.Z);

            if (!Enabled || Stun > 0f)
            {
                left   = false;
                right  = false;
                up     = false;
                action = false;
            }

            if (IsOnGround)
            {
                if (left && !right)
                {
                    Speed.X   -= 2400f * ev.DeltaTime;
                    LocalScale = new Vector2(-1f, 1f);
                }

                if (right && !left)
                {
                    Speed.X   += 2400f * ev.DeltaTime;
                    LocalScale = new Vector2(1f, 1f);
                }

                if (action && !oldAction)
                {
                    if (currentSnap != null)
                    {
                        currentSnap.LocalCoord  = WorldCoord + new Vector2(Size.X / 2f, Size.Y / 2f);
                        currentSnap.LocalCoord -= new Vector2(0f, currentSnap.Size.Y);
                        currentSnap.IsFlipped   = LocalScale.X < 0f;
                        if (currentSnap.IsFlipped)
                        {
                            currentSnap.LocalCoord -= new Vector2(Size.X + currentSnap.Size.X, 0f);
                        }
                    }

                    Program.Cut.Play();
                    var snap = Scene.CreateObject <Snapshot>(null, Vector2.Zero, currentSnap, this);
                    currentSnap             = snap;
                    currentSnap.LocalCoord  = WorldCoord + new Vector2(Size.X / 2f, Size.Y / 2f);
                    currentSnap.LocalCoord -= new Vector2(0f, currentSnap.Size.Y);
                    currentSnap.IsFlipped   = LocalScale.X < 0f;
                    if (currentSnap.IsFlipped)
                    {
                        currentSnap.LocalCoord -= new Vector2(Size.X + currentSnap.Size.X, 0f);
                    }
                }
            }
            else
            {
                if (left && !right)
                {
                    Speed.X -= 240f * ev.DeltaTime;
                }
                if (right && !left)
                {
                    Speed.X += 240f * ev.DeltaTime;
                }

                if (WorldCoord.Y - 200 > World.SolidsHeight)
                {
                    Engine.SceneHost.Pop();
                    Engine.SceneHost.Push(Engine.SceneHost.CreateGlobal <MainScene>());
                }
            }

            Speed.X = Mathf.Min(Mathf.Abs(Speed.X), 240f) * (Speed.X < 0f ? -1f : 1f);

            if ((left || right) && !(right && left))
            {
                runTime += ev.DeltaTime;
            }
            else
            {
                runTime = 0f;
            }

            if (!IsOnGround)
            {
                sprite.TextureRect = new Rectangle(new Vector2(textureSize.X, 0f), textureSize);
            }
            else if (runTime == 0f)
            {
                sprite.TextureRect = new Rectangle(Vector2.Zero, textureSize);
            }
            else
            {
                sprite.TextureRect = new Rectangle(new Vector2((2 + ((int)(runTime * 12f) % 6)) * textureSize.X, 0f), textureSize);
            }

            if (up && IsOnGround)
            {
                Speed.Y = -400f;
            }

            // Leaning
            if (Stun == 0f)
            {
                Angle angle;
                if (IsOnGround)
                {
                    var leftDist  = DistanceToGround(-5, -2, 4);
                    var rightDist = DistanceToGround(5, -2, 4);
                    angle = Angle.FromVector(new Vector2(5f, rightDist) - new Vector2(-5f, leftDist));
                }
                else
                {
                    angle = new Angle(0f);
                }
                var deltaAngle = ((((angle.Degree - rotation.Degree) % 360f) + 540f) % 360f) - 180f;
                rotation += new Angle(deltaAngle * Mathf.Min(1f, ev.DeltaTime * 10f));
                if (LocalScale.X < 0f)
                {
                    LocalRotation = -rotation;
                }
                else
                {
                    LocalRotation = rotation;
                }
            }

            oldAction = action;

            base.PhysicsUpdate(ev);
        }
Example #8
0
        public virtual void PhysicsUpdate(PhysicsUpdateEvent ev)
        {
            World    = ((MainScene)Scene).World;
            Speed.Y += Gravity * ev.DeltaTime;

            relPosAcc += Speed * ev.DeltaTime;

            while (Mathf.Abs(relPosAcc.X) >= 1f)
            {
                int sign = relPosAcc.X > 0f ? 1 : -1;
                if (IsFree(new Vector2(sign, 0f)))
                {
                    if (!IsFree(new Vector2(0f, 1f)) && IsFree(new Vector2(sign, 1f)))
                    {
                        if (!IsFree(new Vector2(sign, 2f)))
                        {
                            LocalCoord += new Vector2(0f, 1f);
                        }
                        else if (!IsFree(new Vector2(sign, 3f)))
                        {
                            LocalCoord += new Vector2(0f, 2f);
                        }
                    }
                    LocalCoord  += new Vector2(sign, 0f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -1f)))
                {
                    LocalCoord  += new Vector2(sign, -1f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -2f)))
                {
                    LocalCoord  += new Vector2(sign, -2f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -3f)))
                {
                    LocalCoord  += new Vector2(sign, -3f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -4f)))
                {
                    LocalCoord  += new Vector2(sign, -4f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -5f)))
                {
                    LocalCoord  += new Vector2(sign, -5f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -6f)))
                {
                    LocalCoord  += new Vector2(sign, -6f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -7f)))
                {
                    LocalCoord  += new Vector2(sign, -7f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -8f)))
                {
                    LocalCoord  += new Vector2(sign, -8f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -9f)))
                {
                    LocalCoord  += new Vector2(sign, -9f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -10f)))
                {
                    LocalCoord  += new Vector2(sign, -10f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -11f)))
                {
                    LocalCoord  += new Vector2(sign, -11f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -12f)))
                {
                    LocalCoord  += new Vector2(sign, -12f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -13f)))
                {
                    LocalCoord  += new Vector2(sign, -13f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -14f)))
                {
                    LocalCoord  += new Vector2(sign, -14f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -15f)))
                {
                    LocalCoord  += new Vector2(sign, -15f);
                    relPosAcc.X -= sign;
                }
                else if (IsFree(new Vector2(sign, -16f)))
                {
                    LocalCoord  += new Vector2(sign, -16f);
                    relPosAcc.X -= sign;
                }
                else
                {
                    relPosAcc.X = 0f;
                    Speed.X     = 0f;
                    break;
                }
            }
            while (Mathf.Abs(relPosAcc.Y) >= 1f)
            {
                int sign = relPosAcc.Y > 0f ? 1 : -1;
                if (IsFree(new Vector2(0f, sign)))
                {
                    LocalCoord  += new Vector2(0f, sign);
                    relPosAcc.Y -= sign;
                }
                else
                {
                    if (Speed.Y >= 200f)
                    {
                        const int count = 10;
                        Program.Ground.Play();

                        for (int i = 0; i < count; i++)
                        {
                            dustSystem.Add(new Particle
                            {
                                Coordinate = WorldCoord + new Vector2(-Size.X / 2f + ((float)i / ((float)count - 1f)) * Size.X * .5f, Size.Y / 2f),
                                Scale      = new Vector2(4f, 4f),
                                Speed      = new Vector2(-1f, 0f).Rotate(Angle.FromDegree(45f + Engine.RandomFloat() * 90f)) * 200f,
                                Life       = 1f + Engine.RandomFloat() * 0.1f,
                            });
                        }
                    }

                    relPosAcc.Y = 0f;
                    Speed.Y     = 0f;
                    break;
                }
            }

            ReEvaluateIsOnGround();

            if (IsOnGround)
            {
                Speed.X = Mathf.Max(0f, Mathf.Abs(Speed.X) - GroundFriction * ev.DeltaTime) * (Speed.X < 0f ? -1f : 1f);
            }
            else
            {
                Speed.X = Mathf.Max(0f, Mathf.Abs(Speed.X) - AirFriction * ev.DeltaTime) * (Speed.X < 0f ? -1f : 1f);
            }
        }