private void UpdateObjects(float dt) { left = true; right = true; for (int i = 0; i < level.GameObjects.Count; i++) { if (level.GameObjects[i].Name == "Hero") { Character c = level.GameObjects[i] as Character; if (c.ControlledBot != null ? !c.ControlledBot.Controled : true) { c.Anim.ChangeFrame(Keyboard.IsKeyDown(Keys.D) ? Direction.Right : Keyboard.IsKeyDown(Keys.A) ? Direction.Left : /*Keyboard.IsKeyDown(Keys.S) && */ !c.PhysBody.Gravity ? Direction.Down : Direction.Idle, c.PhysBody.MaxSpeed, c.PhysBody.Gravity); } c.PhysBody.OnGround = false; c.PhysBody.Gravity = true; for (int j = 0; j < level.GameObjects.Count; j++) { if (c.Position.IntersectsWith(level.GameObjects[j].Position) && level.GameObjects[j].Name != "Hero") { if (level.GameObjects[j].Name == "Platform" || (level.GameObjects[j].Name == "Door" && ((level.GameObjects[j] is Door) ? !(level.GameObjects[j] as Door).Opened : false))) { if (((level.GameObjects[j].Position.Right + 1 > c.Position.Location.X) && (level.GameObjects[j].Position.Right - 8 /* - 5 */ <= c.Position.Location.X)) && (((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + c.Position.Height - 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + c.Position.Height - 4)) || ((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + 4)) || ((level.GameObjects[j].Position.Location.Y > c.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height <= c.Position.Location.Y + c.Position.Height - 4)))) { c.PhysBody.Velocity = new PointF(0, c.PhysBody.Velocity.Y); c.Position = new RectangleF(new PointF(level.GameObjects[j].Position.Right, c.Position.Y), c.Position.Size); left = false; continue; } if (((level.GameObjects[j].Position.Location.X - 2 < c.Position.Right + 1) && (level.GameObjects[j].Position.Location.X + 8 >= c.Position.Right)) && (((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + c.Position.Height - 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + c.Position.Height - 4)) || ((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + 4)) || ((level.GameObjects[j].Position.Location.Y >= c.Position.Location.Y + 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height <= c.Position.Location.Y + c.Position.Height - 4)))) { c.PhysBody.Velocity = new PointF(0, c.PhysBody.Velocity.Y); c.Position = new RectangleF(new PointF(level.GameObjects[j].Position.Left - c.Position.Width - 1, c.Position.Y), c.Position.Size); right = false; continue; } if ((c.Position.Bottom > level.GameObjects[j].Position.Top) && ((((c.Position.X > level.GameObjects[j].Position.X + 3) && (c.Position.X < level.GameObjects[j].Position.Right - 3)) || ((c.Position.Right > level.GameObjects[j].Position.X + 3) && (c.Position.Right < level.GameObjects[j].Position.Right - 3))) || ((c.Position.X >= level.GameObjects[j].Position.X + 3) && (c.Position.Right <= level.GameObjects[j].Position.Right - 3)) || ((c.Position.X <= level.GameObjects[j].Position.X + 3) && (c.Position.Right >= level.GameObjects[j].Position.Right - 3)))) { c.PhysBody.OnGroundCollision(level.GameObjects[j].Position.Top - c.Position.Height); c.PhysBody.OnGround = true; } if ((c.Position.Bottom >= level.GameObjects[j].Position.Bottom)) { c.Position = new RectangleF(new PointF(c.Position.X, level.GameObjects[j].Position.Bottom), c.Position.Size); c.PhysBody.Velocity = new PointF(c.PhysBody.Velocity.X, 4); } continue; } if (level.GameObjects[j].Name == "DamageObject") { DamageObject dob = level.GameObjects[j] as DamageObject; if (dob.Cripple) { profile.Hero.CurrentHealth -= (dob.Damage - (int)Math.Round(dob.Damage * profile.Hero.ResistanceToDamage)); } if (dob.Destructible) { deletegameobject.Add(level.GameObjects[j]); } if ((c.Position.Top < level.GameObjects[j].Position.Top)) { if (dob.Cripple) { c.PhysBody.Jump(110f); } c.PhysBody.OnGroundCollision(level.GameObjects[j].Position.Top - c.Position.Height); c.PhysBody.OnGround = true; continue; } if ((c.Position.Bottom > level.GameObjects[j].Position.Bottom)) { c.PhysBody.Velocity = new PointF(c.PhysBody.Velocity.X, 4); continue; } if (level.GameObjects[j].Position.Right > c.Position.Left)//(((level.GameObjects[j].Position.Location.X + level.GameObjects[j].Position.Width >= c.Position.Location.X) && (level.GameObjects[j].Position.Location.X + level.GameObjects[j].Position.Width - 5 <= c.Position.Location.X)) && (((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + c.Position.Height) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + c.Position.Height)) || ((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y)) || ((level.GameObjects[j].Position.Location.Y >= c.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height <= c.Position.Location.Y + c.Position.Height)))) { c.Position = new RectangleF(new PointF(level.GameObjects[j].Position.Right + 40, c.Position.Y), c.Position.Size); continue; } if (level.GameObjects[j].Position.Right < c.Position.Left)//(((level.GameObjects[j].Position.Location.X <= c.Position.Location.X + c.Position.Width) && (level.GameObjects[j].Position.Location.X + 5 >= c.Position.Location.X + c.Position.Width)) && (((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + c.Position.Height) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + c.Position.Height)) || ((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y)) || ((level.GameObjects[j].Position.Location.Y >= c.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height <= c.Position.Location.Y + c.Position.Height)))) { c.Position = new RectangleF(new PointF(level.GameObjects[j].Position.Left - c.Position.Width - 40, c.Position.Y), c.Position.Size); continue; } } if (level.GameObjects[j].Name == "Bot") { Bot b = level.GameObjects[j] as Bot; profile.Hero.CurrentHealth -= (b.Damage - (int)Math.Round(b.Damage * profile.Hero.ResistanceToDamage)); if ((c.Position.Top < level.GameObjects[j].Position.Top)) { c.PhysBody.Jump(90f); c.PhysBody.OnGroundCollision(level.GameObjects[j].Position.Top - c.Position.Height); c.PhysBody.OnGround = true; continue; } if ((c.Position.Bottom > level.GameObjects[j].Position.Bottom)) { c.PhysBody.Jump(90f); continue; } if (level.GameObjects[j].Position.Right > c.Position.Left)//(((level.GameObjects[j].Position.Location.X + level.GameObjects[j].Position.Width >= c.Position.Location.X) && (level.GameObjects[j].Position.Location.X + level.GameObjects[j].Position.Width - 5 <= c.Position.Location.X)) && (((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + c.Position.Height) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + c.Position.Height)) || ((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y)) || ((level.GameObjects[j].Position.Location.Y >= c.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height <= c.Position.Location.Y + c.Position.Height)))) { c.PhysBody.Jump(90f); continue; } if (level.GameObjects[j].Position.Right < c.Position.Left)//(((level.GameObjects[j].Position.Location.X <= c.Position.Location.X + c.Position.Width) && (level.GameObjects[j].Position.Location.X + 5 >= c.Position.Location.X + c.Position.Width)) && (((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + c.Position.Height) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + c.Position.Height)) || ((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y)) || ((level.GameObjects[j].Position.Location.Y >= c.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height <= c.Position.Location.Y + c.Position.Height)))) { c.PhysBody.Jump(90f); continue; } } if (level.GameObjects[j].Name == "CheckPoint") { PointCheck pc = level.GameObjects[j] as PointCheck; if (!pc.CheckSave) { pc.SavePoint(profile, c, level); } continue; } if (level.GameObjects[j].Name == "ExitDoor") { pause = true; Thread.Sleep(1000); this.Dispose(); this.Close(); gamemenu.LevelComplete(c); continue; } if (level.GameObjects[j].Name == "Ladder") { c.PhysBody.Gravity = false; continue; } if (level.GameObjects[j].Name == "Switcher" && (UpKey == Keys.E)) { Switcher s = level.GameObjects[j] as Switcher; s.Activated = !s.Activated; continue; } if (level.GameObjects[j] is Item) { Item item = level.GameObjects[j] as Item; item.AddToCharacter(c, deletegameobject); continue; } if (level.GameObjects[j].Name == "Chest" && (UpKey == Keys.E)) { Chest chest = level.GameObjects[j] as Chest; drawingobjects.AddRange(chest.Items); chest.Open(level.GameObjects); continue; } if (level.GameObjects[j].Name == "SwitcherPassword" && (UpKey == Keys.E)) { SwitcherPassword switcherpassword = level.GameObjects[j] as SwitcherPassword; if (!switcherpassword.Activated) { pause = true; } UpKey = 0; switcherpassword.TryOn(this); continue; } if (level.GameObjects[j].Name == "Trigger") { Trigger t = level.GameObjects[j] as Trigger; if (!t.Activated) { t.Activated = true; } continue; } if (level.GameObjects[j].Name == "Shop" && (UpKey == Keys.E)) { UpKey = 0; Shop shop = level.GameObjects[j] as Shop; //pause = true; shop.ToShop(c, this); lastupdate = DateTime.MinValue; continue; } if (level.GameObjects[j].Name == "Teleport" && (UpKey == Keys.E)) { Teleport t = level.GameObjects[j] as Teleport; UpKey = 0; if (t.Teleport2 != null) { t.ToTeleport2(c); } continue; } } } if (!c.PhysBody.OnGround) { c.PhysBody.UpdatePositionY(dt); } } if (level.GameObjects[i].Name == "Bot") { Bot c = level.GameObjects[i] as Bot; if (!c.Controled) { c.Anim.ChangeFrame(c.Right ? Direction.Right : Direction.Left, c.PhysBody.MaxSpeed, c.PhysBody.Gravity); } else { c.Anim.ChangeFrame(Keyboard.IsKeyDown(Keys.D) ? Direction.Right : Keyboard.IsKeyDown(Keys.A) ? Direction.Left : /*Keyboard.IsKeyDown(Keys.S) && */ !c.PhysBody.Gravity ? Direction.Down : Direction.Idle, c.PhysBody.MaxSpeed, c.PhysBody.Gravity); } if (c.Controled) { if (Keyboard.IsKeyDown(Keys.W) && CheckGroung(c) /*&& profile.SaveGame.Hero.PhysBody.OnGround*/) { profile.Hero.ControlledBot.PhysBody.Jump(); profile.Hero.ControlledBot.PhysBody.OnGround = false; } if (Keyboard.IsKeyDown(Keys.A) && left) { profile.Hero.ControlledBot.PhysBody.Left(); right = true; } if (Keyboard.IsKeyDown(Keys.D) && right) { profile.Hero.ControlledBot.PhysBody.Right(); left = true; } } else { if (c.Right) { c.PhysBody.Right(); } else { c.PhysBody.Left(); } } c.PhysBody.UpdatePositionX(dt); c.PhysBody.OnGround = false; c.PhysBody.Gravity = true; for (int j = 0; j < level.GameObjects.Count; j++) { if (c.Position.IntersectsWith(level.GameObjects[j].Position) && level.GameObjects[j] != level.GameObjects[i]) { if (level.GameObjects[j].Name == "Platform" || (level.GameObjects[j].Name == "Door" && ((level.GameObjects[j] is Door) ? !(level.GameObjects[j] as Door).Opened : false))) { if (((level.GameObjects[j].Position.Right + 1 /* <--- clear*/ > c.Position.Location.X) && (level.GameObjects[j].Position.Right - 8 /* - 5 */ <= c.Position.Location.X)) && (((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + c.Position.Height - 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + c.Position.Height - 4)) || ((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + 4)) || ((level.GameObjects[j].Position.Location.Y > c.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height <= c.Position.Location.Y + c.Position.Height - 4)))) { c.Position = new RectangleF(new PointF(level.GameObjects[j].Position.Right, c.Position.Y), c.Position.Size); c.Right = true; if (!c.Controled) { left = false; } continue; } if (((level.GameObjects[j].Position.Location.X - 2 /* */ < c.Position.Right + 1) && (level.GameObjects[j].Position.Location.X + 8 >= c.Position.Right)) && (((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + c.Position.Height - 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + c.Position.Height - 4)) || ((level.GameObjects[j].Position.Location.Y < c.Position.Location.Y + 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > c.Position.Location.Y + 4)) || ((level.GameObjects[j].Position.Location.Y >= c.Position.Location.Y + 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height <= c.Position.Location.Y + c.Position.Height - 4)))) { c.Position = new RectangleF(new PointF(level.GameObjects[j].Position.Left - c.Position.Width - 1, c.Position.Y), c.Position.Size); c.Right = false; if (!c.Controled) { right = false; } continue; } if ((c.Position.Bottom > level.GameObjects[j].Position.Top) && ((((c.Position.X > level.GameObjects[j].Position.X + 3) && (c.Position.X < level.GameObjects[j].Position.Right - 3)) || ((c.Position.Right > level.GameObjects[j].Position.X + 3) && (c.Position.Right < level.GameObjects[j].Position.Right - 3))) || ((c.Position.X >= level.GameObjects[j].Position.X + 3) && (c.Position.Right <= level.GameObjects[j].Position.Right - 3)) || ((c.Position.X <= level.GameObjects[j].Position.X + 3) && (c.Position.Right >= level.GameObjects[j].Position.Right - 3)))) { c.PhysBody.OnGroundCollision(level.GameObjects[j].Position.Top - c.Position.Height); c.PhysBody.OnGround = true; if (level.GameObjects[j].Position.X > c.Position.X) { c.Right = true; } if (level.GameObjects[j].Position.Right < c.Position.Right) { c.Right = false; } } if ((c.Position.Bottom >= level.GameObjects[j].Position.Bottom)) { c.Position = new RectangleF(new PointF(c.Position.X, level.GameObjects[j].Position.Bottom), c.Position.Size); c.PhysBody.Velocity = new PointF(c.PhysBody.Velocity.X, 4); } continue; } if (level.GameObjects[j].Name == "ControlBall") { if (profile.Hero.LevelControlBot >= c.LevelControl) { profile.Hero.ControlledBot = (Bot)level.GameObjects[i]; } deletegameobject.Add(level.GameObjects[j]); } if (c.Controled && level.GameObjects[j].Name == "Switcher" && (UpKey == Keys.E)) { Switcher s = level.GameObjects[j] as Switcher; s.Activated = !s.Activated; } if (c.Controled && level.GameObjects[j].Name == "SwitcherPassword" && (UpKey == Keys.E)) { pause = true; SwitcherPassword switcherpassword = level.GameObjects[j] as SwitcherPassword; UpKey = 0; switcherpassword.TryOn(this); } } } if (!c.PhysBody.OnGround) { c.PhysBody.UpdatePositionY(dt); } } if (level.GameObjects[i].Name == "ControlBall") { bool removed = false; for (int j = 0; j < level.GameObjects.Count; j++) { if (level.GameObjects[i].Position.IntersectsWith(level.GameObjects[j].Position) && level.GameObjects[j] != level.GameObjects[i]) { if (level.GameObjects[j].Name == "Platform" || level.GameObjects[j].Name == "Ladder" || level.GameObjects[j].Name == "Door") { deletegameobject.Add(level.GameObjects[i]); removed = true; break; } } } if (!removed) { level.GameObjects[i].Position = new RectangleF(new PointF(level.GameObjects[i].Position.X + dt * currentspeedcontrolball, level.GameObjects[i].Position.Y), level.GameObjects[i].Position.Size); } } if (level.GameObjects[i] is Item) { Item item = level.GameObjects[i] as Item; item.PhysBody.OnGround = false; for (int j = 0; j < level.GameObjects.Count; j++) { if (item.Position.IntersectsWith(level.GameObjects[j].Position) && level.GameObjects[j] != item) { if (level.GameObjects[j].Name == "Platform" || (level.GameObjects[j].Name == "Door" && ((level.GameObjects[j] is Door) ? !(level.GameObjects[j] as Door).Opened : false))) { if (((item.Position.Bottom >= level.GameObjects[j].Position.Y) /*&& (item.Position.Bottom < level.GameObjects[j].Position.Bottom)) && ((((item.Position.X > level.GameObjects[j].Position.X) && (item.Position.X < level.GameObjects[j].Position.Right)) || ((item.Position.Right > level.GameObjects[j].Position.X) && (item.Position.Right < level.GameObjects[j].Position.Right))) || ((item.Position.X >= level.GameObjects[j].Position.X) && (item.Position.Right <= level.GameObjects[j].Position.Right)) || ((item.Position.X <= level.GameObjects[j].Position.X) && (item.Position.Right >= level.GameObjects[j].Position.Right)))*/)) { item.PhysBody.OnGroundCollision(level.GameObjects[j].Position.Top - item.Position.Height); item.PhysBody.OnGround = true; } if (((level.GameObjects[j].Position.Location.X + level.GameObjects[j].Position.Width > item.Position.Location.X) && (level.GameObjects[j].Position.Location.X + level.GameObjects[j].Position.Width - 5 <= item.Position.Location.X)) && (((level.GameObjects[j].Position.Location.Y < item.Position.Location.Y + item.Position.Height - 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > item.Position.Location.Y + item.Position.Height - 4)) || ((level.GameObjects[j].Position.Location.Y < item.Position.Location.Y + 4) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > item.Position.Location.Y + 4)) || ((level.GameObjects[j].Position.Location.Y > item.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height <= item.Position.Location.Y + item.Position.Height - 4)))) { item.Position = new RectangleF(new PointF(level.GameObjects[j].Position.Right, item.Position.Y), item.Position.Size); } if (((level.GameObjects[j].Position.Location.X < item.Position.Location.X + item.Position.Width + 1) && (level.GameObjects[j].Position.Location.X + 5 >= item.Position.Location.X + item.Position.Width)) && (((level.GameObjects[j].Position.Location.Y < item.Position.Location.Y + item.Position.Height) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > item.Position.Location.Y + item.Position.Height)) || ((level.GameObjects[j].Position.Location.Y < item.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height > item.Position.Location.Y)) || ((level.GameObjects[j].Position.Location.Y >= item.Position.Location.Y) && (level.GameObjects[j].Position.Location.Y + level.GameObjects[j].Position.Height <= item.Position.Location.Y + item.Position.Height)))) { item.Position = new RectangleF(new PointF(level.GameObjects[j].Position.Left - item.Position.Width - 1, item.Position.Y), item.Position.Size); // continue; } if ((item.Position.Bottom >= level.GameObjects[j].Position.Bottom)) { item.Position = new RectangleF(new PointF(item.Position.X, level.GameObjects[j].Position.Bottom), item.Position.Size); item.PhysBody.Velocity = new PointF(item.PhysBody.Velocity.X, 4); } continue; } } } if (!item.PhysBody.OnGround) { item.PhysBody.UpdatePositionY(dt); } } } while (deletegameobject.Count != 0) { level.GameObjects.Remove(deletegameobject[0]); drawingobjects.Remove(deletegameobject[0]); deletegameobject.RemoveAt(0); } }