Vector2 getCollidedDest(Vector2 dest) { float shimmy = 10f; Terrain terrain = terrainCollider; if (this.getDestCenter(dest).X < terrain.collisionCenter.X) { if (this.getDestCenter(dest).Y < terrain.collisionCenter.Y && terrain.collisionCenter.Y - this.getDestCenter(dest).Y > terrain.collisionCenter.X - this.getDestCenter(dest).X) { dest.X = terrain.collisionBox.X - getWidth() - shimmy; dest.Y = terrain.collisionBox.Y - getHeight(); } else if (this.getDestCenter(dest).Y > terrain.collisionCenter.Y && this.getDestCenter(dest).Y - terrain.collisionCenter.Y > terrain.collisionCenter.X - this.getDestCenter(dest).X) { dest.X = terrain.collisionBox.X - getWidth() - shimmy; dest.Y = terrain.collisionBox.Y + terrain.collisionBox.Height; } else { if (this.getDestCenter(dest).Y < terrain.collisionCenter.Y) { dest.Y = terrain.collisionBox.Y - getHeight() - shimmy; dest.X = terrain.collisionBox.X - getWidth() - shimmy; } else { dest.Y = terrain.collisionBox.Y + terrain.collisionBox.Height + shimmy; dest.X = terrain.collisionBox.X - getWidth() - shimmy; } } } else { if (this.getDestCenter(dest).Y < terrain.collisionCenter.Y && terrain.collisionCenter.Y - this.getDestCenter(dest).Y > this.getDestCenter(dest).X - terrain.collisionCenter.X) { dest.X = terrain.collisionBox.X + terrain.collisionBox.Width + shimmy; dest.Y = terrain.collisionBox.Y - getHeight() - shimmy; } else if (this.getDestCenter(dest).Y > terrain.collisionCenter.Y && this.getDestCenter(dest).Y - terrain.collisionCenter.Y > this.getDestCenter(dest).X - terrain.collisionCenter.X) { dest.X = terrain.collisionBox.X + terrain.collisionBox.Width + shimmy; dest.Y = terrain.collisionBox.Y + terrain.collisionBox.Height + shimmy; } else { if (this.getDestCenter(dest).Y < terrain.collisionCenter.Y) { dest.Y = terrain.collisionBox.Y - getHeight() -shimmy; dest.X = terrain.collisionBox.X + terrain.collisionBox.Width + shimmy; } else { dest.Y = terrain.collisionBox.Y + terrain.collisionBox.Height + shimmy; dest.X = terrain.collisionBox.X + terrain.collisionBox.Width + shimmy; } } } terrainCollider = null; return dest; }
public override void collide(ScreenObject collider, TimeSpan timeSpan) { float shimmy = (float)timeSpan.TotalMilliseconds * _speed; if (collider == _killer || _state == STATE_DEAD || _state == STATE_DYING) return; if (collider is Terrain) { terrainCollider = (Terrain)collider; } else if (collider is Shot && collider.getSide() != _side && !(collider is Pavise) && collider.getState() != STATE_DEAD && collider.getState() != Shot.STATE_GROUND) { if (this is Targeteer) { if (collider is ArquebusierShot || (collider is CrossbowShot && collider.getSide() == BattleScreen.SIDE_PLAYER)) ((Targeteer)this).shieldBreak(); else ((Targeteer)this).shieldBlock(); } else if (this is CrossbowmanPavise) { if (_side == BattleScreen.SIDE_PLAYER) ((CrossbowmanPavise)this).shieldBlock(); else hit(); } else if (!(this is Leader) && (this._side == BattleScreen.SIDE_ENEMY || _screen.getPlayerFormation() == this.myFormation)) hit(); ((Shot)collider).hit(); _killer = collider; } else if ((collider is PikeTip && collider.getSide() != _side) && (_state != STATE_DEAD && _state != STATE_DYING && _state != STATE_ROUTE && _state != STATE_ROUTED)) { if (((PikeTip)collider).getSoldierState() == Pikeman.STATE_LOWERED) { if (!(this is Targeteer) && !(this is Wolf) && _side != BattleScreen.SIDE_NEUTRAL) { hit(); _killer = collider; ((PikeTip)collider).getPikeman().recoil(); } else if (this is Targeteer) { if ( (!(this is Colmillos) && ((Targeteer)this)._hasShield) || (this is Colmillos && !((ColmillosFormation)((Colmillos)this).myFormation).attacked)) { ((Targeteer)this).shield(); this.setReactionDest(collider.getCenter().X + 50f);//((collider.getSide() == BattleScreen.SIDE_ENEMY? 1 : -1 ) * collider.getWidth() * 0.5f + Soldier.WIDTH * 0.35f } else { hit(); _killer = collider; ((PikeTip)collider).getPikeman().recoil(); } } } } else if ((collider is WeaponSwing && collider.getSide() != _side) && (_state != STATE_DEAD && _state != STATE_DYING && _state != STATE_ROUTE && _state != STATE_ROUTED)) { if (((WeaponSwing)collider).getSoldier() is Colmillos) { if (!((WeaponSwing)collider).hit) { if (this is Targeteer) ((Targeteer)this).shieldBreak(); else { hit(); _killer = collider; } ((WeaponSwing)collider).hit = true; _screen.removeScreenObject(collider); } } else if (this is Targeteer) ((Targeteer)this).shieldBreak(); else { hit(); _killer = collider; } } else if ((collider is LanceTip && collider.getSide() != _side) && (_state != STATE_DEAD && _state != STATE_DYING && _state != STATE_MELEE_WIN && _state != STATE_MELEE_LOSS && _state != STATE_ROUTE && _state != STATE_ROUTED)) { if (this is Targeteer) ((Targeteer)this).shieldBreak(); else hit(); ((LanceTip)collider).getCavalry().recoil(); _killer = collider; } else if (collider is Soldier) { bool colliderInFormation = false; bool thisInFormation = false; if (_screen.getPlayerFormation() != null && _screen.getPlayerFormation().getSoldiers() != null) { colliderInFormation = ((Soldier)collider).myFormation == _screen.getPlayerFormation(); thisInFormation = myFormation == _screen.getPlayerFormation(); } if (_state != STATE_DEAD && _state != STATE_DYING && _state != STATE_MELEE_WIN && _state != STATE_MELEE_LOSS && (!(this is Targeteer) || _state != Targeteer.STATE_SHIELDBREAK) && (!(this is DismountedCavalry) || _state != DismountedCavalry.STATE_FALLING)) { if (this is CrossbowmanPavise && collider is CrossbowmanPavise && (this._state == STATE_CHARGING || this._state == STATE_RELOADING || this._state == STATE_ATTACKING || this._state == CrossbowmanPavise.STATE_PLACING || this._state == CrossbowmanPavise.STATE_RETRIEVING) && (collider.getState() == STATE_CHARGING || collider.getState() == STATE_RELOADING || collider.getState() == STATE_ATTACKING || collider.getState() == CrossbowmanPavise.STATE_PLACING || collider.getState() == CrossbowmanPavise.STATE_RETRIEVING)) { Vector2 changeVector = new Vector2(0f, (float)timeSpan.TotalMilliseconds * _speed); ((CrossbowmanPavise)this).postRetrieveState = _state; ((CrossbowmanPavise)this).paviseRetrieve(); if (this._position.Y < collider._position.Y) { this._position -= changeVector; ((CrossbowmanPavise)this)._meleeDestination -= changeVector; ((CrossbowmanPavise)this).chargePosition -= changeVector; } else { this._position += changeVector; ((CrossbowmanPavise)this)._meleeDestination += changeVector; ((CrossbowmanPavise)this).chargePosition += changeVector; } } //push from collisions with other charging enemy soldiers else if (myFormation == null && ((Soldier)collider).myFormation == null && _side == BattleScreen.SIDE_ENEMY && collider.getSide() == BattleScreen.SIDE_ENEMY && (collider.getState() != STATE_DYING && collider.getState() != STATE_DEAD)) { if (this._position.Y < collider._position.Y) { this._position -= new Vector2(0f, (float)timeSpan.TotalMilliseconds * _speed); } else { this._position += new Vector2(0f, (float)timeSpan.TotalMilliseconds * _speed); } } else { if (!((collider.getSide() == BattleScreen.SIDE_NEUTRAL && _side == BattleScreen.SIDE_PLAYER) || (collider.getSide() == BattleScreen.SIDE_PLAYER && _side == BattleScreen.SIDE_NEUTRAL))) { //fighting if (_side != collider.getSide() && !(this is Leader || collider is Leader) && collider.getState() != STATE_DEAD && collider.getState() != STATE_DYING && collider.getState() != STATE_MELEE_WIN && collider.getState() != STATE_MELEE_LOSS && (!(collider is Targeteer) || collider.getState() != Targeteer.STATE_SHIELDBREAK) && (!(collider is DismountedCavalry) || collider.getState() != DismountedCavalry.STATE_FALLING) && (!(collider is Wolf) || collider.getState() != Wolf.STATE_KILL) && (!(this is Wolf) || this._state != Wolf.STATE_KILL)) { bool rescueFight = (_side == BattleScreen.SIDE_PLAYER && !thisInFormation) || (collider.getSide() == BattleScreen.SIDE_PLAYER && !colliderInFormation); if (this is Colmillos) { if (_state != Colmillos.STATE_ATTACK) attack(); _destination = _position; } else if (collider is Colmillos) { if (collider.getState() != Colmillos.STATE_ATTACK) ((Colmillos)collider).attack(); ((Colmillos)collider)._destination = ((Colmillos)collider)._position; } else if (this is Dopple) { if (_state != STATE_ATTACKING) attack(); ((Soldier)collider).engage(false, _position, this, rescueFight); } else if (collider is Dopple) { if (collider.getState() != STATE_ATTACKING) ((Dopple)collider).attack(); engage(false, collider.getPosition(), (Soldier)collider, rescueFight); } else if (_side == BattleScreen.SIDE_ENEMY || this is Wolf) { engage(true, collider.getPosition(), (Soldier)collider, rescueFight); ((Soldier)collider).engage(false, _position, this, rescueFight); } else { engage(false, collider.getPosition(), (Soldier)collider, rescueFight); ((Soldier)collider).engage(true, _position, this, rescueFight); } } //rescue else if (_side == BattleScreen.SIDE_PLAYER && collider.getSide() == BattleScreen.SIDE_PLAYER && (thisInFormation != colliderInFormation)) { if (thisInFormation && collider.getState() != STATE_CHARGING && collider.getState() != STATE_DYING && collider.getState() != STATE_DEAD && collider.getState() != STATE_MELEE_LOSS && collider.getState() != STATE_MELEE_WIN && collider.getState() != STATE_ATTACKING && collider.getState() != STATE_RELOADING) { ((Soldier)collider)._state = STATE_READY; ((Soldier)collider)._reacting = false; if (((Soldier)collider).myFormation != null && ((Soldier)collider).myFormation != _screen.getPlayerFormation()) ((Soldier)collider).myFormation.removeSoldier(((Soldier)collider)); _screen.getPlayerFormation().addSoldier((Soldier)collider); _screen.removeLooseSoldier((Soldier)collider); } else if (colliderInFormation && this.getState() != STATE_CHARGING && this.getState() != STATE_DYING && this.getState() != STATE_DEAD && this.getState() != STATE_MELEE_LOSS && this.getState() != STATE_MELEE_WIN && this.getState() != STATE_ATTACKING && this.getState() != STATE_RELOADING) { _reacting = false; _state = STATE_READY; if (myFormation != null) myFormation.removeSoldier(this); _screen.getPlayerFormation().addSoldier(this); _screen.removeLooseSoldier(this); } } } } } } }
public static void getNewTerrain(int terrainClass, BattleScreen screen, float x, float y, int index) { Terrain newTerrain = null; switch (terrainClass) { case Terrain.CLASS_TREE0: newTerrain = new Terrain(screen, PikeAndShotGame.TREE0, BattleScreen.SIDE_PLAYER, x, y,new Rectangle((int)(x + PikeAndShotGame.TREE0.Width / 4), (int)(y + PikeAndShotGame.TREE0.Height *2/3), (int)(PikeAndShotGame.TREE0.Width / 2), (int)(PikeAndShotGame.TREE0.Height/8))); screen.addTerrain(newTerrain); break; case Terrain.CLASS_TREE1: newTerrain = new Terrain(screen, PikeAndShotGame.TREE1, BattleScreen.SIDE_PLAYER, x, y, new Rectangle((int)x + 20, (int)y + PikeAndShotGame.TREE1.Height / 2, PikeAndShotGame.TREE1.Width - 40, PikeAndShotGame.TREE1.Height/3)); screen.addTerrain(newTerrain); break; case Terrain.CLASS_TREE2: newTerrain = new Terrain(screen, PikeAndShotGame.TREE2, BattleScreen.SIDE_PLAYER, x, y); screen.addTerrain(newTerrain); break; case Terrain.CLASS_HORIROAD: newTerrain = new Terrain(screen, PikeAndShotGame.ROAD_HORIZONTAL, BattleScreen.SIDE_PLAYER, x, y, 0); screen.addTerrain(newTerrain); break; case Terrain.CLASS_HORIROAD2: newTerrain = new Terrain(screen, PikeAndShotGame.ROAD_HORIZONTAL_2, BattleScreen.SIDE_PLAYER, x, y, 0); screen.addTerrain(newTerrain); break; case Terrain.CLASS_TURNROAD: newTerrain = new Terrain(screen, PikeAndShotGame.ROAD_TURN, BattleScreen.SIDE_PLAYER, x, y, 0); screen.addTerrain(newTerrain); break; case Terrain.CLASS_TURNROADMARKER: newTerrain = new Terrain(screen, PikeAndShotGame.ROAD_TURN_MARKER, BattleScreen.SIDE_PLAYER, x, y, new Rectangle((int)(x + PikeAndShotGame.ROAD_TURN_MARKER.Width / 4), (int)(y + PikeAndShotGame.ROAD_TURN_MARKER.Height / 2), (int)(PikeAndShotGame.ROAD_TURN_MARKER.Width / 2), (int)(PikeAndShotGame.ROAD_TURN_MARKER.Height/8))); screen.addTerrain(newTerrain); break; case Terrain.CLASS_MILEROADMARKER: newTerrain = new Terrain(screen, PikeAndShotGame.ROAD_MILE_MARKER, BattleScreen.SIDE_PLAYER, x, y, new Rectangle((int)(x + PikeAndShotGame.ROAD_MILE_MARKER.Width / 4), (int)(y + PikeAndShotGame.ROAD_MILE_MARKER.Height /2), (int)(PikeAndShotGame.ROAD_MILE_MARKER.Width / 2), (int)(PikeAndShotGame.ROAD_MILE_MARKER.Height / 8))); screen.addTerrain(newTerrain); break; case Terrain.CLASS_BUSH0: newTerrain = new Terrain(screen, PikeAndShotGame.BUSH0, BattleScreen.SIDE_PLAYER, x, y); screen.addTerrain(newTerrain); break; case Terrain.CLASS_BUSH1: newTerrain = new Terrain(screen, PikeAndShotGame.BUSH1, BattleScreen.SIDE_PLAYER, x, y); screen.addTerrain(newTerrain); break; case Terrain.CLASS_BUSH2: newTerrain = new Terrain(screen, PikeAndShotGame.BUSH2, BattleScreen.SIDE_PLAYER, x, y); screen.addTerrain(newTerrain); break; } if (newTerrain != null) newTerrain.index = index; }
protected void spawnInitialTerrain() { int next = 0; for (int i = 0; i < 100; i++) { next = PikeAndShotGame.random.Next(7); Terrain terrain; if (next == 2) { terrain = new Terrain(this, PikeAndShotGame.ROAD_TERRAIN[next], SIDE_PLAYER, PikeAndShotGame.random.Next(PikeAndShotGame.SCREENWIDTH), PikeAndShotGame.random.Next(PikeAndShotGame.SCREENHEIGHT), 8000f, 1500f); _terrain.Add(terrain); } else { terrain = new Terrain(this, PikeAndShotGame.ROAD_TERRAIN[next], SIDE_PLAYER, PikeAndShotGame.random.Next(PikeAndShotGame.SCREENWIDTH), PikeAndShotGame.random.Next(PikeAndShotGame.SCREENHEIGHT)); _terrain.Add(terrain); } terrain.generated = true; } }
/// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> public virtual void update(GameTime gameTime) { getInput(gameTime.ElapsedGameTime); _elapsedTime = gameTime.TotalGameTime.TotalMilliseconds; foreach (Shot shot in _shots) { shot.update(gameTime.ElapsedGameTime); if (shot.isDead()) _deadThings.Add(shot); } if(_formation != null) _formation.update(gameTime.ElapsedGameTime); foreach (ScreenObject screeny in _screenObjectsToAdd) { _screenObjects.Add(screeny); } _screenObjectsToAdd.Clear(); foreach (ScreenAnimation screeny in this._screenAnimationsToAdd) { _screenAnimations.Add(screeny); } _screenAnimationsToAdd.Clear(); if (playerInPlay) { foreach (Formation f in _enemyFormations) { f.update(gameTime.ElapsedGameTime); if (f.getSide() == SIDE_ENEMY && (f.getPosition().X < (-1 * f.getTotalRows() * Soldier.WIDTH) + _mapOffset.X || f.getTotalRows() == 0)) { if (!f.hasSoldierOnScreen() && this is LevelScreen) _deadFormations.Add(f); } } } foreach (Formation f in _enemyFormationsToAdd) _enemyFormations.Add(f); _enemyFormationsToAdd.Clear(); //checking for empty or off screen formations foreach (Formation f in _deadFormations) { _enemyFormations.Remove(f); foreach (Soldier sold in f.getSoldiers()) _deadThings.Add(sold); } _deadFormations.Clear(); checkCollisions(gameTime.ElapsedGameTime); foreach (Soldier sold in _looseSoldiers) { sold.update(gameTime.ElapsedGameTime); if (sold.getSide() == BattleScreen.SIDE_PLAYER && sold.getPosition().X > PikeAndShotGame.SCREENWIDTH + getMapOffset().X + 2f * Soldier.WIDTH) sold.setState(Soldier.STATE_DEAD); else if (sold.getSide() == BattleScreen.SIDE_ENEMY && sold.getPosition().X < -210 + getMapOffset().X) sold.setState(Soldier.STATE_DEAD); if (sold.isDead()) { _deadThings.Add(sold); } } foreach (Soldier s in unlooseSoldiers) { _looseSoldiers.Remove(s); } unlooseSoldiers.Clear(); foreach (Terrain t in _terrain) { if (t.isAnimated()) { t.update(gameTime.ElapsedGameTime); } if (t.getPosition().X < -t.getWidth() + getMapOffset().X && !(this is LevelEditorScreen)) t.setState(Soldier.STATE_DEAD); if (t.isDead()) { _deadThings.Add(t); } } foreach (Soldier newThing in _newThings) { _looseSoldiers.Add(newThing); } _newThings.Clear(); // clean up of dead objects foreach (ScreenObject obj in _moreDeadThings) _deadThings.Add(obj); _moreDeadThings.Clear(); foreach (ScreenObject obj in _deadThings) { if (obj is Shot) _shots.Remove(obj); else if (obj is Soldier) { _looseSoldiers.Remove(obj); } else if (obj is Terrain) { _terrain.Remove(obj); if (((Terrain)obj).generated) { int terrainIndex = PikeAndShotGame.random.Next(7); Terrain terrain; if (terrainIndex == 2) { terrain = new Terrain(this, PikeAndShotGame.ROAD_TERRAIN[terrainIndex], SIDE_PLAYER, PikeAndShotGame.SCREENWIDTH + getMapOffset().X, PikeAndShotGame.random.Next(PikeAndShotGame.SCREENHEIGHT), 8000f, 1500f); _terrain.Add(terrain); } else { terrain = new Terrain(this, PikeAndShotGame.ROAD_TERRAIN[terrainIndex], SIDE_PLAYER, PikeAndShotGame.SCREENWIDTH + getMapOffset().X, PikeAndShotGame.random.Next(PikeAndShotGame.SCREENHEIGHT)); _terrain.Add(terrain); } terrain.generated = true; } } if (obj is WeaponSwing) ((WeaponSwing)obj).getHeight(); _screenObjects.Remove(obj); } _deadThings.Clear(); // screen animations foreach (ScreenAnimation ani in _screenAnimations) { ani.update(gameTime.ElapsedGameTime); if (ani.isDone()) _deadThings.Add(ani); } foreach (Object ani in _deadThings) { if (ani is ScreenAnimation) _screenAnimations.Remove(ani); else if (ani is ScreenObject) _screenObjects.Remove(ani); } _deadThings.Clear(); }
public void addTerrain(Terrain t) { _terrain.Add(t); }