public void Collided(Collision collision, World world, Particles particles) { var go = collision.GameObject; if (go is Rocket || go is PlasmaBullet) { for (int h = 0; h < 100; h++) particles.Emit(ParticleManager.Explosion, (go.Position + Position) / 2f, Chaos.GetVector2InCircle(3f)); if (go is Rocket) HP -= 7; else HP -= 3; if (HP <= 0) IsDestroyed = true; } if (go is Asteroid) { if (collision.Time > 0) Response.Apply(this, collision); for (int i = 0; i < collision.GameObject.Collisions.Count; i++) if (collision.GameObject.Collisions[i].GameObject == this) { CollisionPool.Instance.PutObject(collision.GameObject.Collisions[i]); collision.GameObject.Collisions[i] = null; } collision.GameObject.Collisions.RemoveAll(c => c == null); } }
public Ship CreateShip(Vector2 position, World world) { Ship ship = _ships.GetObject(); ship.Reset(position, world); AddObject(ship); return ship; }
public EnemyShip CreateEnemyShip(Vector2 position, World world, Ship target) { EnemyShip enemyShip = _enemyShips.GetObject(); enemyShip.Reset(position, world, target); AddObject(enemyShip); return enemyShip; }
public void Reset(Vector2 position, World world, Ship target) { _target = target; base.Reset(position, world); _weapon = new PlasmaGun(this); }
public virtual void Update(World world, Particles particles) { Position += Speed; Position = new Vector2( (Position.X + Game.WorldWidth) % Game.WorldWidth, (Position.Y + Game.WorldHeight) % Game.WorldHeight); Rotation += RotationSpeed; }
public override void Update(World world, Particles particles) { base.Update(world, particles); if (_state >= 1f) { IsDestroyed = true; return; } Size = Lerp.OfFloat(_particleParameters.Sizes, _state * (_particleParameters.Sizes.Length - 1)); Color = Lerp.OfColor(_particleParameters.Colors, _state * (_particleParameters.Colors.Length - 1)); Alpha = Lerp.OfFloat(_particleParameters.Alphas, _state * (_particleParameters.Alphas.Length - 1)); _state += _step; }
public void Reset(Vector2 position, World world) { DrawHP = true; _world = world; _weapon = new SinGun(this); _weaponAlt = new RocketLauncher(this); Mass = 20f; Position = position; Size = 48; }
public void Update(World world, Particles particles) { for (int i = 0; i < _particles.Count; i++) { _particles[i].Update(world, particles); if ((_particles[i]).IsDestroyed) { _particlePool.PutParticle((Particle)_particles[i]); _particles[i] = null; } } _particles.RemoveAll(p => p == null); }
public void Update(World world, Particles particles) { for (int i = 0; i < _gameObjects.Count; i++) { var obj = _gameObjects[i]; obj.Update(world, particles); if (obj.IsDestroyed) { obj.ResetGameObject(); Game.Objects.ReleaseObject(obj); _gameObjects[i] = null; } } _gameObjects.RemoveAll(o => o == null); }
public static void Detect(List<GameObject>[,] clusters, World gameObjects) { for (int k = 0; k < gameObjects.Count; k++) { for (int i = 0; i < gameObjects[k].Collisions.Count; i++) CollisionPool.Instance.PutObject(gameObjects[k].Collisions[i]); gameObjects[k].Collisions.Clear(); } int ww = clusters.GetLength(1); int wh = clusters.GetLength(0); // обход по кластерам for (int wj = 0; wj < wh; wj++) for (int wi = 0; wi < ww; wi++) { // обход по окресности кластера 3x3 for (int k = 0; k < 5; k++) { int di = 0; int dj = 0; switch (k) { case 0: di = 0; dj = 0; break; case 1: di = 1; dj = -1; break; // . . 1 case 2: di = 1; dj = 0; break; // . 0 2 case 3: di = 1; dj = 1; break; // . 4 3 case 4: di = 0; dj = 1; break; } int clui = (wi + di + ww) % ww; int cluj = (wj + dj + wh) % wh; float fx = (wi + di - clui) * Game.ClusterSize; float fy = (wj + dj - cluj) * Game.ClusterSize; // обсчёт столкновений 9 кластеров for (int j = 0; j < clusters[cluj, clui].Count; j++) for (int i = k == 0 ? j : 0; i < clusters[wj, wi].Count; i++) { if (cluj == wj && clui == wi && i == j) // skip self continue; var go1 = clusters[cluj, clui][j]; var go2 = clusters[wj, wi][i]; float dx = go2.Position.X - go1.Position.X - fx; float dy = go2.Position.Y - go1.Position.Y - fy; float dv = go2.Speed.X - go1.Speed.X; float du = go2.Speed.Y - go1.Speed.Y; float rr = go2.Size / 2 + go1.Size / 2; if (dv == 0f || du == 0f) { float ol2 = rr * rr - dx * dx - dy * dy; if (ol2 > 0) { go1.Collisions.Add(CollisionPool.Instance.GetObject(go2, ol2, 0f, new Vector2(dx, dy))); go2.Collisions.Add(CollisionPool.Instance.GetObject(go1, ol2, 0f, new Vector2(-dx, -dy))); } } else { float a = dv * dv + du * du; float b = 2f * (dv * dx + du * dy); float c = dx * dx + dy * dy - rr * rr; float disc = b * b - 4f * a * c; if (disc < 0) continue; float t1 = (-b + Maf.Sqrt(disc)) / (2f * a); float t2 = (-b - Maf.Sqrt(disc)) / (2f * a); float min = Math.Min(t1, t2); float max = Math.Max(t1, t2); float ol2 = rr * rr - dx * dx - dy * dy; if (min < 1f && max >= 0f) { go1.Collisions.Add(CollisionPool.Instance.GetObject(go2, ol2, min, new Vector2(dx, dy))); go2.Collisions.Add(CollisionPool.Instance.GetObject(go1, ol2, min, new Vector2(-dx, -dy))); } } } } } }
public override void Update(World world, Particles particles) { _weapon.Update(_world); _weaponAlt.Update(_world); foreach (var col in Collisions) Collided(col, world, particles); if (_speedBonusTime > 0) { _boost = 2.0f; _speedBonusTime--; if (_acceleration > 0) particles.Emit(ParticleManager.EngineNitro, Position - new Vector2(10f * Maf.Sin(Rotation), -10f * Maf.Cos(Rotation)), Speed - _acceleration * new Vector2(8f * Maf.Sin(Rotation), -8f * Maf.Cos(Rotation)) + Chaos.GetVector2InCircle()); } else { _boost = 1.0f; if (_acceleration > 0) particles.Emit(ParticleManager.EngineFire, Position - new Vector2(10f * Maf.Sin(Rotation), -10f * Maf.Cos(Rotation)), Speed - _acceleration * new Vector2(8f * Maf.Sin(Rotation), -8f * Maf.Cos(Rotation)) + Chaos.GetVector2InCircle()); } base.Update(world, particles); Speed *= .99f; }
private void Collided(Collision col, World world, Particles particles) { if (col.GameObject is SpeedBonus) { _speedBonusTime = 1000; } if (col.GameObject is Medkit) HP = MaxHP; if (col.GameObject is PlasmaBullet) HP -= 3; if (col.GameObject is Rocket) HP -= 7; if (HP <= 0) { var t = this.GetType(); Game.WinShip(t); for (int i = 0; i < _world.Count; i++) { var ship = _world[i] as Ship; if (ship != null && ship.HP < 0) { ship.HP = ship.MaxHP; ship.Position = Chaos.GetVector2InRectangle(Game.WorldWidth, Game.WorldHeight); } } } }
private void Collided(Collision col, World world, Particles particles) { if (col.GameObject is Ship) IsDestroyed = true; }
public override void Update(World world, Particles particles) { foreach (var col in Collisions) Collided(col, world, particles); base.Update(world, particles); }
public override void Update(World world, Particles particles) { var d_pos = _target.Position - Position; float dx = ((d_pos.X + Game.WorldWidth / 2) % Game.WorldWidth) - Game.WorldWidth / 2; float dy = ((d_pos.Y + Game.WorldHeight / 2) % Game.WorldHeight) - Game.WorldHeight / 2; var directionTargetBegin = new Vector2(dx, dy); var nrm_directionTargetBegin = directionTargetBegin; nrm_directionTargetBegin.Normalize(); //var time_Speed = directionTarget.Length() // / ( // Vector2.Dot(_target.Speed, new Vector2(-nrm_directionTarget.X, -nrm_directionTarget.Y)) // + Vector2.Dot(Speed, nrm_directionTarget) // ); //var directionTargetEnd = directionTargetBegin * Speed / (Speed - _target.Speed); //var nrm_directionTargetEnd = directionTargetEnd; //nrm_directionTargetEnd.Normalize(); var time_weapon = directionTargetBegin.Length() / (_weapon.Speed + Vector2.Dot(Speed, nrm_directionTargetBegin)); TargetPos = _target.Position + time_weapon * (_target.Speed - Speed); var t = directionTargetBegin - time_weapon * (Speed - _target.Speed); float ang = Maf.Atan2(t.Y, t.X); Rotation = ang + MathHelper.PiOver2; var dir = new Vector2(Maf.Cos(ang), Maf.Sin(ang)); var nrm = new Vector2(dir.Y, -dir.X); var accel = Vector2.Dot(nrm_directionTargetBegin, dir); var strafe = Vector2.Dot(nrm_directionTargetBegin, nrm); //var distanceVector = new Vector2(directionTarget.X - time_Speed * (Speed.X - _target.Speed.X), directionTarget.Y - time_Speed * (Speed.Y - _target.Speed.Y)); float distance_length = (directionTargetBegin).Length(); //if (HP < (MaxHP / 2)) //{ // ; //} //else if (distance_length > 600.0f) { SpeedUp(accel); Strafe(strafe); //ShootAlt(Input.InputDigitalState.Released); } else if (distance_length > 400.0f) { _strafe = Chaos.GetFloat(-.2f, .2f); _accel = Chaos.GetFloat(-.05f, .05f); SpeedUp(0.4f * accel); Strafe(0.4f * strafe); //Shoot(Input.InputDigitalState.Released); } else if (distance_length < 200.0f) { _strafe = Chaos.GetFloat(-.2f, .2f); _accel = Chaos.GetFloat(-.05f, .05f); SpeedUp(-0.2f * accel); Strafe(-0.2f * strafe); //Shoot(Input.InputDigitalState.Pressed); } else if (distance_length < 100.0f) { SpeedUp(-accel); Strafe(-strafe); //Shoot(Input.InputDigitalState.Pressed); } else { SpeedUp(_accel); Strafe(_strafe); //ShootAlt(Input.InputDigitalState.Pressed); } Shoot(Input.InputDigitalState.Pressed); base.Update(world, particles); }