Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
FRANCA
2012
CÓDIGO
SUMÁRIO
1 CAMERA.cs .....................................................................................................4
2 CASAS.cs...........................................................................................................5
3 CONTROLE.cs................................................................................................10
4 FASE1.cs...........................................................................................................14
5 GAME1.cs........................................................................................................29
6 HUD.cs .............................................................................................................44
7 ITEM.cs............................................................................................................47
8 NPC.cs .............................................................................................................48
9 OBJETO.cs.......................................................................................................55
10 PERSONAGEM.cs..........................................................................................57
11 TV.cs .............................................................................................................65
12 SPRITES.cs......................................................................................................68
4
1. CAMERA.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Kane_1._0
{
class Camera
{
public float Zoom;
public float Rotation;
public Matrix transform;
public Vector2 Position, Origin;
public float deslocamentoCameraY;
//centro da tela
Origin = new Vector2(viewport.Width / 2.0f, viewport.Height / 2.0f);
}
return transform;
}
KeyboardState k = Keyboard.GetState();
if (k.IsKeyDown(Keys.S))
{
deslocamentoCameraY += 5;
}
if (k.IsKeyDown(Keys.Up))
{
Zoom += 0.01f;
}
if (k.IsKeyDown(Keys.Down))
{
Zoom -= 0.01f;
}
Position = pos - (Origin + new Vector2(0, deslocamentoCameraY));//A camera
vai centralizar no jogador, o numero dentro do vetor é o offset para deslocar a camera
para os lados
}
}
}
2 CASAS.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Kane_1._0
{
class Casas : Sprites
{
public bool entrouNaCasa;
public bool entrouNaCasaSetInteriorFlag; //se as for false, os elementos do
interior nao foram setados, se for true, elas já foram e nao devem ser setados novamente
public bool isFinal = false;
public bool fimDeFase = false;
public int tipo;
public Vector2 posPorta1Exterior;
public Vector2 posPorta2Exterior;
public Vector2 posPorta1Interior;
public Vector2 posPorta2Interior;
public Texture2D texPorta1;
public Texture2D texPorta2;
public Texture2D texPorta1interior;
public List<Sprites> ground; //chao
public List<Sprites> cenario; //demais esprites do cenario que não necessitam de
verificação de colisao
public List<Objetos> walls; //limites onde os personagens podem andar
public List<NPC> inimigo; //inimigos
public List<TV> tv; //tv's
public List<Item> item; //itens
if(isFinal)
if (kane.corpo().Intersects(cenario[4].corpo()))
fimDeFase = true;
if (!entrouNaCasa)
{
if (texPorta1 != null)
{
if (corpo().Intersects(kane.corpo()) && k.IsKeyDown(Keys.W) &&
kOld.IsKeyUp(Keys.W) && !kane.pulou)
{
if (new Rectangle((int)(posicao.X + posPorta1Exterior.X), (int)
(posicao.Y + (altura - 120) + posPorta1Exterior.Y), 80, 120).Intersects(kane.corpo()))
{
entrouNaCasa = true;
entrarPelaSegundaPorta = false;
portaSom.Play();
}
7
if (texPorta2 != null)
if (new Rectangle((int)(posicao.X + posPorta2Exterior.X),
(int)(posicao.Y + (altura - 120) + posPorta2Exterior.Y), 80,
120).Intersects(kane.corpo()))
{
entrouNaCasa = true;
entrarPelaSegundaPorta = true;
portaSom.Play();
}
}
}
}
else
{
entrouNaCasaSetInteriorFlag = true;
if (texPorta2 != null)
{
if (new Rectangle((int)(posPorta2Interior.X), (int)
(posPorta2Interior.Y), 80, 120).Intersects(kane.corpo()))
{
entrouNaCasa = false;
sairPelaSegundaPorta = true;
portaSom.Play();
}
}
}
npc.tvControladora == null)
npc.tvControladora = t;
}
if (i.tipo >= 1)
{
// kane.item = i.tipo;
i.foiPego = true;
kane.dano = 0;
}
}
}
posicaoKane = kane.posicao;
}
kOld = k;
menuPause = false;
}
if (!entrouNaCasa)
{
spriteBatch.Draw(texPorta1, new Rectangle((int)(posicao.X +
posPorta1Exterior.X), (int)(posicao.Y + (altura - 120) + posPorta1Exterior.Y), 95, 158),
null, Color.White, 0, Vector2.Zero, SpriteEffects.None, camada);
if(texPorta2 != null)
spriteBatch.Draw(texPorta2, new Rectangle((int)(posicao.X +
posPorta2Exterior.X), (int)(posicao.Y + (altura - 120) + posPorta2Exterior.Y), 95, 158),
null, Color.White, 0, Vector2.Zero, SpriteEffects.None, camada);
base.Draw(spriteBatch);
}
else
{
foreach (Objetos ob in walls)
{
ob.Draw(spriteBatch);
}
if(texPorta1interior == null)
spriteBatch.Draw(texPorta1, new Rectangle((int)(posPorta1Interior.X),
(int)posPorta1Interior.Y, 95, 158), null, new Color(100, 100, 100, 50), 0, Vector2.Zero,
SpriteEffects.None, 0);
else
spriteBatch.Draw(texPorta1interior, new Rectangle((int)
(posPorta1Interior.X), (int)posPorta1Interior.Y, 95, 158), null, new Color(100, 100,
100, 50), 0, Vector2.Zero, SpriteEffects.None, 0);
if (texPorta2 != null)
spriteBatch.Draw(texPorta2, new Rectangle((int)
(posPorta2Interior.X), (int)posPorta2Interior.Y, 95, 158), null, new Color(100, 100,
100, 50), 0, Vector2.Zero, SpriteEffects.None, 0);
k = Keyboard.GetState();
if (k.IsKeyDown(Keys.Escape) && kOld.IsKeyUp(Keys.Escape))
{
if (menuPause)
menuPause = false;
else
menuPause = true;
}
kOld = k;
}
}
3 CONTROLE.CS
using System;
usIng System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Kane_1._0
{
//Classe responsavel pelo controle de TV.
class Controle
{
//controle
public Vector2[] posicaoBotao; //vetor com a posicao de cada botao
public Texture2D[] texBotao; //vetor com a textura de cada botao
public Color[] corBotao; //vetor com a cor de cada botao
public bool[] botaoPressionado;
public int[] tempoBotaoPressionado;
SoundEffect censor;
public bool luzLigada;
public int tempoLuzPisca;
public int fase = 1;
public int energia; //quantidade de nergia do controle, se chegar a 0, o
controle nao pode ser usado
public int botaoSelecionado;//valor de 0 a 8, que corresponde a qual botao do
controle o jogador apertou
private MouseState mOld;
private GamePadState gOld;
public bool isTvSelected; //o controle so pode ser usado se o jogador tiver
selecionado uma TV para controlar
SoundEffectInstance som_botaoSelecionadoInstance;
SoundEffect som_botaoSelecionado;
}
}
public Rectangle corpo(int i)
{
corBotao[1] = Color.White;
}
public void verificaColisaoBotao()
{
for (int i = 0; i < 9; i++)
{
if (botaoPressionado[i])
tempoBotaoPressionado[i]++;
}
}
else
{
corBotao[i] = Color.White;
}
}
if (fase == 2)
{
if (i == 0 || i == 7 || i == 8)
if (corpo(i).Intersects(new Rectangle((int)m.X,
(int)m.Y, 1, 1)))//verifica se intersectou nos botoes
{
corBotao[i] = Color.Gray;
if ((m.LeftButton == ButtonState.Pressed &&
mOld.LeftButton == ButtonState.Released) ||
(g.IsButtonDown(Buttons.RightShoulder)) &&
gOld.IsButtonUp(Buttons.RightShoulder))//verifica se clicou
{
energia--;
botaoPressionado[i] = true;
botaoSelecionado = i;
som_botaoSelecionadoInstance.Play();
}
}
else
{
corBotao[i] = Color.White;
}
}
}
}
mOld = m;
gOld = g;
}
else
{
for (int i = 0; i < 9; i++)
botaoPressionado[i] = false;
}
if(energia>0)
if (isTvSelected)
{
luzLigada = true;
tempoLuzPisca++;
}
14
else
{
luzLigada = false;
tempoLuzPisca = 0;
}
}
4 FASE1.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Kane_1._0
{
class Fase1
{
public bool setouPrimeiraVez;
public bool isInteriorCasa;
HUD Hud; //interface do jogo (HUD)
15
//fundo
fundo = Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\background");
cenario.Add(new Sprites(new Vector2(-6000, -530), fundo, fundo.Width,
fundo.Height, 0, 1));
cenario[0].layerY = 0.7f;
cenario.Add(new Sprites(new Vector2(-6000 + fundo.Width, -530), fundo,
fundo.Width, fundo.Height, 0, 1));
cenario[1].layerY = 0.7f;
cenario.Add(new Sprites(new Vector2(-6001 + fundo.Width * 2, -530), fundo,
fundo.Width, fundo.Height, 0, 1));
cenario[2].layerY = 0.7f;
cenario.Add(new Sprites(new Vector2(-6001 + fundo.Width * 3, -530), fundo,
fundo.Width, fundo.Height, 0, 1));
cenario[3].layerY = 0.7f;
cenario.Add(new Sprites(new Vector2(-6001 + fundo.Width * 4, -530), fundo,
fundo.Width, fundo.Height, 0, 1));
cenario[4].layerY = 0.7f;
//neblina
cenario.Add(new Sprites(new Vector2(-7000, 500),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\neblina"), 15000, 500, 0, 1));
cenario[5].layerY = 0.7f;
//casa 1
casas.Add(new Casas(new Vector2(-4000, 370),
16
//casa 2
casas.Add(new Casas(new Vector2(-3000, 380),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\2\casa"), 520, 368, 0, 1, Content));
casas[1].texPorta1 =
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\2\porta");
casas[1].posPorta1Exterior = new Vector2(235, -38);
casas[1].posPorta1Interior = new Vector2(660, 340);
casas[1].tipo = 2;
//casa 6
casas.Add(new Casas(new Vector2(2000, 290),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\6\casa"), 1000, 460, 0, 1, Content));
casas[2].texPorta1 =
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\6\porta");
casas[2].texPorta2 =
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\6\porta2");
casas[2].posPorta1Exterior = new Vector2(477, -38);
casas[2].posPorta1Interior = new Vector2(200, 750);
casas[2].posPorta2Exterior = new Vector2(854, -38);
casas[2].posPorta2Interior = new Vector2(1200, 750);
casas[2].tipo = 3;
//casa 5
casas.Add(new Casas(new Vector2(600, 150),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\5\casa"), 1000, 600, 0, 1, Content));
casas[3].texPorta1 =
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\1\porta");
casas[3].posPorta1Exterior = new Vector2(725, -38);
casas[3].posPorta1Interior = new Vector2(1300, 540);
casas[3].tipo = 4;
//casa 3
casas.Add(new Casas(new Vector2(-1800, 185),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\3\casa"), 1000, 565, 0, 1, Content));
casas[4].texPorta1 =
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\3\porta");
casas[4].posPorta1Exterior = new Vector2(440,-38);
casas[4].posPorta1Interior = new Vector2(900, 330);
casas[4].tipo = 5;
//casa 4
casas.Add(new Casas(new Vector2(-500, 368),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\4\casa"), 800, 382, 0, 1, Content));
casas[5].texPorta1 =
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\4\porta");
casas[5].texPorta1interior =
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\4\portaInterior");
casas[5].posPorta1Exterior = new Vector2(582, -36);
casas[5].posPorta1Interior = new Vector2(850, 340);
casas[5].tipo = 6;
//casa 7 - policia
casas.Add(new Casas(new Vector2(3500, 330),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\Policia\casa"), 1100, 420, 0, 1,
17
Content));
casas[6].texPorta1 =
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\Policia\porta");
casas[6].posPorta1Exterior = new Vector2(350, -38);
casas[6].posPorta1Interior = new Vector2(0, 340);
casas[6].tipo = 7;
//casas azul
cenario.Add(new Sprites(new Vector2(-5900, 120),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\casasFundo"), 1300, 500, 0, 1.05f));
cenario.Add(new Sprites(new Vector2(-4600, 120),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\casasFundo"), 1300, 500, 0, 1.05f));
cenario.Add(new Sprites(new Vector2(-3300, 120),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\casasFundo"), 1300, 500, 0, 1.05f));
cenario.Add(new Sprites(new Vector2(-2000, 120),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\casasFundo"), 1300, 500, 0, 1.05f));
cenario.Add(new Sprites(new Vector2(-700, 120),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\casasFundo"), 1300, 500, 0, 1.05f));
cenario.Add(new Sprites(new Vector2(600, 120),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\casasFundo"), 1300, 500, 0, 1.05f));
cenario.Add(new Sprites(new Vector2(1900, 120),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\casasFundo"), 1300, 500, 0, 1.05f));
cenario.Add(new Sprites(new Vector2(3200, 120),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\casasFundo"), 1300, 500, 0, 1.05f));
//casas sortidas
cenario.Add(new Sprites(new Vector2(-5900, 350),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\layer6_h"), 1300, 300, 0, 1.03f));
cenario.Add(new Sprites(new Vector2(-4600, 350),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\layer6_h"), 1300, 300, 0, 1.03f));
cenario.Add(new Sprites(new Vector2(-3300, 350),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\layer6_h"), 1300, 300, 0, 1.03f));
cenario.Add(new Sprites(new Vector2(-2000, 350),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\layer6_h"), 1300, 300, 0, 1.03f));
cenario.Add(new Sprites(new Vector2(-700, 350),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\layer6_h"), 1300, 300, 0, 1.03f));
cenario.Add(new Sprites(new Vector2(600, 350),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\layer6_h"), 1300, 300, 0, 1.03f));
cenario.Add(new Sprites(new Vector2(1900, 350),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\layer6_h"), 1300, 300, 0, 1.03f));
cenario.Add(new Sprites(new Vector2(3200, 350),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\layer6_h"), 1300, 300, 0, 1.03f));
//muros
cenario.Add(new Sprites(new Vector2(-5500, 620),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\muro"), 2000, 130, 0, 1.01f));
cenario.Add(new Sprites(new Vector2(-3500, 620),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\muro"), 2000, 130, 0, 1.01f));
cenario.Add(new Sprites(new Vector2(-1500, 620),
Content.Load<Texture2D>(@"Sprites\Fase1\Cenario\muro"), 2000, 130, 0, 1.01f));
cenario.Add(new Sprites(new Vector2(500, 620),
18
//instancia camera
camera = new Camera(graphics.Viewport);
Hud = new HUD(Content);
//instancia personagem
kane = new Personagem(Content);
kane.posicao = new Vector2(-4200, 620);//posicao inciail
arial = Content.Load<SpriteFont>(@"Fontes\arial");
setouPrimeiraVez = false;
}
switch (tipo)
{
//casa1
case 1:
largura = 1500;
altura = 500;
//chao
casas[0].ground.Add(new Sprites(new Vector2(500, 500),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\1\porta"), 500, 10, 0, 1));
//inimigo
casas[0].inimigo.Add(new NPC(Content, new Vector2(600, 400), false,
true, SpriteEffects.FlipHorizontally));
casas[0].inimigo[0].camada = 0.001f;
//tv
casas[0].tv.Add(new TV(Content, new Vector2(585, 366), true));
casas[0].tv[0].largura = 80;
casas[0].tv[0].altura = 100;
casas[0].tv[0].vol = 100;
casas[0].tv[0].camada = 0.1f;
//elementos do cenario
casas[0].cenario.Add(new Sprites(new Vector2(-20, -300),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\1\moldura"), largura+40, altura+325, 0,
1));
casas[0].cenario.Add(new Sprites(new Vector2(550, 380),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\1\estanteTv"), 150, 120, 0, 1));
casas[0].cenario.Add(new Sprites(new Vector2(0, 0),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\1\fundoInteriorCasa"), largura, altura, 0,
1));
break;
//casa 2
case 2:
largura = 750;
altura = 500;
//casa 6
case 3:
largura = 1500;
altura = 900;
casas[2].ground.Add(new Sprites(new Vector2(100, altura),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\6\porta"), 600, 10, 0, 1));
casas[2].walls.Add(new Objetos(new Vector2(-350, 0),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\6\porta"), 50, altura, 0, 1, true,
Content));
casas[2].walls.Add(new Objetos(new Vector2(largura + 200, 0),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\6\porta"), 50, altura, 0, 1, true,
Content));
casas[2].walls[0].isDesenha = casas[2].walls[1].isDesenha = false;
//passagem
casas[2].walls.Add(new Objetos(new Vector2(840, 801),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\6\pilar"), 100, 100, 0, 1, true,
Content));
casas[2].ground.Add(new Sprites(new Vector2(840, 0),
Content.Load<Texture2D>(@"Sprites\tampaCaixas"), 95, 10, 0, 1));
casas[2].walls[2].Ground = 1;
//caixa da passagem
casas[2].walls.Add(new Objetos(new Vector2(850, 650),
21
//plataforma direita
casas[2].ground.Add(new Sprites(new Vector2(850, 640),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\6\porta"), 650, 10, 0, 1));
casas[2].cenario.Add(new Sprites(new Vector2(850, 640),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\6\spotFolha"), 650, 260, 0, 1));
casas[2].cenario[1].camada = 0.5f;
//tv esquerda
casas[2].tv.Add(new TV(Content, new Vector2(0, 500), true));
casas[2].tv[0].vol = 500;
22
//tv direita
casas[2].tv.Add(new TV(Content, new Vector2(880, 500), true));
casas[2].tv[1].vol = 500;
//casa 5
case 4:
largura = 1500;
altura = 700;
//paredes
casas[3].walls.Add(new Objetos(new Vector2(-140, 0),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\5\porta"), 50, altura, 0, 1, true,
Content));
casas[3].walls.Add(new Objetos(new Vector2(largura + 100, 0),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\5\porta"), 50, altura, 0, 1, true,
Content));
casas[3].walls[0].isDesenha = false; casas[3].walls[1].isDesenha =
false;
//inimigos
casas[3].inimigo.Add(new NPC(Content, new Vector2(500, 600), true,
true, SpriteEffects.FlipHorizontally));
23
//tvs
casas[3].tv.Add(new TV(Content, new Vector2(700, 200), false));
casas[3].tv[0].vol = 500;
casas[3].tv.Add(new TV(Content, new Vector2(1000, 10), true));
casas[3].tv[1].vol = 100;
//caixa 800
casas[3].walls.Add(new Objetos(new Vector2(800, 600),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\5\box2"), 90, 80, 0, 1, false, Content));
casas[3].ground.Add(new Sprites(new Vector2(800, 0),
Content.Load<Texture2D>(@"Sprites\tampaCaixas"), 85, 1, 0, 1));
casas[3].walls[2].Ground = 0;
//chao
casas[3].ground.Add(new Sprites(new Vector2(-150, altura),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\5\porta"),365, 10, 0, 1));
casas[3].ground[1].canWalk = false;
casas[3].ground.Add(new Sprites(new Vector2(216, altura),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\5\porta"), 864, 10, 0, 1));
casas[3].ground.Add(new Sprites(new Vector2(865, altura),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\5\porta"), 635+140, 10, 0, 1));
casas[3].ground[3].canWalk = false;
//plataforma1
casas[3].ground.Add(new Sprites(new Vector2(900, 500),
Content.Load<Texture2D>(@"Sprites\tampaCaixas"), 100, 1, 0, 1));
//plataforma2
casas[3].ground.Add(new Sprites(new Vector2(700, 500),
Content.Load<Texture2D>(@"Sprites\tampaCaixas"), 100, 1, 0, 1));
//plataforma 5
casas[3].ground.Add(new Sprites(new Vector2(300, 400),
Content.Load<Texture2D>(@"Sprites\tampaCaixas"), 100, 1, 0, 1));
//plataforma 6
casas[3].ground.Add(new Sprites(new Vector2(-150, 300),
Content.Load<Texture2D>(@"Sprites\tampaCaixas"), 350, 1, 0, 1));
//plataforma 4
casas[3].ground.Add(new Sprites(new Vector2(-150, 500),
Content.Load<Texture2D>(@"Sprites\tampaCaixas"), 250, 1, 0, 1));
//fundo
casas[3].cenario.Add(new Sprites(new Vector2(0, 0),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\5\fundoInteriorCasa"), largura, altura, 0,
1));
casas[3].cenario.Add(new Sprites(new Vector2(-150, -160),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\5\moldura"), largura + 300, altura + 195,
0, 1));
casas[3].cenario[1].camada = 0;
//casa 3
case 5:
//ps: por algum motivo tosco que nunca saberei, as caixas devem ser
instanciadas antes do chao, não sei se isso é uma verdade universal ou somente alguma
maldicao da casa 3
largura = 1000;
altura = 500;
//limites da casa
casas[4].walls.Add(new Objetos(new Vector2(-250, 0),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\3\porta"), 50, altura, 0, 1, true,
Content));
casas[4].walls.Add(new Objetos(new Vector2(largura + 200, 0),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\3\porta"), 50, altura, 0, 1, true,
Content));
casas[4].walls[0].isDesenha = casas[4].walls[1].isDesenha = false;
//chao de cima
casas[4].ground.Add(new Sprites(new Vector2(330, 270),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\3\porta"), 330, 10, 0, 1));
//tv
casas[4].tv.Add(new TV(Content, new Vector2(365, 366), false));
casas[4].tv[0].largura = 80;
casas[4].tv[0].altura = 100;
casas[4].tv[0].vol = 300;
casas[4].tv[0].camada = 0.2f;
25
//inimigo
casas[4].inimigo.Add(new NPC(Content, new Vector2(400, 400), false,
true, SpriteEffects.FlipHorizontally));
//moldura
casas[4].cenario.Add(new Sprites(new Vector2(-302, -400),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\3\moldura"), largura + 600, altura + 430,
0, 1));
casas[4].cenario[0].camada = 0;
//estante de tv
casas[4].cenario.Add(new Sprites(new Vector2(330, 380),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\3\estanteTv"), 150, 120, 0, 1));
// if(!setouPrimeiraVez)
casas[4].item.Add(new Item(new Vector2(590, 200),
Content.Load<Texture2D>(@"Sprites\Fase1\Casas\3\bateria"), 50, 50, 0, 1, true, -1));
break;
//casa 4
case 6:
largura = 1000;
altura = 500;
case 7:
largura = 1000;
altura = 500;
casas[6].isFinal = true;
break;
}
setouPrimeiraVez = true;
if (MediaPlayer.State == MediaState.Stopped)
{
MediaPlayer.Play(snowBreak);
MediaPlayer.Volume = 0.4f;
MediaPlayer.IsRepeating = true;
}
camera.Update(kane.posicao);
27
if (!isInteriorCasa)
{
cenario[5].posicao.X -= 1.5f;
if (cenario[5].posicao.X < -22000)
cenario[5].posicao.X = 5000;
Hud.Update(null, kane);
if (caixas[0].velocidade.Y == 0)
ground[1].posicao = new Vector2(caixas[0].posicao.X,
caixas[0].posicao.Y);
if (caixas[1].velocidade.Y == 0)
ground[2].posicao = new Vector2(caixas[1].posicao.X,
caixas[1].posicao.Y);
if (!ca.entrarPelaSegundaPorta)
kane.posicao = ca.posPorta1Interior + new Vector2(0, 70);
else
kane.posicao = ca.posPorta2Interior + new Vector2(0, 70);
// kane.posicao = new Vector2((posOldKane.X - ca.posicao.X),
100);
if (ca.entrouNaCasaSetInteriorFlag == false)
setInterior(tipoCasa);
break;
}
else
isInteriorCasa = false;
}
}
else
{
interiorCasaUpdate(tipoCasa, gameTime);
if (casas[tipoCasa - 1].fimDeFase)
{
MediaPlayer.Stop();
fimDeFase = true;
}
28
}
}
spriteBatch.End();
}
//desenha o chao
foreach (Sprites s in ground)
{
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend,
null, null, null, null, camera.cameraTransform(s.layer));
s.Draw(spriteBatch);
spriteBatch.End();
}
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend,
null, null, null, null, camera.cameraTransform(new Vector2(1, 1)));
kane.Draw(spriteBatch);
spriteBatch.End();
}
else
29
{
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend,
null, null, null, null, camera.cameraTransform(new Vector2(1, 1)));
interiorCasaDraw(tipoCasa, spriteBatch);
kane.Draw(spriteBatch);
spriteBatch.End();
}
if (kane.morreu)
gameOver = true; ;
Hud.Draw(spriteBatch, camera);
Hud.controle.botaoSelecionado = -1;
MouseState m = Mouse.GetState();
spriteBatch.End();
if (casas[tipoCasa - 1].temItem)
if (!casas[tipoCasa - 1].item[0].foiPego)
kane.item = 0;
Hud.controle.energia = energiaOld;
kane.dano = danoOld;
if (!casas[tipoCasa - 1].entrarPelaSegundaPorta)
kane.posicao = casas[tipoCasa - 1].posPorta1Interior;
else
kane.posicao = casas[tipoCasa - 1].posPorta2Interior;
}
}
}
5 GAME1.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
30
namespace Kane_1._0
{
Texture2D cursor;
// Estado do Jogo:
// 0 - Escolha de Idiomas
// 1 - Menu principal
// 2 - fase1 / 21 - encerramento fase1
// 3 - fase2 / 31 - encerramento fase2
// 4 - fase3 / 41 - encerramento fase3
// 5 - fase4 / 51 - encerramento fase4
// 666 - gameOver
public int estado;
//////////////selecao de idioma
Texture2D tvReflexo; //fundo de tela (TV desligada com reflexo do Kane)
Texture2D texPT; //textura lingua pt
Texture2D texEN; //textura lingua en
Vector2 posPT; //posição da textura pt
Vector2 posEN; //posição da textura EN
int indexPT; //0 se a textura pt não estiver selecionada; 1 se
estiver selecionada
int indexEN; //0 se a textura en não estiver selecionada; 1 se
estiver selecionada
float escalaEnter; //escala da frase "Aperter Enter"
bool limiteEscalaEnter; //controla quando a escala da frase "Aperte Enter"
deve aumentar ou diminuir
bool aperteEnter; //0 se o jogador não apertou ENTER, 1 se apertou
//////////////fim selecao idioma
//////////////menu inicial
Video tvMenu;
VideoPlayer videoPlayer;
Texture2D texJogar; //textura jogar
Texture2D texOpcoes; //textura opcoes
Texture2D texCreditos; //textura creditos
Texture2D texSair; //textura sair
int itemSelecionado; //armazena qual opção do menu principal foi
selecionada: (1-JOGAR);(2-OPCÕES);(3-CRÉDITOS);(4-SAIR)
float escalaJogar; //escala da textura jogar, este valor é alterado
quando o mouse está sobre a textura
float escalaOpcoes; //escala da textura opcoes, este valor é alterado
quando o mouse está sobre a textura
float escalaCreditos; //escala da textura creditos, este valor é alterado
quando o mouse está sobre a textura
float escalaSair; //escala da textura sair, este valor é alterado
quando o mouse está sobre a textura
Vector2 posJogar; //posicao da textura jogar
Vector2 posOpcoes; //posicao da textura opcoes
Vector2 posCreditos; //posicao da textura creditos
31
//estas duas flags são responsáveis por dizer ao jogo quando os submenus devem
ser desenhados.
bool menuOpcao; //true, se o jogador selecionar "OPCÕES" no menu
inicial
bool menuCredito; //true, se o jogador selecionar "CREDITOS" no menu
inicial
//////////////fim menu inicial
MouseState mOld;
KeyboardState kOld;
//////////////menu opcoes
Texture2D texOn_offSom;
Texture2D texOn_offVibra;
Texture2D texVibracao;
Texture2D texSom;
Texture2D texVoltar;
Vector2 posOn_offSom;
Vector2 posOn_offVibra;
Vector2 posVibracao;
Vector2 posSom;
Vector2 posVoltar;
float escalaVoltar;
float escalaOn_offSom;
float escalaOn_offVibra;
bool isOn_offSom;
bool isOn_offVibra;
Rectangle mouse;
//menu pause
Texture2D transparenciaMenuPause;
Texture2D texContinuar;
Texture2D texVoltarMenu;
Texture2D texRecomecar;
Vector2 posContinuar;
Vector2 posVoltarMenu;
Vector2 posRecomecar;
float escalaContinuar;
float escalaVoltarMenu;
float escalaRecomecar;
bool recomecar;
float escalaMenuMin;
float escalaMenuMax;
//creditos
Texture2D creditosKane;
Texture2D voltarCreditos;
//GAMEOVER
Texture2D gameOver;
SoundEffect somTVMenu;
SoundEffect somMenu;
SoundEffectInstance somMenuInstance;
Video fimFase1;
SpriteFont arial;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = false;
graphics.PreferredBackBufferWidth = 1280;
graphics.PreferredBackBufferHeight = 720;
estado = 2;
}
base.Initialize();
}
tvMenu = Content.Load<Video>(@"Videos\tv_on");
videoPlayer.Play(tvMenu);
arial = Content.Load<SpriteFont>(@"Fontes\arial");
abertura = Content.Load<Video>(@"Videos\abertura");
fimFase1 = Content.Load<Video>(@"Videos\fimFase1");
//////////////selecao de idioma
tvReflexo = Content.Load<Texture2D>(@"Sprites\tv_Reflexo");
texPT = Content.Load<Texture2D>(@"Sprites\linguaPT");
texEN = Content.Load<Texture2D>(@"Sprites\linguaEN");
posPT = new Vector2(300, 180);
posEN = new Vector2(300, 380);
indexEN = 0;
indexPT = 1;
escalaEnter = 0.6f;
limiteEscalaEnter = true;
aperteEnter = false;
//////////////fim selecao idioma
transparenciaMenuPause =
Content.Load<Texture2D>(@"Sprites\Menu\PT\PAUSE\transparenciaMenuPause");
33
texContinuar = Content.Load<Texture2D>(@"Sprites\Menu\PT\PAUSE\continuar");
texVoltarMenu = Content.Load<Texture2D>(@"Sprites\Menu\PT\PAUSE\menu");
texRecomecar = Content.Load<Texture2D>(@"Sprites\Menu\PT\PAUSE\restart");
posContinuar = new Vector2(((Window.ClientBounds.Width / 2) -
texContinuar.Width/8), (Window.ClientBounds.Height / 4)+texContinuar.Height);
posVoltarMenu = new Vector2(((Window.ClientBounds.Width / 2) -
texVoltarMenu.Width / 8), (Window.ClientBounds.Height / 4) + texVoltarMenu.Height +
100);
posRecomecar = new Vector2(((Window.ClientBounds.Width / 2) -
texRecomecar.Width / 8), (Window.ClientBounds.Height / 4) + texRecomecar.Height + 200);
gameOver = Content.Load<Texture2D>(@"Sprites\gameOver");
MouseState m = Mouse.GetState();
mouse = new Rectangle(m.X, m.Y, 1, 1);
KeyboardState k = Keyboard.GetState();
if (!menuPause)
{
switch (estado)
{
//////////////////////ESTADO 0 - SELEÇÃO IDIOMA///////////////////
case 0:
//verifica se o mouse fez interseccao com a bandeira brasil
if (mouse.Intersects(new Rectangle((int)posPT.X, (int)posPT.Y,
(int)texPT.Width / 2, (int)texPT.Height)))
{
if (m.LeftButton == ButtonState.Pressed)
{
escalaEnter = 0.6f;
indexPT = 1;
indexEN = 0;
aperteEnter = true;
}
}
else//verifica se o mouse fez interseccao com a bandeira inglesa
if (mouse.Intersects(new Rectangle((int)posEN.X,
(int)posEN.Y, (int)texEN.Width / 2, (int)texEN.Height)))
{
if (m.LeftButton == ButtonState.Pressed)
{
escalaEnter = 0.6f;
indexPT = 0;
indexEN = 1;
aperteEnter = true;
34
}
}
if (limiteEscalaEnter)
{
escalaEnter += 0.01f;
if (escalaEnter > 1)
limiteEscalaEnter = false;
}
else
{
escalaEnter -= 0.01f;
if (escalaEnter < 0.6f)
limiteEscalaEnter = true;
}
if (indexEN == 1)
{
//menu inicial
texJogar =
Content.Load<Texture2D>(@"Sprites\Menu\EN\play");
texOpcoes =
Content.Load<Texture2D>(@"Sprites\Menu\EN\options\options");
texCreditos =
Content.Load<Texture2D>(@"Sprites\Menu\EN\credits\credits");
texSair =
Content.Load<Texture2D>(@"Sprites\Menu\EN\quit");
//menu opcoes
texOn_offSom =
Content.Load<Texture2D>(@"Sprites\Menu\EN\options\on");
texOn_offVibra =
Content.Load<Texture2D>(@"Sprites\Menu\EN\options\on");
texSom =
Content.Load<Texture2D>(@"Sprites\Menu\EN\options\audio");
texVibracao =
Content.Load<Texture2D>(@"Sprites\Menu\EN\options\vibration");
texVoltar =
Content.Load<Texture2D>(@"Sprites\Menu\EN\options\back");
}
else
{
//menu inicial
texJogar =
Content.Load<Texture2D>(@"Sprites\Menu\PT\jogar");
texOpcoes =
Content.Load<Texture2D>(@"Sprites\Menu\PT\opcoes\opcoes");
texCreditos =
Content.Load<Texture2D>(@"Sprites\Menu\PT\creditos\creditos");
texSair =
Content.Load<Texture2D>(@"Sprites\Menu\PT\sair");
voltarCreditos =
Content.Load<Texture2D>(@"Sprites\Menu\PT\creditos\VOLTAR");
//menu opcoes
35
texOn_offSom =
Content.Load<Texture2D>(@"Sprites\Menu\PT\opcoes\on");
texOn_offVibra =
Content.Load<Texture2D>(@"Sprites\Menu\PT\opcoes\on");
texSom =
Content.Load<Texture2D>(@"Sprites\Menu\PT\opcoes\audio");
texVibracao =
Content.Load<Texture2D>(@"Sprites\Menu\PT\opcoes\vibracao");
texVoltar =
Content.Load<Texture2D>(@"Sprites\Menu\PT\opcoes\voltar");
}
somTVMenu.Play(0.1f, 0, 0);
}
break;
//////////////////////FIM - ESTADO 0 - SELEÇÃO
IDIOMA///////////////////
////////////////////////////////////////////////////////////////////
/////////////////////////////////////
//////////////////////ESTADO 1 - MENU PRINCIPAL///////////////////
case 1:
}
else
//verifica se o mouse está selecionando a opcao
"CRÉDITOS"
if (mouse.Intersects(new
Rectangle((int)posCreditos.X - texCreditos.Width / 2, (int)posCreditos.Y -
texCreditos.Height / 2, (int)texCreditos.Width, (int)texCreditos.Height)))
{
if (escalaCreditos == escalaMenuMin)
somMenu.Play();
escalaCreditos += 0.1f;
if (escalaCreditos >= escalaMenuMax)
escalaCreditos = escalaMenuMax;
}
else
//verifica se o mouse está selecionando a opcao
37
"SAIR"
if (mouse.Intersects(new
Rectangle((int)posSair.X - texSair.Width / 2, (int)posSair.Y - texSair.Height / 2,
(int)texSair.Width, (int)texSair.Height)))
{
if (escalaSair == escalaMenuMin)
somMenu.Play();
escalaSair += 0.1f;
if (escalaSair >= escalaMenuMax)
escalaSair = escalaMenuMax;
else
escalaJogar = escalaCreditos = escalaOpcoes
= escalaSair = escalaVoltar = escalaMenuMin;
}
else
if(menuCredito)
{
if (mouse.Intersects(new Rectangle((int)(posVoltar.X + 150)
- voltarCreditos.Width / 2, (int)(posVoltar.Y + 50) - voltarCreditos.Height / 2,
(int)voltarCreditos.Width, (int)voltarCreditos.Height)))
{
escalaVoltar += 0.1f;
if (escalaVoltar >= escalaMenuMax)
escalaVoltar = escalaMenuMax;
}
else
//se menu opcao for true, o menu principal não é desenhado.
Em seu lugar, aparecerá o menu opcao
if (menuOpcao)
{
if (mouse.Intersects(new Rectangle((int)posVoltar.X -
texVoltar.Width / 2, (int)posVoltar.Y - texVoltar.Height / 2, (int)texVoltar.Width,
(int)texVoltar.Height)))
{
escalaVoltar += 0.1f;
if (escalaVoltar >= escalaMenuMax)
escalaVoltar = escalaMenuMax;
escalaVoltar = escalaOn_offVibra =
escalaMenuMin;
}
else
if (mouse.Intersects(new
Rectangle((int)posOn_offVibra.X - texOn_offVibra.Width, (int)posOn_offVibra.Y -
texOn_offVibra.Height / 2, (int)texOn_offVibra.Width, (int)texOn_offVibra.Height)))
{
escalaOn_offVibra += 0.1f;
if (escalaOn_offVibra >= escalaMenuMax)
escalaOn_offVibra = escalaMenuMax;
}
else
39
{
isOn_offVibra = true;
texOn_offVibra =
Content.Load<Texture2D>(@"Sprites\Menu\EN\options\on");
}
}
escalaVoltar = escalaOn_offSom =
escalaMenuMin;
}
else
escalaVoltar = escalaOn_offSom =
escalaOn_offVibra = escalaOpcoes = escalaMenuMin;
}
tempo += gameTime.ElapsedGameTime.Milliseconds;
if (tempo > 920)
{
somTVMenu.Play(0.1f,0, 0);
tempo = 0;
}
if (itemSelecionado == 1)
estado = 2;
if (itemSelecionado == 2)
menuOpcao = true;
if (itemSelecionado == 3)
menuCredito = true;
if (itemSelecionado == 4)
this.Exit();
break;
//////////////////////FIM - ESTADO 1 - MENU
PRINCIPAL///////////////////
fase1.Update(gameTime);
break;
//////////////////////FIM - ESTADO 2 - FASE1///////////////////
if (fase2 == null)
{
fase2 = new Fase2(Content, GraphicsDevice, fase1.kane);
fase2.kane.posicao = new Vector2(-4200, 620);//posicao
inicial
fase2.Hud.controle.fase = 2;
}
if (fase2.terminouFase)
estado = 4;
else
fase2.Update(gameTime);
break;
case -1:
level_1.Update(gameTime);
break;
//////////////////////FIM - ESTADO 3 - FASE2///////////////////
case 666:
break;
}
}
else
{
if (mouse.Intersects(new Rectangle((int)posContinuar.X -
texContinuar.Width / 2, (int)posContinuar.Y - texContinuar.Height / 2,
(int)texContinuar.Width, (int)texContinuar.Height)))
{
escalaContinuar += 0.1f;
if (escalaContinuar >= 1.5f)
escalaContinuar = 1.5f;
escalaVoltarMenu = escalaRecomecar = 1;
ButtonState.Released)
{
menuPause = false;
}
}
else
if (mouse.Intersects(new Rectangle((int)posVoltarMenu.X -
texVoltarMenu.Width / 2, (int)posVoltarMenu.Y - texVoltarMenu.Height / 2,
(int)texVoltarMenu.Width, (int)texVoltarMenu.Height)))
{
escalaVoltarMenu += 0.1f;
if (escalaVoltarMenu >= 1.5f)
escalaVoltarMenu = 1.5f;
escalaContinuar = escalaRecomecar = 1;
itemSelecionado = -1;
if(estado == 2)
fase1 = new Fase1(Content, GraphicsDevice);
estado = 1;
}
}
else
if (mouse.Intersects(new Rectangle((int)posRecomecar.X -
texRecomecar.Width / 2, (int)posRecomecar.Y - texRecomecar.Height / 2,
(int)texRecomecar.Width, (int)texRecomecar.Height)) && (fase1.isInteriorCasa ||(fase2 !=
null && fase2.isInteriorCasa)))
{
escalaRecomecar += 0.1f;
if (escalaRecomecar >= 1.5f)
escalaRecomecar = 1.5f;
escalaContinuar = escalaVoltarMenu = 1;
mOld = m;
kOld = k;
base.Update(gameTime);
42
switch (estado)
{
//////////////////////ESTADO 0 - SELEÇÃO IDIOMA///////////////////
case 0:
spriteBatch.Begin();
spriteBatch.Draw(tvReflexo, Vector2.Zero, Color.White);
spriteBatch.Draw(texPT, new Rectangle((int)posPT.X, (int)posPT.Y,
350, 150), new Rectangle((int)(texPT.Width / 2) * indexPT, 0, (int)texPT.Width / 2,
(int)texPT.Height), Color.White);
spriteBatch.Draw(texEN, new Rectangle((int)posEN.X, (int)posEN.Y,
350, 150), new Rectangle((int)((texEN.Width / 2) * indexEN) - 2, 0, (int)(texEN.Width /
2) - 1, (int)texEN.Height), Color.White);
if (indexEN == 1)
spriteBatch.DrawString(arial, " Press Enter", new Vector2(550,
630), Color.White, 0, new Vector2(40, 20), escalaEnter, SpriteEffects.None, 0);
else
spriteBatch.DrawString(arial, "Pressione Enter", new
Vector2(550, 630), Color.White, 0, new Vector2(50, 20), escalaEnter, SpriteEffects.None,
0);
spriteBatch.End();
break;
//////////////////////FIM - ESTADO 0 - SELEÇÃO IDIOMA///////////////////
////////////////////////////////////////////////////////////////////////
/////////////////////////////////
//////////////////////ESTADO 1 - MENU PRINCIPAL///////////////////
case 1:
spriteBatch.Begin();
}
else
if (menuCredito)
{
spriteBatch.End();
break;
//////////////////////FIM - ESTADO 1 - MENU PRINCIPAL///////////////////
case 2:
if (acabouAbertura)
fase1.Draw(spriteBatch, menuPause);
else
{
Texture2D tex1 = videoPlayer.GetTexture();
spriteBatch.Begin();
spriteBatch.Draw(tex1, Vector2.Zero, Color.White);
spriteBatch.End();
}
break;
case 21:
spriteBatch.Begin();
if (videoPlayer.State == MediaState.Playing)
{
Texture2D tex2 = videoPlayer.GetTexture();
else
spriteBatch.Draw(Content.Load<Texture2D>(@"Sprites\obrigado"),
new Vector2(50, 400), null, Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0);
spriteBatch.End();
break;
case 3:
if(fase2 != null)
fase2.Draw(spriteBatch, menuPause);
break;
case -1:
level_1.Draw(spriteBatch);
44
break;
case 666:
spriteBatch.Begin();
spriteBatch.Draw(gameOver, new Vector2(0, 0), null, Color.White, 0,
Vector2.Zero, 1, SpriteEffects.None, 0);
spriteBatch.End();
break;
}
spriteBatch.End();
}
spriteBatch.Begin();
spriteBatch.Draw(cursor, new Vector2 (mouse.X, mouse.Y), null ,Color.White,
0, Vector2.Zero, 0.5f, SpriteEffects.None, 0);
spriteBatch.End();
base.Draw(gameTime);
}
}
}
6 HUD.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace Kane_1._0
{
class HUD
{
public float camada;
//Controle remoto
public Controle controle;
//Barra de energia
public Texture2D barraEnergiaTex; //textura da barra de energia
public Texture2D barraEnergiaCapaTex;
public Vector2 barraEnergiaPos; //posição da barra de energia
public Texture2D breuCircunferencia;
public Texture2D breuRetangulo;
SpriteFont arial;
int score;
public float escala;
public float danoP;
breuCircunferencia = Content.Load<Texture2D>(@"Sprites\HUD\breuCircu");
breuRetangulo = Content.Load<Texture2D>(@"Sprites\HUD\breuRetan");
barraEnergiaCapaTex = Content.Load<Texture2D>(@"Sprites\HUD\capaEnergia");
barraEnergiaTex =
Content.Load<Texture2D>(@"Sprites\HUD\barraEnergia");//carrega a textura da barra de
energia
barraEnergiaPos = new Vector2(45, -5);
//posicao da barra de energia, nas coordenadas do HUD
camada = 0.4f;
//variavel flag para sinalizar se o controle deve ou nao ser ativado nesta
iteracao
//o controle so eh ativado quando o personagem entra no raio da tv
//o FOR abaixo verifica se esta colisao ocorreu. Se ela ocorrer a flag eh
acionada
//e o controle deve ser ativado nesta iteracao
bool ativarControle = false;
//percorre a lista de TVs para verificar quais TVs estao no raio de alcance
do personagem
if(t != null)
foreach (TV tv in t)
{
//verifica se a TV tv esta no raio de alcance do personagem
if (tv.corpoRb().Intersects(p.corpoRs()))//se a tv esta no alcance do
personagem:
46
{
controle.isTvSelected = true;//ativa o controle
ativarControle = true; //aciona a variavel flag
tv.corTV = Color.White; //muda a cor da TV para branco
tv.ativa = true; //seleciona a tv
}
else//se a tv não esta no raio de alcance do controle
{
tv.ativa = false; // tv fica desativada
tv.corTV = Color.Gray; // muda para a cor cinza
}
}
if (danoP > 0)
{
spriteBatch.Draw(breuCircunferencia, new Vector2(650, 450), null,
Color.White, 0, new Vector2(breuCircunferencia.Width / 2, breuCircunferencia.Height /
2), 1.8f - (danoP * 0.003f), SpriteEffects.None, camada);
if (danoP > 300)
{
//desenha o controle
controle.Draw(spriteBatch);
spriteBatch.End();
}
}
}
7 ITEM.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Kane_1._0
{
class Item : Sprites
{
//se for menor ou igual a -1 é uma bateria - a bateria recarregar o controle
//se for maior ou igual a 1 é uma lampada - a lampada limpa o "breu" da tela
//o jogador pode carrregar o item para qualquer lugar e usar quando quiser,
porém, só ele só pode carregar 1 item.
public int tipo;
//se o item foi pego pelo personagem é true
public bool foiPego;
int variacao;
Vector2 posicaoInicial;
bool subir;
posicaoInicial = posicao;
subir = true;
variacao = 5;
camada = 0.001f;
}
if(!subir)
posicao.Y += 0.1f;
else
posicao.Y -= 0.1f;
}
}
8 NPC.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Kane_1._0
{
class NPC : Sprites
{
public bool isWalker;
public bool isOnTheGround;
public bool isZombie;
public bool isMen;
public float gravidade;
public int velo;
public int qtdFrames = 0;
public ContentManager Content;
public SpriteEffects direcao;
49
if (isMen)
{
if (isWalker)
if (isZombie)
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\ZumbiWalker");
else
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\HomemWalker");
else
if (isZombie)
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\ZumbiSeguidor");
else
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\HomemSeguidor");
}
else
if (isWalker)
if (isZombie)
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\ZumbiWalker");
else
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\HomemWalker");
else
if (isZombie)
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\ZumbiSeguidor");
else
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\Mulher");
this.posicao = posicao;
gravidade = 1;
if(direcao == SpriteEffects.None)
velocidade = new Vector2(velo, gravidade); //gravidade
else
velocidade = new Vector2(-velo, gravidade); //gravidade
isOnTheGround = false;//deve ser falso pois os zumbis nascem no "ar" e deve
cair no chao
currentFrameX = 0;
50
timeSinceLastFrame = 0;
millisecondsPerFrame = 120;
tvControladora = null;
camada = 0.01f;
if (currentFrameX == 10)
currentFrameX = 0;
////////////////////////////////////////////
}
////////////////////////CODIGO A///////////////////////////
//- verifica se o inimigo esta sendo afetado por uma TV
if (tvControladora != null)
{
if (isMen)
{
if (!isZombie)
{
isZombie = true;//transforma em zumbi
if (isWalker)
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\ZumbiWalker");
else
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\ZumbiSeguidor");
}
}
}
else
{
if (isMen)
{
if (isZombie)
{
isZombie = false;//transforma em pessoa
if (isWalker)
this.textura =
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\HomemWalker");
else
this.textura =
51
Content.Load<Texture2D>(@"Sprites\Fase1\NPCs\HomemSeguidor");
}
}
}
/////////////////////////////FIM A/////////////////////////////////
//atualiza posicao
posicao += velocidade;
if (isWalker)
{
if (isMen)
{
if (currentFrameX == 5)
currentFrameX = 0;
spriteBatch.Draw(textura, corpo(), new Rectangle((int)
(textura.Width / 5) * currentFrameX, 0, (int)(textura.Width / 5), (int)textura.Height),
Color.White, 0, Vector2.Zero, direcao, camada);
}
}
else
{
if (isMen)
{
if (currentFrameX == 7)
currentFrameX = 0;
spriteBatch.Draw(textura, corpo(), new Rectangle((int)
((textura.Width / 7) * currentFrameX) - 1, 0, (int)(textura.Width / 7),
(int)textura.Height), Color.White, 0, Vector2.Zero, direcao, camada);
}
else
spriteBatch.Draw(textura, corpo(), new Rectangle((int)
(((textura.Width / 10) * currentFrameX) + 0.7f), 0, (int)(textura.Width / 10),
(int)textura.Height), Color.White, 0, Vector2.Zero, direcao, camada);
}
}
else//desenha zumbi
{
if (isWalker)
{
if (currentFrameX == 4)
currentFrameX = 0;
if (isMen)
{
if (currentFrameX == 7)
currentFrameX = 0;
spriteBatch.Draw(textura, corpo(), new Rectangle((int)
((textura.Width / 7) * currentFrameX) - 1, 0, (int)(textura.Width / 7),
(int)textura.Height), Color.White, 0, Vector2.Zero, direcao, camada);
}
}
}
}
//////////////////////CODIGO B////////////////////////
//*CODIGO B DEVE FICAR ANTES DO CODIGO C//
//este codigo atualiza o movimento do zumbi seguidor de tv(!isWalker)
if (isZombie && !isWalker && tvControladora != null)
{
// se o zumbi estiver a direita da TV
if (posicao.X > tvControladora.posicao.X)
{
if (!(posicao.X - velo <= tvControladora.posicao.X))
{
velocidade.X = -velo;//andar para a esquerda
direcao = SpriteEffects.FlipHorizontally;//inverte animacao para
a esquerda
}
else
velocidade.X = 0;
}
53
else
//se o zumbi estiver a esquerda da TV
if (posicao.X < tvControladora.posicao.X)
{
if (!(posicao.X + velo >= tvControladora.posicao.X))
{
velocidade.X = velo;//andar para a direita
direcao = SpriteEffects.None;//inverte animacao para a direita
}
else
velocidade.X = 0;
}
}
//////////////////////FIM B/////////////////////////////
if(isOnTheGround)
////////////////////////CODIGO C//////////////////////
//este codigo verifica onde o inimigo pode andar e qual direção deve tomar
for(int i = 0; i < sprites.Count; i++)
{
//verifica se o inimigo esta no xao(isOnTheGround) e perto de alguma
beirada(explicação na linha de baixo).
//canWalk deve ser true para que o inimigo possa andar no chao, caso
contrario, só o personagem pode andar
//corpo() verifica se existe alguma colisao na posicao passada no
parametro. Se houver alguma colisao, quer dizer que não está perto da beirada
//a posição passada no parametro representa os pés do NPC
if (isOnTheGround && sprites[i].canWalk &&
(!corpo((int)largura, (int)altura, (int)largura,
10).Intersects(sprites[i].corpo()) || //borda direita
!corpo(-1 * ((int)largura), (int)altura, (int)largura,
10).Intersects(sprites[i].corpo())))//borda esquerda
{
//quando uma beirada é encontrada, deve-se verificar se existe outro
sprite perto dela, para que o movimento continue
for (int k = 0; k < sprites.Count; k++)
{
velocidade.X *= -1;
}
else//se não for do tipo walker, ele fica parado na beirada do
xao
{
velocidade.X = 0;
}
}
//ao final ele deve retornar true pois o inimigo esta colidindo com
o sprite
return true;
}
// else
//verifica se o inimigo ainda não estiver no xao, deve verificar
para que ele pare de cair.
}
//////////////////////////////////////////FIM
55
C/////////////////////////////////////////
if (isOnTheGround)
return true;
else
return false;
}
}
}
9 OBJETOS.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Kane_1._0
{
class Objetos : Sprites
{
public bool isStatic;
SoundEffect arrasta;
SoundEffectInstance arrastaInstance;
SoundEffect caiu;
public bool parouDeCair = false;
//todo objeto não estatico deve ser relacionado a um objeto da lista "ground"
que corresponderá à parte de cima do objeto, para que os personagens possam andar sobre
ele
public int Ground;// contem o index do vetor ground
/////////////////CODIGO A//////////////////////////////////
//este codigo verifica se o objeto caiu no xao
if (velocidade.Y == 5)
parouDeCair = false;
/////////////////////////CODIGO B///////////////////////////////
//este codigo verifica se o Objeto está sendo empurrando por algum zumbi
if(npc != null)
foreach (NPC n in npc)
{
if(n.isOnTheGround)
//se o NPC for um zumbi e ocorrer a colisão do Objeto com a
parte esquerda do ZUMBI
if (n.isZombie && corpo().Intersects(n.corpo(0, 0, 1,
(int)n.altura)))
{
//se o zumbi estiver virado para a esquerda
if (n.direcao == SpriteEffects.FlipHorizontally)
{
velocidade.X = -5;//mover a caixa para a esquerda
// if(arrastaInstance.State == SoundState.Stopped)
arrastaInstance.Play();
}
break;
57
}
else
//se o NPC for um zumbi e ocorrer a colisão do Objeto com a
parte direita do ZUMBI
if (n.isZombie && corpo().Intersects(n.corpo((int)n.largura,
0, 1, (int)n.altura)))
{
//se o zumbi estiver virado para a direita
if (n.direcao == SpriteEffects.None)
{
velocidade.X = 5;//mover para a direita
// if (arrastaInstance.State == SoundState.Stopped)
arrastaInstance.Play();
}
break;
}
velocidade.X = 0;
}
//////////////////////////FIM B////////////////////////////////////
}
}
}
}
10 PERSONAGEM.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
//Personagem jogavel
namespace Kane_1._0
{
class Personagem : Sprites
{
enum estado
{
correndo,
parado,
pulou,
no_ar,
cair,
}
public bool morreu = false;
public float impulsoX; //velocidade aplicada ao eixo X do personagem
quando ele está em movimento
58
this.textura = Content.Load<Texture2D>(@"Sprites\Kane\parado");
this.velocidade = new Vector2(0, impulsoY+gravidade); //velocidade inicial
this.posicao = new Vector2(0, 150); //posicao inicial
this.largura = 50.0f; //largura padrão
this.altura = 90.0f; //altura padrão
millisecondsPerFrame = 100;
nivelDano = 0.25f;
this.texturaRaio = Content.Load<Texture2D>(@"Sprites\Kane\raio");
this.raio = 200;
this.mostrarArea = false; //true, mostra o raio ao iniciar
o jogo. Apertar E durante o jogo para mostrar ou esconder
// laser = Content.Load<Texture2D>(@"Sprites\laser");
this.Content = Content;
59
item = 0;
camada = 0.000001f;
/// <summary>
/// Esfera que representa a área de alcance do controle do personagem,
/// usada para verificar a colisão com alguma TV.
/// </summary>
/// <returns></returns>
public BoundingSphere corpoRs()
{
//Cria uma esfera a partir da posição, altura e largura do personagem.
//Deve-se dividir a altura e largura por 2 para que o centro da esfera seja
no centro do personagem.
//O terceiro parametro do Vector3 é zero, pois o jogo é 2D.
//O segundo parameto da BoundingSphere representa o raio. O numero somado ao
raio é o Offset para que
//a distancia da esfera corresponda á distancia da textura do Raio.
return new BoundingSphere(new Vector3((int)posicao.X + largura / 2,
(int)posicao.Y + altura / 2, 0), raio + 10);
}
/// <summary>
/// Verifica se o personagem está no chao.
/// </summary>
/// <param name="ground">Lista de Sprites que representam o chão</param>
public void onTheGround(List<Sprites> ground)
{
pulou = false;
// velocidade.Y = gravidade;//personagem começa a cair
g.velocidade.Y = -10;
}
velocidade.Y = 0;
60
pulou = false;
isOnTheGround = true;
break;// break deve acontecer para que a verificação das outras
posições da lista pare, pois não é mais necessário.
}
else//se estiver no ar
{
//se entrar aqui é porque o personagem está no ar e não foi por
causa do pulo, então o personagem deve cair
//este IF é necessario pois o personagem não deve cair se ele pulou
e não atingiu a altura maxima do pulo
if (!pulou)
{
velocidade.Y += (gravidade / 4);
if (velocidade.Y > 6.5f)
velocidade.Y = 6.5f;
}
isOnTheGround = false;
}
}
}
/// <summary>
/// Verifica colisao com as laterias de Obejetos
/// </summary>
/// <param name="objetos">Lista de Sprites que representam os objetos</param>
public void colideObject(List<Objetos> objetos)
{
//percorre a lista verificando se o personagem colide com algum sprite que
representa algum "objeto"
//os valores numericos são para o Offset necessário para aumentar a precisão
das colisões
foreach (Objetos ob in objetos)
{
if (ob.corpo(-5, 5, 10, (int)ob.altura).Intersects(corpo()))//verifica o
lado esquerdo do personagem
posicao.X -= impulsoX;
else
if (ob.corpo((int)ob.largura - 10, 5, 10,
(int)ob.altura).Intersects(corpo()))//verifica o lado direito do personagem
posicao.X += impulsoX;
}
}
/// <summary>
/// Atualiza personagem
/// </summary>
/// <param name="gameTime">Tempo do jogo</param>
/// <param name="objetos">Objetos que irão colidir com o personagem, exceto o
chão</param>
/// <param name="ground">Chão onde o personagem pode andar</param>
public void Update(GameTime gameTime, List<Objetos> objetos, List<Sprites>
ground, List<TV> tv, List<NPC> npc)
{
KeyboardState k = Keyboard.GetState();
GamePadState g = GamePad.GetState(PlayerIndex.One);
MouseState m = Mouse.GetState();
morreu = true;
//godMod é utilizado para testes. Se for TRUE está ativado, FALSE desativado
godMod = false;
if (!godMod)
{
//verifica se o jogador está no raio de alcance de alguma TV ligada
//se estiver, a sua visão começará a ficar escura.
if(tv != null)
foreach (TV t in tv)
{
if (t.isTvOn)
if (corpoRb().Intersects(t.corpoRs()))
{
dano += nivelDano;
break;
}
}
////////////////animação///////////////////
// é necessário fazer um if especifico para cada tipo de animação
// pois cada sprite sheet possui uma quantidade de frames diferente
timeSinceLastFrame += (int)gameTime.ElapsedGameTime.Milliseconds;
if (estadoAnimacao == estado.correndo)//animação correr
{
if (timeSinceLastFrame > millisecondsPerFrame)
{
timeSinceLastFrame = 0;
currentFrameXcorrer++;
}
if (currentFrameXcorrer == 7)
currentFrameXcorrer = 0;
}
else
if (estadoAnimacao == estado.parado)//animação parado
{
if (timeSinceLastFrame > millisecondsPerFrame)
{
timeSinceLastFrame = 0;
currentFrameXparado++;
}
if (currentFrameXparado == 3)
{
currentFrameXparado = 0;
currentFrameYparado++;
if (currentFrameYparado == 2)
currentFrameYparado = 0;
}
}
else
if (estadoAnimacao == estado.pulou)//animação pular
{
if (timeSinceLastFrame > millisecondsPerFrame)
{
timeSinceLastFrame = 0;
currentFrameXpular++;
}
if (currentFrameXpular == 2)
{
currentFrameXpular = 2;
62
estadoAnimacao = estado.no_ar;
}
}
else
if (estadoAnimacao == estado.no_ar)//animação "no ar"
{
currentFrameXpular = 2;
}
else
if (estadoAnimacao == estado.cair)
{
if (timeSinceLastFrame > millisecondsPerFrame)
{
timeSinceLastFrame = 0;
currentFrameXpular++;
}
if (currentFrameXpular > 3)
{
currentFrameXpular = 4;
}
}
////////////////////////////////////////////
//Define a textura parado ao inicio de todo loop.
//Se o jogador não precionar nenhum botão, está textura permanecerá.
this.textura = Content.Load<Texture2D>(@"Sprites\Kane\parado");
//Define o estado parado após o trecho anterior(que realiza a animação)
//Esta linha é necessária para evitar um bug na animação quando o
jogador está parado.
estadoAnimacao = estado.parado;
////////////////////////////////CODIGO A////////////////////////////////
//este codigo movimenta o personagem
//entradas do usuario
if (k.IsKeyDown(Keys.D) ||
GamePad.GetState(PlayerIndex.One).ThumbSticks.Left.X > 0.1f)//ir para a direita(teclado
e gamepad)
{
this.textura = Content.Load<Texture2D>(@"Sprites\Kane\correr");
velocidade.X = impulsoX;
direcao = SpriteEffects.None;
estadoAnimacao = estado.correndo;
}
if (k.IsKeyDown(Keys.A) ||
GamePad.GetState(PlayerIndex.One).ThumbSticks.Left.X < -0.1f)//ir para a
esquerda(teclado e gamepad)
{
this.textura = Content.Load<Texture2D>(@"Sprites\Kane\correr");
velocidade.X = -impulsoX;
direcao = SpriteEffects.FlipHorizontally;
estadoAnimacao = estado.correndo;
}
if ((k.IsKeyDown(Keys.Space) ||
GamePad.GetState(PlayerIndex.One).ThumbSticks.Left.Y > 0.4f) && isOnTheGround)//pular(só
pode pular se estiver no chão: isOnTheGround é true)
{
impulsoY = 7.5f;
//velocidade.Y = -gravidade;// muda a gravidade para o personagem
subir(pular)
pulou = true;
distanciaPulo = posicao.Y;// seta a distancia do pulo para a posicao
Y atual do personagem
63
currentFrameXpular = 0;
estadoAnimacao = estado.pulou;
this.textura = Content.Load<Texture2D>(@"Sprites\Kane\pulo");
}
//se o jogador não está no chao, quer dizer que esta no ar
if (!isOnTheGround)
{
this.textura = Content.Load<Texture2D>(@"Sprites\Kane\pulo");
estadoAnimacao = estado.no_ar;
}
//////////////////////////CODIGO B///////////////////////////////////
//este codigo mostra a area de alcance do controle do personagem
if (((k.IsKeyDown(Keys.E) && kOld.IsKeyUp(Keys.E)) || //apertar
Shift esquerdo(teclado)
(g.Triggers.Left > 0.1) && gOld.Triggers.Left == 0.1))//apertar
defesa superior esquerda(gamepad)
if (mostrarArea)
mostrarArea = false;
else
mostrarArea = true;
if (k.IsKeyDown(Keys.D))
posicao.X += 10;
if (k.IsKeyDown(Keys.W))
posicao.Y -= 10;
if (k.IsKeyDown(Keys.S))
posicao.Y += 10;
}
mOld = m;
}
11 TV.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Kane_1._0
{
class TV : Sprites
{
Texture2D tvDesligada;
Texture2D tvLigada;
Texture2D raioTV;
Texture2D raioOnda;
public Color corTV;
public bool isTvOn, ativa, pause, play;
public float vol;//volume
public Rectangle raio;
public bool mostrarRaio;
float volTemp = 0;
int tempo = 0;
private KeyboardState kOld; //estado do teclado da iteração anterior
private GamePadState gOld; //estado do gamepad da iteração anterior
int alphaTotal, alphaIncremento;
currentFrameX = 0;
timeSinceLastFrame = 0;
millisecondsPerFrame = 120;
tvDesligada = Content.Load<Texture2D>(@"Sprites\TV\tv_desligada");
tvLigada = Content.Load<Texture2D>(@"Sprites\TV\tv_espiral");
raioTV = Content.Load<Texture2D>(@"Sprites\TV\raio");
raioOnda = Content.Load<Texture2D>(@"Sprites\TV\raioOnda2");
ativa = false;
camada = 0.02f;
}
if (ativa)
{
switch (controle.botaoSelecionado)
{
case 0:
power();
break;
case 3:
if (isTvOn)
{
pause = true;
play = false;
}
break;
case 6:
if (isTvOn && pause)
{
67
pause = false;
play = true;
}
break;
case 7:
if (isTvOn)
{
vol += 25;
volume();
}
break;
case 8:
if (isTvOn)
{
vol -= 25;
volume();
}
break;
}
}
if (!isTvOn)
{
pause = false;
play = false;
mostrarRaio = false;
}
else
{
timeSinceLastFrame += (int)gameTime.ElapsedGameTime.Milliseconds;
if (timeSinceLastFrame > millisecondsPerFrame)
{
timeSinceLastFrame = 0;
currentFrameX++;
}
if (currentFrameX == 7)
currentFrameX = 0;
}
kOld = k;
gOld = g;
volTemp = 0;
}
}
else
spriteBatch.Draw(tvDesligada, corpo(), null, corTV, 0, Vector2.Zero,
SpriteEffects.None, camada);
}
}
public BoundingBox corpoRb()
{
return new BoundingBox(new Vector3(posicao.X, posicao.Y, 0), new
Vector3(posicao.X + largura, posicao.Y + altura, 0));
}
}
}
12 SPRITES.CS
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
69
using Microsoft.Xna.Framework.Input;
//A Classe Sprites é usada para criar caminhos para os personagens, assim como outras
imagens que compõe o cenário.
//Os caminhos criados definem onde o jogador e os NPCs podem andar.
namespace Kane_1._0
{
class Sprites
{
public float camada;
public Vector2 posicao; //posicao do sprite
public Vector2 origem; //origem de rotação do sprite
public Vector2 velocidade;//velocidade do sprite
public float largura; //largura do sprite
public float altura; //altura do sprite
public float rotation; //rotação do sprite
public Texture2D textura; //textura do sprite
//variaveis layer são para simular o parallax scrolling
public float layerX; //layerX é a velocidade horizontal que sera aplicada
ao sprite quando o personagem se movimentar no eixo X
public float layerY; //layerY é a velocidade vertical que sera aplicada ao
sprite quando o personagem se movimentar no eixo Y
public Vector2 layer; //camada em que o sprite está
public bool canWalk; //true se o inimigo pode andar sobre este sprite. Sua
função é simular uma parede, deve ser colocada para limitar e controlar os movimentos
dos inimigos
public int timeSinceLastFrame;
public int millisecondsPerFrame;
public int currentFrameX, currentFrameY;
public bool isDesenha;
public int Wall; //necessário para relacionar este chao com o objeto
correspondente
public Sprites()
{ }
/// <summary>
/// Construtor dos Sprites
/// </summary>
/// <param name="posicao">Posição do Sprite</param>
/// <param name="textura">Textura do Sprite</param>
/// <param name="largura">Largura do Sprite</param>
/// <param name="altura">Altura do Sprite</param>
/// <param name="rotation">Rotação do Sprite</param>
/// <param name="layerX">Camada do Sprite</param>
public Sprites(Vector2 posicao, Texture2D textura, float largura, float altura,
float rotation, float layerX)
{
this.posicao = posicao;
this.origem = new Vector2(textura.Width / 2, textura.Height / 2); //origem é
no centro do sprite
this.largura = largura;
this.altura = altura;
this.rotation = rotation;
this.textura = textura;
this.velocidade = Vector2.Zero;
this.layerX = layerX;
this.layerY = 1; //layerY é 1 pois parallax scrolling nao será aplicado no
movimento vertical
this.layer = new Vector2(layerX, layerY);
70
/// <summary>
/// Retangulo normal para colisao do corpo inteiro
/// </summary>
/// <returns></returns>
public Rectangle corpo()
{
return new Rectangle((int)posicao.X, (int)posicao.Y, (int)largura,
(int)altura);
}
/// <summary>
/// Retangulo personalidado para realizar colisoes em partes especificas do
inimigo, ou colisões com Offset
/// </summary>
/// <param name="x">Offset posicao X</param>
/// <param name="y">Offset posicao Y</param>
/// <param name="w">Nova largura</param>
/// <param name="h">Nova altura</param>
/// <returns></returns>
public Rectangle corpo(int x, int y, int w, int h)
{
return new Rectangle((int)posicao.X + x, (int)posicao.Y + y, w, h);
}