/// <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); } }); }
/// <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 } }
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); }
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); }
internal static void OnPhysicsUpdate() { PhysicsUpdateEvent?.Invoke(); }
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; } } }
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); }
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); } }