public override void Update(GameTime gameTime, Map gameMap) { Speed = Vector2.Lerp(Speed, Vector2.Zero, 0.05f); if (Vector2.Distance(Ship.Instance.Position, Position) < 50f) { Vector2 dir = Ship.Instance.Position - Position; dir.Normalize(); Speed += dir*0.25f; } //Position = Vector2.Lerp(Position, Ship.Instance.Position, 0.1f); if (gameMap.CheckCollision(Position + new Vector2(Speed.X, 0)).GetValueOrDefault()) { Speed.X = -(Speed.X * (0.1f + Helper.RandomFloat(0.4f))); Speed.Y *= 0.9f; } if (gameMap.CheckCollision(Position + new Vector2(0, Speed.Y)).GetValueOrDefault()) { Speed.Y = -(Speed.Y * (0.1f + Helper.RandomFloat(0.4f))); Speed.X *= 0.9f; } base.Update(gameTime); }
public virtual void CheckMapCollisions(Map gameMap) { // Check upward collision if (Speed.Y < 0) for (int x = HitBox.Left + 2; x <= HitBox.Right - 2; x += 2) { bool? coll = gameMap.CheckCollision(new Vector2(x, HitBox.Top + Speed.Y)); if (coll.HasValue && coll.Value) Speed.Y = -Speed.Y; } // Check downward collision if (Speed.Y > 0) for (int x = HitBox.Left + 2; x <= HitBox.Right - 2; x += 2) { bool? coll = gameMap.CheckCollision(new Vector2(x, HitBox.Bottom + Speed.Y)); if (coll.HasValue && coll.Value) Speed.Y = -Speed.Y; } // Check left collision if (Speed.X < 0) for (int y = HitBox.Top + 2; y <= HitBox.Bottom - 2; y += 2) { bool? coll = gameMap.CheckCollision(new Vector2(HitBox.Left + Speed.X, y)); if (coll.HasValue && coll.Value) { Speed.X = -Speed.X; } } // Check right collision if (Speed.X > 0) for (int y = HitBox.Top + 2; y <= HitBox.Bottom - 2; y += 2) { bool? coll = gameMap.CheckCollision(new Vector2(HitBox.Right + Speed.X, y)); if (coll.HasValue && coll.Value) { Speed.X = -Speed.X; } } }
void DoCollisions(Map gameMap, HeroDude gameHero) { bool LCollision = false; bool RCollision = false; bool UCollision = false; bool DCollision = false; if (Speed.X > 0f) { if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, 0f))) RCollision = true; if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, -0.4f))) RCollision = true; if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, 0.4f))) RCollision = true; for (int i = 0; i < VehicleController.Instance.Vehicles.Count; i++) { if (Vector2.Distance(VehicleController.Instance.Vehicles[i].Position, Position) > 500f) continue; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, 0f), VehicleController.Instance.Vehicles[i].CollisionVerts)) RCollision = true; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, -0.4f), VehicleController.Instance.Vehicles[i].CollisionVerts)) RCollision = true; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, 0.4f), VehicleController.Instance.Vehicles[i].CollisionVerts)) RCollision = true; } for(int d=0;d<EnemyController.Instance.Enemies.Count;d++) { if (Vector2.Distance(EnemyController.Instance.Enemies[d].Position, Position) > 500f) continue; if (EnemyController.Instance.Enemies[d].Dead || EnemyController.Instance.Enemies[d] == this) continue; if ((Helper.PointOnCircle(ref Position, 50, 0f) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) RCollision = true; if ((Helper.PointOnCircle(ref Position, 50, -0.4f) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) RCollision = true; if ((Helper.PointOnCircle(ref Position, 50, 0.4f) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) RCollision = true; } if (this is AIDude) { if ((Helper.PointOnCircle(ref Position, 50, 0f) - gameHero.Position).Length() < 40f) RCollision = true; if ((Helper.PointOnCircle(ref Position, 50, -0.4f) - gameHero.Position).Length() < 40f) RCollision = true; if ((Helper.PointOnCircle(ref Position, 50, 0.4f) - gameHero.Position).Length() < 40f) RCollision = true; } } if (Speed.X < 0f) { if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, MathHelper.Pi))) LCollision = true; if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, MathHelper.Pi - 0.4f))) LCollision = true; if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, MathHelper.Pi + 0.4f))) LCollision = true; for (int i = 0; i < VehicleController.Instance.Vehicles.Count; i++) { if (Vector2.Distance(VehicleController.Instance.Vehicles[i].Position, Position) > 500f) continue; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, MathHelper.Pi), VehicleController.Instance.Vehicles[i].CollisionVerts)) LCollision = true; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, MathHelper.Pi - 0.4f), VehicleController.Instance.Vehicles[i].CollisionVerts)) LCollision = true; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, MathHelper.Pi + 0.4f), VehicleController.Instance.Vehicles[i].CollisionVerts)) LCollision = true; } for (int d = 0; d < EnemyController.Instance.Enemies.Count; d++) { if (Vector2.Distance(EnemyController.Instance.Enemies[d].Position, Position) > 500f) continue; if (EnemyController.Instance.Enemies[d].Dead || EnemyController.Instance.Enemies[d] == this) continue; if ((Helper.PointOnCircle(ref Position, 50, MathHelper.Pi) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) LCollision = true; if ((Helper.PointOnCircle(ref Position, 50, MathHelper.Pi - 0.4f) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) LCollision = true; if ((Helper.PointOnCircle(ref Position, 50, MathHelper.Pi + 0.4f) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) LCollision = true; } if (this is AIDude) { if ((Helper.PointOnCircle(ref Position, 50, MathHelper.Pi) - gameHero.Position).Length() < 40f) LCollision = true; if ((Helper.PointOnCircle(ref Position, 50, MathHelper.Pi - 0.4f) - gameHero.Position).Length() < 40f) LCollision = true; if ((Helper.PointOnCircle(ref Position, 50, MathHelper.Pi + 0.4f) - gameHero.Position).Length() < 40f) LCollision = true; } } if (Speed.Y < 0f) { if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi)))) UCollision = true; if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi) - 0.4f))) UCollision = true; if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi) + 0.4f))) UCollision = true; for (int i = 0; i < VehicleController.Instance.Vehicles.Count; i++) { if (Vector2.Distance(VehicleController.Instance.Vehicles[i].Position, Position) > 500f) continue; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi)), VehicleController.Instance.Vehicles[i].CollisionVerts)) UCollision = true; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi) - 0.4f), VehicleController.Instance.Vehicles[i].CollisionVerts)) UCollision = true; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi) + 0.4f), VehicleController.Instance.Vehicles[i].CollisionVerts)) UCollision = true; } for (int d = 0; d < EnemyController.Instance.Enemies.Count; d++) { if (Vector2.Distance(EnemyController.Instance.Enemies[d].Position, Position) > 500f) continue; if (EnemyController.Instance.Enemies[d].Dead || EnemyController.Instance.Enemies[d] == this) continue; if ((Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi)) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) UCollision = true; if ((Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi) - 0.4f) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) UCollision = true; if ((Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi) + 0.4f) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) UCollision = true; } if (this is AIDude) { if ((Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi)) - gameHero.Position).Length() < 40f) UCollision = true; if ((Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi) - 0.4f) - gameHero.Position).Length() < 40f) UCollision = true; if ((Helper.PointOnCircle(ref Position, 50, (MathHelper.PiOver2 + MathHelper.Pi) + 0.4f) - gameHero.Position).Length() < 40f) UCollision = true; } } if (Speed.Y > 0f) { if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2))) DCollision = true; if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2 - 0.4f))) DCollision = true; if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2 + 0.4f))) DCollision = true; for (int i = 0; i < VehicleController.Instance.Vehicles.Count; i++) { if (Vector2.Distance(VehicleController.Instance.Vehicles[i].Position, Position) > 500f) continue; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2), VehicleController.Instance.Vehicles[i].CollisionVerts)) DCollision = true; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2 - 0.4f), VehicleController.Instance.Vehicles[i].CollisionVerts)) DCollision = true; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2 + 0.4f), VehicleController.Instance.Vehicles[i].CollisionVerts)) DCollision = true; } for(int d=0;d<EnemyController.Instance.Enemies.Count;d++) { if (Vector2.Distance(EnemyController.Instance.Enemies[d].Position, Position) > 500f) continue; if (EnemyController.Instance.Enemies[d].Dead || EnemyController.Instance.Enemies[d] == this) continue; if ((Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) DCollision = true; if ((Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2 - 0.4f) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) DCollision = true; if ((Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2 + 0.4f) - EnemyController.Instance.Enemies[d].Position).Length() < 40f) DCollision = true; } if (this is AIDude) { if ((Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2) - gameHero.Position).Length() < 40f) DCollision = true; if ((Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2 - 0.4f) - gameHero.Position).Length() < 40f) DCollision = true; if ((Helper.PointOnCircle(ref Position, 50, MathHelper.PiOver2 + 0.4f) - gameHero.Position).Length() < 40f) DCollision = true; } } if (Speed.X > 0f && RCollision) Speed.X = 0f; if (Speed.X < 0f && LCollision) Speed.X = 0f; if (Speed.Y > 0f && DCollision) Speed.Y = 0f; if (Speed.Y < 0f && UCollision) Speed.Y = 0f; if (UCollision || DCollision || LCollision || RCollision) Collided(); }
internal bool LineCollision(Vector2 testPos, Map gameMap, bool ignoreVehicles) { Vector2 testVector = Position; Vector2 testLine = (testPos - Position); while ((testVector - testPos).Length() > 30f) { if (gameMap.CheckCollision(testVector)) return true; if(VehicleController.Instance.CheckVehicleCollision(testVector) && !ignoreVehicles) return true; testVector += (testLine / 50f); } return false; }
public void Update(GameTime gameTime, Map gameMap) { foreach (Particle p in Particles.Where(part => part.Active)) { p.Life -= gameTime.ElapsedGameTime.TotalMilliseconds; p.Position += p.Velocity; p.Rotation += p.RotationSpeed; if (p.CanCollide && gameMap.CheckCollision(p.Position) == true) { p.Velocity = Vector2.Zero; p.RotationSpeed = 0f; } if (p.Life <= 0) { p.Alpha -= 0.01f; if (p.Alpha < 0.05f) p.Active = false; } switch (p.Special) { case SpecialParticle.Blood: if (p.Scale > 1f) p.Scale -= 0.1f; p.Velocity *= 0.9f; if(p.Scale<=1f) //if (p.Velocity.Length() < 0.05f) { p.Velocity = Vector2.Zero; p.RotationSpeed = 0f; } break; case SpecialParticle.BloodPool: p.RotationSpeed = 0f; p.Scale = MathHelper.Lerp(p.Scale, 8f, 0.01f); break; case SpecialParticle.Smoke: p.Scale = MathHelper.Lerp(p.Scale, 2f, 0.01f); break; } } Particles.RemoveAll(part => !part.Active); }
internal virtual void DoCollisions(Map gameMap) { bool Collision = false; Vector2 test = Speed; test.Normalize(); float rot = Helper.V2ToAngle(test); if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, rot))) Collision = true; if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, rot -0.2f))) Collision = true; if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, rot + 0.2f))) Collision = true; foreach (Vehicle veh in VehicleController.Instance.Vehicles) { if (veh == this) continue; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, rot), veh.CollisionVerts)) Collision = true; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, rot - 0.2f), veh.CollisionVerts)) Collision = true; if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, rot + 0.2f), veh.CollisionVerts)) Collision = true; } if (Collision) { Collided(); } //bool LCollision = false; //bool RCollision = false; //bool UCollision = false; //bool DCollision = false; //if (Speed.X > 0f) //{ // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, 0f))) RCollision = true; // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, -0.2f))) RCollision = true; // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, 0.2f))) RCollision = true; // foreach (Vehicle veh in VehicleController.Instance.Vehicles) // { // if (veh == this) continue; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, 0f), veh.CollisionVerts)) RCollision = true; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, -0.2f), veh.CollisionVerts)) RCollision = true; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, 0.2f), veh.CollisionVerts)) RCollision = true; // } //} //if (Speed.X < 0f) //{ // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, MathHelper.Pi))) LCollision = true; // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, MathHelper.Pi - 0.2f))) LCollision = true; // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, MathHelper.Pi + 0.2f))) LCollision = true; // foreach (Vehicle veh in VehicleController.Instance.Vehicles) // { // if (veh == this) continue; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, MathHelper.Pi), veh.CollisionVerts)) LCollision = true; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, MathHelper.Pi - 0.2f), veh.CollisionVerts)) LCollision = true; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, MathHelper.Pi + 0.2f), veh.CollisionVerts)) LCollision = true; // } //} //if (Speed.Y < 0f) //{ // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, (MathHelper.PiOver2 + MathHelper.Pi)))) UCollision = true; // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, (MathHelper.PiOver2 + MathHelper.Pi) - 0.2f))) UCollision = true; // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, (MathHelper.PiOver2 + MathHelper.Pi) + 0.2f))) UCollision = true; // foreach (Vehicle veh in VehicleController.Instance.Vehicles) // { // if (veh == this) continue; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, (MathHelper.PiOver2 + MathHelper.Pi)), veh.CollisionVerts)) UCollision = true; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, (MathHelper.PiOver2 + MathHelper.Pi) - 0.2f), veh.CollisionVerts)) UCollision = true; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, (MathHelper.PiOver2 + MathHelper.Pi) + 0.2f), veh.CollisionVerts)) UCollision = true; // } //} //if (Speed.Y > 0f) //{ // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, MathHelper.PiOver2))) DCollision = true; // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, MathHelper.PiOver2 - 0.2f))) DCollision = true; // if (gameMap.CheckCollision(Helper.PointOnCircle(ref Position, 135, MathHelper.PiOver2 + 0.2f))) DCollision = true; // foreach (Vehicle veh in VehicleController.Instance.Vehicles) // { // if (veh == this) continue; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, MathHelper.PiOver2), veh.CollisionVerts)) DCollision = true; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, MathHelper.PiOver2 - 0.2f), veh.CollisionVerts)) DCollision = true; // if (Helper.IsPointInShape(Helper.PointOnCircle(ref Position, 135, MathHelper.PiOver2 + 0.2f), veh.CollisionVerts)) DCollision = true; // } //} //if (Speed.X > 0f && RCollision) Speed.X = 0f; //if (Speed.X < 0f && LCollision) Speed.X = 0f; //if (Speed.Y > 0f && DCollision) Speed.Y = 0f; //if (Speed.Y < 0f && UCollision) Speed.Y = 0f; //if (UCollision || DCollision || LCollision || RCollision) // Collided(); }
public override void Update(GameTime gameTime, Map gameMap) { Rotation = Helper.V2ToAngle(Speed); Life -= gameTime.ElapsedGameTime.TotalMilliseconds; if (Life <= 0) { Active = false; if(Type== ProjectileType.Bomb || Type== ProjectileType.Seeker) Explode(); } bool? coll = gameMap.CheckCollision(Position); if (coll.HasValue && coll.Value) { Active=false; if (Type == ProjectileType.Bomb || Type == ProjectileType.Seeker) Explode(); else RaiseDust(); } switch (Type) { case ProjectileType.Forward1: if(Position.Y>260 && Helper.Random.Next(5)==0) ParticleController.Instance.Add(Position, -Speed * Helper.RandomFloat(0f,0.3f), 0, 200 + Helper.Random.NextDouble() * 500, 100, false, false, new Rectangle(0, 0, 2, 2), new Color(new Vector3(1f) * (0.25f + Helper.RandomFloat(0.5f))), ParticleFunctions.Smoke, 1f, 0f, 0f, 1, ParticleBlend.Additive); break; case ProjectileType.Bomb: Speed.Y += (Position.Y > 260 ? 0.01f : 0.1f); Rectangle particleRect = Position.Y > 260 ? new Rectangle(128, 0, 16, 16) : new Rectangle(0, 0, 16, 16); ParticleController.Instance.Add(Position, new Vector2(-0.05f + Helper.RandomFloat(0.1f), -0.1f), 0, Helper.Random.NextDouble() * 1000, Helper.Random.NextDouble() * 1000, false, false, particleRect, new Color(new Vector3(1f) * (0.25f + Helper.RandomFloat(0.5f))), //(Position.Y > 260) ? ParticleFunctions.FadeInOut : ParticleFunctions.Smoke, ParticleFunctions.Smoke, 0.25f, 0f, 0f, 1, Position.Y > 260 ? ParticleBlend.Alpha :ParticleBlend.Additive); break; case ProjectileType.Seeker: if (!EnemyOwner) { Enemy e = EnemyController.Instance.Enemies.OrderBy(en => Vector2.Distance(en.Position, Position)) .FirstOrDefault(); if (e != null) Target = e.Position; } else { Target = Ship.Instance.Position; } Vector2 dir = Target - Position; dir.Normalize(); Speed += dir*0.5f; Speed = Vector2.Lerp(Speed, Vector2.Zero, 0.1f); Rectangle pRect = Position.Y > 260 ? new Rectangle(128, 0, 16, 16) : new Rectangle(0, 0, 8, 8); ParticleController.Instance.Add(Position, new Vector2(-0.05f + Helper.RandomFloat(0.1f), -0.05f + Helper.RandomFloat(0.1f)), 0, Helper.Random.NextDouble() * 1000, Helper.Random.NextDouble() * 1000, false, false, pRect, new Color(new Vector3(1f) * (0.25f + Helper.RandomFloat(0.5f))), //(Position.Y > 260) ? ParticleFunctions.FadeInOut : ParticleFunctions.Smoke, ParticleFunctions.Smoke, 0.25f, 0f, 0f, 1, Position.Y > 260 ? ParticleBlend.Alpha :ParticleBlend.Additive); break; case ProjectileType.GorgerAcid: Speed.X = MathHelper.Lerp(Speed.X,0f,0.1f); if (Speed.X < -0.1f || Speed.X > 0.1f) { ParticleController.Instance.Add(Position, Vector2.Zero, 100, 0, 100, false, false, new Rectangle(0, 0, 3, 3), new Color(new Vector3(0f, 1f, 0f)*(0.25f + Helper.RandomFloat(0.5f))), ParticleFunctions.FadeInOut, 1f, Helper.RandomFloat(0f, MathHelper.Pi), Helper.RandomFloat(-0.01f, 0.01f), 1, ParticleBlend.Alpha); } else { if (Helper.Random.Next(20) == 0) ParticleController.Instance.Add(Position, Vector2.Zero, 50, 1000, 500, false, false, new Rectangle(0, 0, 16, 16), new Color(new Vector3(0f, 1f, 0f)*(0.25f + Helper.RandomFloat(0.5f))), ParticleFunctions.Acid, 0.25f, Helper.RandomFloat(0f, MathHelper.Pi), Helper.RandomFloat(-0.01f, 0.01f), 1, ParticleBlend.Additive); } break; case ProjectileType.EyesPew: if (Position.Y < 260) Active = false; break; } base.Update(gameTime, gameMap); }
private Vector2 FindSpawnLoc(Map gameMap, bool underWater) { Vector2 returnLoc = new Vector2(); while (true) { if (!underWater) returnLoc.Y = Helper.RandomFloat(64, 200); else returnLoc.Y = Helper.RandomFloat(300, (gameMap.TileHeight*gameMap.Height) - 64); returnLoc.X = Helper.RandomFloat(64, (gameMap.TileWidth*gameMap.Width) - 64); bool coll = false; for(float a = 0;a<MathHelper.TwoPi;a+=0.1f) if (gameMap.CheckCollision(Helper.PointOnCircle(ref returnLoc, 16, a))!=null) coll = true; if (!coll) break; } return returnLoc; }
public void Update(GameTime gameTime, Map gameMap) { foreach (Particle p in Particles.Where(p => p.State != ParticleState.Done)) { p.CurrentTime += gameTime.ElapsedGameTime.TotalMilliseconds; if (p.AffectedByGravity) p.Velocity.Y += 0.05f; if (p.CanCollide && gameMap != null) { if (gameMap.CheckCollision(p.Position + new Vector2(p.Velocity.X, 0)).GetValueOrDefault()) { p.Velocity.X = -(p.Velocity.X * (0.1f + Helper.RandomFloat(0.4f))); p.Velocity.Y *= 0.9f; } if (gameMap.CheckCollision(p.Position + new Vector2(0, p.Velocity.Y)).GetValueOrDefault()) { p.Velocity.Y = -(p.Velocity.Y * (0.1f + Helper.RandomFloat(0.4f))); p.Velocity.X *= 0.9f; } } p.Position += p.Velocity; p.Rotation += p.RotationSpeed; if (p.Position.X < 0) p.Position.X = (gameMap.Width * gameMap.TileWidth) + p.Position.X; if (p.Position.X >= (gameMap.Width * gameMap.TileWidth)) p.Position.X = p.Position.X - (gameMap.Width * gameMap.TileWidth); switch (p.State) { case ParticleState.Attack: p.AttackValue = (1f / (float)p.AttackTime) * (float)p.CurrentTime; if (p.CurrentTime >= p.AttackTime) { p.CurrentTime = 0; p.State = ParticleState.Alive; } break; case ParticleState.Alive: p.LifeValue = (1f / (float)p.LifeTime) * (float)p.CurrentTime; if (p.CurrentTime >= p.LifeTime) { p.CurrentTime = 0; p.State = ParticleState.Decay; } break; case ParticleState.Decay: p.DecayValue = (1f / (float)p.DecayTime) * (float)p.CurrentTime; if (p.CurrentTime >= p.DecayTime) { p.CurrentTime = 0; p.State = ParticleState.Done; } break; case ParticleState.Done: break; default: throw new ArgumentOutOfRangeException(); } p.ParticleFunction(p); } }
private void CheckMapCollisions(Map gameMap) { // Check downward collision if(Speed.Y>0) for (int x = HitBox.Left+2; x <= HitBox.Right-2; x += 2) { bool? coll = gameMap.CheckCollision(new Vector2(x, HitBox.Bottom + Speed.Y)); if (coll.HasValue && coll.Value) Speed.Y = 0; } // Check left collision if(Speed.X<0) for (int y = HitBox.Top+2; y <= HitBox.Bottom-2; y += 2) { bool? coll = gameMap.CheckCollision(new Vector2(HitBox.Left - Speed.X, y)); if (coll.HasValue && coll.Value) { Speed.X = 0; FaceDir = 1; } } // Check right collision if (Speed.X > 0) for (int y = HitBox.Top+2; y <= HitBox.Bottom-2; y += 2) { bool? coll = gameMap.CheckCollision(new Vector2(HitBox.Right + Speed.X, y)); if (coll.HasValue && coll.Value) { Speed.X = 0; FaceDir = -1; } } }
public void Update(GameTime gameTime, Map gameMap, HeroDude gameHero, bool[,] mapFog, Camera gameCamera) { checkLOSTime += gameTime.ElapsedGameTime.TotalMilliseconds; genPathTime += gameTime.ElapsedGameTime.TotalMilliseconds; checkTorchTime += gameTime.ElapsedGameTime.TotalMilliseconds; // Moving if ((Position - Target).Length() > 10f) { Vector2 dir = Target - Position; Move(dir); //if(State==AIState.Patrolling) if(State!=AIState.Attacking) LookAt(Target); } else { Target = Position; // Reached target switch (State) { case AIState.Patrolling: if (Helper.Random.Next(500) == 1) { Vector2 potentialTarget = Helper.RandomPointInCircle(Position, 100, 500); if (!gameMap.CheckCollision(potentialTarget)) Target = potentialTarget; } break; } } switch (State) { case AIState.Patrolling: // Chase player if in LOS if (CheckLineOfSight(gameHero.Position, gameMap)) { gameHero.HuntedLevel.Seen(gameHero.Position); Target = Position; // Stop dead in tracks if (gameHero.drivingVehicle == null) State = AIState.Chasing; // Begin chasing player else { if (Weapons[SelectedWeapon].GetType() != typeof(Knife)) State = AIState.Attacking; } } // Allow the enemy to "hear" the player if player moves close to enemy if ((gameHero.Speed.Length() > 0f && (gameHero.Position - Position).Length() < 250f) || (gameHero.drivingVehicle != null && (gameHero.Position - Position).Length() < 800f)) { gameHero.HuntedLevel.Heard(gameHero.Position, false); LookAt(gameHero.Position); } if ((gameHero.Position - Position).Length() < 800f && insideBuilding == null && gameHero.drivingVehicle is Chopper && ((Chopper)gameHero.drivingVehicle).Height >0f && !(Weapons[SelectedWeapon] is Knife)) State = AIState.Attacking; break; case AIState.Chasing: Target = gameHero.Position; LookAt(gameHero.Position); if(gameHero.drivingVehicle is Chopper) State = AIState.Patrolling; if (((gameHero.Position - Position).Length() < 450f && CheckLineOfSight(gameHero.Position, gameMap)) || ((gameHero.Position - Position).Length() < 800f && gameHero.drivingVehicle is Chopper)) { Target = Position; State = AIState.Attacking; } break; case AIState.FollowingPath: if (Target == Position) { if (chasePath == null || regeneratePath) { if (genPathTime > 1000) { genPathTime = 0; regeneratePath = false; chasePath = PathFinder.FindPath(gameMap.AStarWorld, new Point3D((int)(Position.X / gameMap.TileWidth), (int)(Position.Y / gameMap.TileHeight), 0), new Point3D((int)(gameHero.Position.X / gameMap.TileWidth), (int)(gameHero.Position.Y / gameMap.TileHeight), 0)); if (chasePath != null) Target = new Vector2((chasePath.position.X * gameMap.TileWidth) + (gameMap.TileWidth / 2), (chasePath.position.Y * gameMap.TileHeight) + (gameMap.TileHeight / 2)); else State = AIState.Patrolling; } } else { chasePath = chasePath.next; if (chasePath != null) Target = new Vector2((chasePath.position.X * gameMap.TileWidth) + (gameMap.TileWidth / 2), (chasePath.position.Y * gameMap.TileHeight) + (gameMap.TileHeight / 2)); else State = AIState.Chasing; } } if (CheckLineOfSight(gameHero.Position, gameMap)) { Target = Position; // Stop dead in tracks State = AIState.Chasing; // Begin chasing player } break; case AIState.Attacking: if (gameHero.drivingVehicle is Chopper && insideBuilding != null) { State = AIState.Patrolling; break; } LookAt(gameHero.Position); bool shootUp = (gameHero.drivingVehicle != null && gameHero.drivingVehicle is Chopper && ((Chopper)gameHero.drivingVehicle).Height >0f); Attack(gameTime, gameHero.Position, true, gameCamera, !shootUp); if (Weapons[SelectedWeapon].GetType() != typeof(Knife)) { if ((gameHero.Position - Position).Length() > 450f) { if (gameHero.drivingVehicle == null) { Target = gameHero.Position; State = AIState.Chasing; } else State = AIState.Patrolling; } if (Helper.Random.Next(100) == 1) { Vector2 potentialTarget = Helper.RandomPointInCircle(Position, 100, 500); if (!gameMap.CheckCollision(potentialTarget)) Target = potentialTarget; } } else { if (gameHero.drivingVehicle == null) { Target = gameHero.Position; if ((gameHero.Position - Position).Length() < 100f) Target = Position; } else State = AIState.Patrolling; } break; case AIState.Investigating: if (Target == Position) { if (chasePath == null || regeneratePath) { if (genPathTime > 1000) { genPathTime = 0; regeneratePath = false; chasePath = PathFinder.FindPath(gameMap.AStarWorld, new Point3D((int)(Position.X / gameMap.TileWidth), (int)(Position.Y / gameMap.TileHeight), 0), new Point3D((int)(gameHero.HuntedLevel.LastKnownPosition.X / gameMap.TileWidth), (int)(gameHero.HuntedLevel.LastKnownPosition.Y / gameMap.TileHeight), 0)); if (chasePath != null) Target = new Vector2((chasePath.position.X * gameMap.TileWidth) + (gameMap.TileWidth / 2), (chasePath.position.Y * gameMap.TileHeight) + (gameMap.TileHeight / 2)); else State = AIState.Patrolling; } } else { chasePath = chasePath.next; if (chasePath != null) Target = new Vector2((chasePath.position.X * gameMap.TileWidth) + (gameMap.TileWidth / 2), (chasePath.position.Y * gameMap.TileHeight) + (gameMap.TileHeight / 2)); else State = AIState.Patrolling; } } if ((Position - gameHero.HuntedLevel.LastKnownPosition).Length() < 200f) State = AIState.Patrolling; if (CheckLineOfSight(gameHero.Position, gameMap)) { Target = Position; // Stop dead in tracks State = AIState.Chasing; // Begin chasing player } break; } if (gameHero.Dead) State = AIState.Patrolling; if (Health <= 0 && !Dead) { deadTime = 5000; deadAlpha = 1f; Dead = true; SpawnDrops(gameMap, gameHero); LightingEngine.Instance.RemoveSource(HeadTorch); ParticleController.Instance.AddBloodPool(Position); if (IsGeneral) { Hud.Instance.Ticker.AddLine("> You have eliminated a General! " + (3 - (3-EnemyController.Instance.Enemies.Count(e => e.IsGeneral && !e.Dead))) + "/" + (3)); } } if (IsGeneral) { if ((gameHero.Position - Position).Length() < 720f && !Discovered && gameHero.drivingVehicle==null && !LineCollision(gameHero.Position, gameMap, true)) { Discovered = true; Hud.Instance.Ticker.AddLine("> You have found a General!"); } } HeadTorch.Position = Helper.PointOnCircle(ref Position, 32, Rotation - MathHelper.PiOver2); HeadTorch.Rotation = Rotation - MathHelper.PiOver2; if (checkTorchTime > 250) { checkTorchTime = 0; if ((Position.X < gameCamera.Position.X - ((gameCamera.Width / gameCamera.Zoom) / 2) || Position.X > gameCamera.Position.X + ((gameCamera.Width / gameCamera.Zoom) / 2) || Position.Y < gameCamera.Position.Y - ((gameCamera.Height / gameCamera.Zoom) / 2) || Position.Y > gameCamera.Position.Y + ((gameCamera.Height / gameCamera.Zoom) / 2)) && LineCollision(gameHero.Position, gameMap, false)) { HeadTorch.Active = false; } } else if (!Dead) HeadTorch.Active = true; if (IsGeneral) Animations["head"].XOffset = 4; else Animations["head"].XOffset = 2; if (Dead) { if (deadTime <= 0) { deadAlpha -= 0.01f; } } if (Dead && deadTime <= 0 && deadAlpha <= 0f) { Active = false; } base.Update(gameTime, gameMap, mapFog, gameHero); }
public void Update(GameTime gameTime, Map gameMap, HeroDude gameHero) { foreach (Projectile p in Projectiles.Where(part => part.Active)) { p.Life -= gameTime.ElapsedGameTime.TotalMilliseconds; p.Position += p.Velocity; //p.Rotation += p.RotationSpeed; if (p.CanCollide && gameMap.CheckCollision(p.Position,false) == true) { p.Velocity = Vector2.Zero; p.RotationSpeed = 0f; } foreach (Vehicle v in VehicleController.Instance.Vehicles) { if (Helper.IsPointInShape(p.Position, v.CollisionVerts)) { v.HitByProjectile(p); p.Active = false; } } if (!p.Active) continue; if (p.Owner.GetType() == typeof(HeroDude)) { foreach (AIDude d in EnemyController.Instance.Enemies.Where(dude => dude.Active && !dude.Dead)) { if ((d.Position - p.Position).Length() < 60f) { d.HitByProjectile(p); p.Active = false; } } } if (!p.Active) continue; if (p.Owner.GetType() == typeof(AIDude)) { if ((gameHero.Position - p.Position).Length() < 60f) { gameHero.HitByProjectile(p); } } if (p.Life <= 0) { p.Active = false; } } Projectiles.RemoveAll(part => !part.Active); }