/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
public void Draw(GameTime gameTime, SpriteBatch spriteBatch) // draw everything on the screen
{
game_state.tile_engine.getCurrentMap().drawBackground(spriteBatch, game_state.local_player.getX(), game_state.local_player.getY());
game_state.tile_engine.getCurrentMap().drawObjects(spriteBatch, game_state.local_player.getX(), game_state.local_player.getY());
if (game_state.local_player.getX() <= 400 - 16)
{
character_sprite[(int)game_state.local_player.getWeapon()].loc.X = game_state.local_player.getX();
}
else
{
if (game_state.local_player.getX() >= game_state.tile_engine.getCurrentMap().getWidth() * game_state.tile_engine.getTileSize() - 400 - 16)
{
character_sprite[(int)game_state.local_player.getWeapon()].loc.X = game_state.local_player.getX() - (game_state.tile_engine.getCurrentMap().getWidth() * game_state.tile_engine.getTileSize() - 800);
}
else
{
character_sprite[(int)game_state.local_player.getWeapon()].loc.X = (800 / 2) - 16;// -(32 / 2);
}
}
if (game_state.local_player.getY() <= 240 - 16)
{
character_sprite[(int)game_state.local_player.getWeapon()].loc.Y = game_state.local_player.getY();
}
else
{
if (game_state.local_player.getY() >= game_state.tile_engine.getCurrentMap().getHeight() * game_state.tile_engine.getTileSize() - 240 - 16)
{
character_sprite[(int)game_state.local_player.getWeapon()].loc.Y = game_state.local_player.getY() - (game_state.tile_engine.getCurrentMap().getHeight() * game_state.tile_engine.getTileSize() - 480);
}
else
{
character_sprite[(int)game_state.local_player.getWeapon()].loc.Y = (480 / 2) - 16;// - (32 / 2);
}
}
// Fade a color over the player if they are hurt or have a boost active
bool shouldFadeHurt = game_state.local_player.hurt;
bool shouldFadeAttack = game_state.local_player.getAttackBonus() > 0;
bool shouldFadeDefense = game_state.local_player.getDefenseBonus() > 0;
Color toFade;
//choose arbitrary colors for boosts
if (shouldFadeHurt)
{
toFade = Color.Red;
}
else if (shouldFadeAttack && shouldFadeDefense)
{
toFade = Color.LightGreen;
}
else if (shouldFadeAttack)
{
toFade = Color.LightYellow;
}
else if (shouldFadeDefense)
{
toFade = Color.LightBlue;
}
else
{
toFade = Color.White;
}
if (sword_swing) // if the sword has been swung
{
sword_sprite.loc = character_sprite[(int)game_state.local_player.getWeapon()].loc;
sword_sprite.Draw(spriteBatch, (int)game_state.local_player.getDirection(), (shouldFadeHurt || shouldFadeAttack || shouldFadeDefense), toFade);
}
else
{
character_sprite[(int)game_state.local_player.getWeapon()].Draw(spriteBatch, (shouldFadeHurt || shouldFadeAttack || shouldFadeDefense), toFade);
}
//Draw monsters
List <Enemy> monsters = game_state.monster_engine.GetMonsters();
int offset_x = game_state.local_player.getX() - (int)character_sprite[(int)game_state.local_player.getWeapon()].loc.X;
int offset_y = game_state.local_player.getY() - (int)character_sprite[(int)game_state.local_player.getWeapon()].loc.Y;
for (int i = 0; i < monsters.Count(); ++i)
{
Enemy monster = monsters.ElementAt(i);
if (game_state.monster_engine.IsVisible(monster))
{
Sprite mons_sprite = monster.getSprite();
mons_sprite.loc.X = monster.getX() - offset_x;
mons_sprite.loc.Y = monster.getY() - offset_y;
if (mons_sprite.loc.X > 0 && mons_sprite.loc.X < 800)
{
if (mons_sprite.loc.Y > 0 && mons_sprite.loc.Y < 400)
{
mons_sprite.Draw(spriteBatch); //Draw if the location is not negative
}
}
}
}
List <Bullet> bullets = game_state.bullet_engine.GetBullets();
//draw the bullets appropriately
for (int i = 0; i < bullets.Count(); ++i)
{
Bullet bullet = bullets.ElementAt(i);
if (bullet.type != bulletType.SWORD)
{
bullet_sprite.loc.X = bullet.x - offset_x;
bullet_sprite.loc.Y = bullet.y - offset_y;
bullet_sprite.Draw(spriteBatch);
}
}
game_state.tile_engine.getCurrentMap().drawForeground(spriteBatch, game_state.local_player.getX(), game_state.local_player.getY());
game_state.fx_engine.Draw(spriteBatch, offset_x, offset_y);
//Draw HUD
//begin operations on display textures
//gets spritebatch in a state to be 'ready' to draw
//******************DRAWING ARROWS**************************//
spriteBatch.Draw(uparrow, uparrowpos, null, trans, 0, imageOffset, 4.0f, SpriteEffects.None, 0);
spriteBatch.Draw(downarrow, downarrowpos, null, trans, 0, imageOffset, 4.0f, SpriteEffects.None, 0);
spriteBatch.Draw(leftarrow, leftarrowpos, null, trans, 0, imageOffset, 4.0f, SpriteEffects.None, 0);
spriteBatch.Draw(rightarrow, rightarrowpos, null, trans, 0, imageOffset, 4.0f, SpriteEffects.None, 0);
spriteBatch.Draw(fire_button, fire_button_pos, null, trans, 0, imageOffset, 3.0f, SpriteEffects.None, 0);
spriteBatch.DrawString(displayFont, "FIRE!", new Vector2(fire_button_pos.X + 38, fire_button_pos.Y + 45), Color.Black);
//draw the arrow graphics to the screen with given position, 3x as big as original size, no effects
//************************************************************//
//***********************DRAWING GRAPHIC SPRITES***********************//
spriteBatch.Draw(backpack, backpackpos, null, trans, 0, imageOffset, new Vector2(0.4f, 1.0f), SpriteEffects.None, 0); //draw the backpack "button"
spriteBatch.DrawString(displayFont, "Inventory", new Vector2(backpackpos.X + 20, backpackpos.Y + 12), Color.Black);
spriteBatch.Draw(healthbar_empty, health_bar_empty_rec, null, trans); //draw health bar
spriteBatch.Draw(healthbar_full, health_bar_rec, null, trans); //draw health bar
string curHealth = "" + game_state.local_player.getHealth();
string maxHealth = "" + game_state.local_player.getMaxHealth();
spriteBatch.DrawString(displayFont, "Health: " + curHealth + "/" + maxHealth, new Vector2(health_bar_rec.X + 42, health_bar_rec.Y + 5), Color.Black);
//********************************************************************//
//***************************DRAWING STRINGS***********************************//
spriteBatch.DrawString(displayFont, levelstring, scoreStringPos, Color.Cyan); // draw "level: "
spriteBatch.DrawString(displayFont, game_state.tile_engine.getCurrentLevelName(), currScorePos, Color.Cyan); // draw level number
spriteBatch.DrawString(displayFont, livesString + livesRemaining.ToString(), livesStringPos, Color.Cyan); // draw lives remaining
//****************************************************************************//
//check to see if the score needs to continue to be drawn (if time hasn't run out)
//if it has, undraw it and display time expired string and menu
if (!hasTimeLeft())
{
die();
if (hasMoreLives())
{
timex.Show(spriteBatch); // brings up time expired screen
}
}
else
{
spriteBatch.DrawString(displayFont, timeLeft, timeLeftPos, Color.Cyan);
spriteBatch.DrawString(displayFont, ((int)(currTime.TotalSeconds)).ToString(), timePos, Color.Cyan);
}
if (backpackmenu.backpack_touched) // backpack button has been pressed
{
if (hasTimeLeft()) // if time hasnt run out during the period where the inventory is brought up by the user, show the inventory
{
backpackmenu.Show(spriteBatch); // draw backpack menu
drawItems(spriteBatch, itemfont); // draw items according to layout in itemfont
}
else // time has run out while the inventory is up, hide inventory and bring up time expired menu
{
backpackmenu.Hide();
timex.Show(spriteBatch);
}
}
} // end draw function