Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Psycop

Dificuldade com "Jogo" em XNA

Mensagens Recomendadas

Psycop

Boa Tarde

Como pequeno exercicio de programação em C# estou a fazer um pequeno jogo "pong" em XNA. Já tenho uma grande parte da estrutura feita, mas estou com um problema que não consigo resolver, que são os seguintes:

1 - Colisões com os bastões e seguinte recolocação da bola.

2 - verificar colisões com os lados direito e esquerdo assim como a recolocação da bola no lado contrário ao lado em que colidiu assim como a soma dos pontos.

O código que tenho é o seguinte:

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 Tetris
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

// Imagens dos objetos do jogo

Texture2D texBastaoDireita;
Texture2D texBastaoEsquerda;
Texture2D texBola;

//variaveis para contagem de pontos dos jogadores
int pontosDir = 0;
int pontosEsq = 0;

SpriteFont Arial;

Vector2 posBola = new Vector2(5.0f, 5.0f);

KeyboardState keysboardState;

float speed = 5.0f;


// Vector que Guarda Informação da Posição da Bola.
Vector2 bolaSpeed = new Vector2 (150.0f, 150.0f);

//Posição do bastão

Vector2 posBastaoEsquerda = new Vector2(5,320);
Vector2 posBastaoDireita = new Vector2(780, 320);


public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}

protected override void Initialize()
{


base.Initialize();
}

protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);

// Carrega as texturas dos bastões e da bola
texBastaoEsquerda = Content.Load<Texture2D>("bastao");
texBastaoDireita = Content.Load<Texture2D>("bastao");
texBola = Content.Load<Texture2D>("bola");
Arial = Content.Load<SpriteFont>("Arial");
}

protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}

protected override void Update(GameTime gameTime)
{
// Mover a Bola em Relação à velocidade / tempo decorrido
posBola += bolaSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;

int MaxX = graphics.GraphicsDevice.Viewport.Width - texBola.Width;
int MinX = 0;
int MaxY = graphics.GraphicsDevice.Viewport.Height - texBola.Height;
int MinY = 0;


//Maximos para os bastões

int MaxbastaoY = graphics.GraphicsDevice.Viewport.Height - texBastaoDireita.Height;
int MinbastaoY = 0;

// Verificar a colisão dos bastões com as extremidades

//Bastão Direito
if (posBastaoDireita.Y > MaxbastaoY)
{
posBastaoDireita.Y *= -1;
posBastaoDireita.Y = MaxbastaoY;
}

else if (posBastaoDireita.Y < MinbastaoY)
{
posBastaoDireita.Y *= +1;
posBastaoDireita.Y = MinbastaoY;
}


//Bastão Esquerda
if (posBastaoEsquerda.Y > MaxbastaoY)
{
posBastaoEsquerda.Y *= -1;
posBastaoEsquerda.Y = MaxbastaoY;
}

else if (posBastaoEsquerda.Y < MinbastaoY)
{
posBastaoEsquerda.Y *= -1;
posBastaoEsquerda.Y = MinbastaoY;
}


// Verificar a colisão da bola com as extremidades
/*
if (posBola.X > MaxX)
{
bolaSpeed.X *= -1;
posBola.X = MaxbastaoY;
}

else if (posBola.X < MinX)
{
bolaSpeed.X *= -1;
posBola.X = MinX;
}
*/

if (posBola.Y > MaxY)
{
bolaSpeed.Y *= -1;
posBola.Y = MaxY;
}

else if (posBola.Y < MinY)
{
bolaSpeed.Y *= -1;
posBola.Y = MinY;
}


//Detectar Colisões Bola / Bastão
//Bastão Direito

if (posBola.X + texBola.Height >= posBastaoDireita.X)
{
bolaSpeed.X *= -1;
posBola.X = MaxbastaoY;
}

//Bastão Esquerdo

if (posBola.X - texBola.Height <= posBastaoEsquerda.X)
{
bolaSpeed.X *= -1;
posBola.X = MaxbastaoY;
}

// Se a bola saiu pela lateral, soma os pontos e reposiciona a bola
// saiu pela direita
if (posBola.X > MaxX)
{
pontosDir = pontosDir + 1;
posBola *= new Vector2(5.0f, 5.0f);
}

//saiu pela Esquerda
if (posBola.X < MinX)
{
pontosEsq = pontosEsq + 1;
posBola = new Vector2(775.0f, 5.0f);
}


// Declaramos o teclado
keysboardState = Keyboard.GetState();

//Bastao Esquerda
// Tecla para cima
if (keysboardState.IsKeyDown(Keys.Up))
{
posBastaoEsquerda.Y -= speed;
}
// Tecla para baixo
if (keysboardState.IsKeyDown(Keys.Down))
{
posBastaoEsquerda.Y += speed;
}

//Bastao Direita
// Tecla para esquerda
if (keysboardState.IsKeyDown(Keys.Left))
{
posBastaoDireita.Y -= speed;
}
// Tecla para direita
if (keysboardState.IsKeyDown(Keys.Right))
{
posBastaoDireita.Y += speed;
}

base.Update(gameTime);
}

protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);

// Pinta o fundo da tela de preto
graphics.GraphicsDevice.Clear(Color.Black);

// Desenha as texturas na tela
spriteBatch.Begin();

spriteBatch.Draw(texBola, posBola, Color.White);
spriteBatch.Draw(texBastaoEsquerda, posBastaoEsquerda, Color.White);
spriteBatch.Draw(texBastaoDireita, posBastaoDireita, Color.White);

spriteBatch.DrawString(Arial, pontosEsq.ToString() + ":" + pontosDir.ToString(), new Vector2(380, 20), Color.White);


spriteBatch.End();

base.Draw(gameTime);
}
}
}

Alguém me pode ajudar a entender o que estou a fazer mal e perceber como posso fazer correctamente? Neste momento queria perceber e colocar toda a mecânica do jogo a funcionar e só depois partir para a divisão do jogo e acções em classes específicas.

Cumps

Editado por Psycop

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

Olá

Estou a tentar fazer um MENU de um jogo e estou com uma dificuldade que é retroceder para o MainMenu quando a tecla "ESC" for pressionada estando num qualquer outro Case do Switch (Easy, Medium ou Hard).

Para as actividades dos botões tenho a classe Button:

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;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace Pong_The_Game_1._01
{
class cButton
{
 Texture2D texture;
 Vector2 position;
 Rectangle rectangle;
 Color colour = new Color(255, 255, 255, 255);
 public Vector2 size;
 public cButton(Texture2D newTexture, GraphicsDevice graphics)
 {
	 texture = newTexture;
	 //screenW = 800, screenH = 600
	 //imdW = 100, imdH = 20
	 size = new Vector2(graphics.Viewport.Width / 5, graphics.Viewport.Height / 15);
 }
 bool down;
 public bool isClicked;
 public void update(MouseState mouse)
 {
	 rectangle = new Rectangle((int)position.X, (int)position.Y, (int)size.X, (int)size.Y);
	 Rectangle mouseRectangle = new Rectangle(mouse.X, mouse.Y, 1, 1);
	 if (mouseRectangle.Intersects(rectangle))
	 {
		 if (mouse.LeftButton == ButtonState.Pressed)
		 {
			 isClicked = true;
		 }
		 else
		 {
			 isClicked = false;
		 }
	 }
 }

 public void setPosition(Vector2 newPosition)
 {
	 position = newPosition;
 }
 public void Draw(SpriteBatch spriteBatch)
 {
	 spriteBatch.Draw(texture, rectangle, colour);
 }
}
}

Que depois uso no Game1:

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 Pong_The_Game_1._01
{
public class Game1 : Microsoft.Xna.Framework.Game
{
 GraphicsDeviceManager graphics;
 SpriteBatch spriteBatch;
 SpriteFont Arial;

 enum GameState
 {
	 MainMenu,
	 Easy,
	 Medium,
	 Hard
 }
 GameState CurrentGameState = GameState.MainMenu;


 int screenWidth = 800, screenHeight = 600;

 cButton btnPlay_Easy;
 cButton btnPlay_Medium;
 cButton btnPlay_Hard;

public Game1()
 {
	 graphics = new GraphicsDeviceManager(this);
	 Content.RootDirectory = "Content";
 }

 protected override void Initialize()
 {

	 base.Initialize();
 }
 protected override void LoadContent()
 {
	 spriteBatch = new SpriteBatch(GraphicsDevice);
	 graphics.PreferredBackBufferWidth = screenWidth;
	 graphics.PreferredBackBufferHeight = screenHeight;
	 graphics.ApplyChanges();
	 IsMouseVisible = true;
	 Arial = Content.Load<SpriteFont>("Arial");

	 btnPlay_Easy = new cButton(Content.Load<Texture2D>("easy"), graphics.GraphicsDevice);
	 btnPlay_Easy.setPosition(new Vector2(320, 300));
	 btnPlay_Medium = new cButton(Content.Load<Texture2D>("medium"), graphics.GraphicsDevice);
	 btnPlay_Medium.setPosition(new Vector2(320, 350));
	 btnPlay_Hard = new cButton(Content.Load<Texture2D>("hard"), graphics.GraphicsDevice);
	 btnPlay_Hard.setPosition(new Vector2(320, 400));
 }
 protected override void UnloadContent()
 {
	 // TODO: Unload any non ContentManager content here
 }
 protected override void Update(GameTime gameTime)
 {
	 MouseState mouse = Mouse.GetState();
	 switch (CurrentGameState)
	 {
		 case GameState.MainMenu:
			 {
				 if (btnPlay_Easy.isClicked == true)
				 CurrentGameState = GameState.Easy;
				 btnPlay_Easy.update(mouse);
				 if (btnPlay_Medium.isClicked == true)
					 CurrentGameState = GameState.Medium;
				 btnPlay_Medium.update(mouse);
				 if (btnPlay_Hard.isClicked == true)
					 CurrentGameState = GameState.Hard;
				 btnPlay_Hard.update(mouse);
				 break;
			 }
		 case GameState.Easy:
			 {
				 //Desenhar Nome do Jogo
				 //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);



///O Que pretendo é que depois de estar dentro do GameState.Easy seja possivel voltar ao GameState.MainMenu pressionando a tecla "ESC". Como poderei fazer isto?


				 break;
			 }
		 case GameState.Medium:
			 {
				 //Desenhar Nome do Jogo
				 //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
				 break;
			 }
		 case GameState.Hard:
			 {
				 //Desenhar Nome do Jogo
				 //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
				 break;
			 }
	 }
		 base.Update(gameTime);
 }



 protected override void Draw(GameTime gameTime)
 {
	 GraphicsDevice.Clear(Color.CornflowerBlue);
	 // Desenha as texturas na tela
	 spriteBatch.Begin();
	 switch (CurrentGameState)
	 {
		 case GameState.MainMenu:
			 {
				 spriteBatch.Draw(Content.Load<Texture2D>("background_pong_the_game"), new Rectangle(0, 0, screenWidth, screenHeight), Color.White);
				 btnPlay_Easy.Draw(spriteBatch);
				 btnPlay_Medium.Draw(spriteBatch);
				 btnPlay_Hard.Draw(spriteBatch);
				 break;
			 }
		 case GameState.Easy:
			 {

				 //Desenhar Nome do Jogo



///O Que pretendo é que depois de estar dentro do GameState.Easy seja possivel voltar ao GameState.MainMenu pressionando a tecla "ESC". Como poderei fazer isto?


				 break;
			 }

		 case GameState.Medium:
			 {

				 //Desenhar Nome do Jogo
				 graphics.GraphicsDevice.Clear(Color.Black);
				 spriteBatch.DrawString(Arial, "Pong_The_Game_Medium", new Vector2(220, 10), Color.White);

			 }
		 case GameState.Hard:
			 {

				 //Desenhar Nome do Jogo
				 graphics.GraphicsDevice.Clear(Color.Black);

				 break;
			 }
	 }

	 spriteBatch.End();
	 base.Draw(gameTime);
 }
}
}

Alguém me pode ajudar a resolver esta questão?

Cumps

Editado por Psycop

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Sponsor

No Update colocas este código: (neste caso é a tecla back)

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
 this.Exit();

Editado por apocsantos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

No Update colocas este código: (neste caso é a tecla back)

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
 this.Exit();

Bom Dia

Coquei isso no update e não funciona.

Andei a experimentar umas coisas como isto:

if (state.IsKeyDown(Keys.Escape))
				    {
					    this.GameState.MainMenu;
				    }

A verdade é que se tiver this.Exit; ao clicar no "ESC" a aplicação termina, mas o que eu pretendo é voltar ao MainMenu. Como posso fazer isso visto que a expressão this.GameState.MainMenu; não é válida?

Cumps

Editado por Psycop

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Sponsor

Colocas uma variável no código para por exemplo te indicar por exemplo que queres voltar ao menu anterior. Quando no update verificas a tecla ESC dizes que essa variavel é true. Depois no Draw de acordo com essa variavel ou desenhas o menu ou a outra coisa.

Não sei como tens estruturado o teu jogo...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

Colocas uma variável no código para por exemplo te indicar por exemplo que queres voltar ao menu anterior. Quando no update verificas a tecla ESC dizes que essa variavel é true. Depois no Draw de acordo com essa variavel ou desenhas o menu ou a outra coisa.

Não sei como tens estruturado o teu jogo...

A estrutura do meu jogo é a que está postada 3 post's acima...

Estou um pouco perdido com esta situação e não estou a conseguir resolver...

Cumps

Editado por Psycop

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Sponsor

Então no update metes o CurrentGameState = GameSatate.MainMenu quando a tecla for pressionada

Editado por Marco_5

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

Mais uma vez aqui estou eu com dificuldades em implementar um Menu e Sub_Menus.

O código do Game1.cs é o seguinte:


//Iclusão de Menu's e retrocesso para o MainMenu

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 Pong_The_Game_1._01
{

public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

SpriteFont Arial;

//Classe Bola
Bola_Easy bola_Easy;
Bola_Medium bola_Medium;
Bola_Hard bola_Hard;

//Classe Player
Player player1;
Player player2;

//Textura a ser utilizada na classe Bola
Texture2D imgBola;

//Textura a ser utilizada na classe Player
Texture2D imgPlayer;

//Textura para gerar os pontos dos jogadores
//Texture2D imgNumeros;

//Textura da "rede"
Texture2D imgRede;

//Array que irá receber cada "fatia" da imagem com seu respectivo número
Rectangle[] pontos = null;

//Pontos dos jogadores_Easy
int pontosPlayer1_Easy;
int pontosPlayer2_Easy;
//Pontos dos jogadores_Medium
int pontosPlayer1_Medium;
int pontosPlayer2_Medium;
//Pontos dos jogadores_Hard
int pontosPlayer1_Hard;
int pontosPlayer2_Hard;

enum GameState
{
MainMenu,
Play,
Controls,
Credits,
Easy,
Medium,
Hard
}
GameState CurrentGameState = GameState.MainMenu;

int screenWidth = 800, screenHeight = 600;

cButton btnPlay_Play;
cButton btnPlay_Controls;
cButton btnPlay_Credits;
cButton btnPlay_Easy;
cButton btnPlay_Medium;
cButton btnPlay_Hard;

public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}

protected override void Initialize()
{
bola_Easy = new Bola_Easy();
bola_Medium = new Bola_Medium();
bola_Hard = new Bola_Hard();
player1 = new Player();
player2 = new Player();
pontosPlayer1_Easy = 0;
pontosPlayer2_Easy = 0;
pontosPlayer1_Medium = 0;
pontosPlayer2_Medium = 0;
pontosPlayer1_Hard = 0;
pontosPlayer2_Hard = 0;

base.Initialize();
}

protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);

graphics.PreferredBackBufferWidth = screenWidth;
graphics.PreferredBackBufferHeight = screenHeight;

graphics.ApplyChanges();
IsMouseVisible = true;

Arial = Content.Load<SpriteFont>("Arial");

//Carregando as imagens que serão utilizadas no jogo
imgBola = Content.Load<Texture2D>("bola");
imgPlayer = Content.Load<Texture2D>("player");
imgRede = Content.Load<Texture2D>("rede");

//Definições da Bola_Easy
//Aqui definimos as propriedades da bola como Tamanho, Posição inicial na tela
//velocidade e qual a textura a ser utilizada.
//Note tambem que utilizamos a classe Windows.ClientBound para posicionarmos
//nossa bola_Easy no centro da tela
bola_Easy.Tamanho = new Vector2(imgBola.Width, imgBola.Height);
bola_Easy.Posicao = new Vector2((window.ClientBounds.Width / 2) - (bola_Easy.Tamanho.X / 2), (window.ClientBounds.Height / 2) - (bola_Easy.Tamanho.Y / 2));
//nossa bola_Medium no centro da tela
bola_Medium.Tamanho = new Vector2(imgBola.Width, imgBola.Height);
bola_Medium.Posicao = new Vector2((window.ClientBounds.Width / 2) - (bola_Medium.Tamanho.X / 2), (window.ClientBounds.Height / 2) - (bola_Medium.Tamanho.Y / 2));
//nossa bola_Hard no centro da tela
bola_Hard.Tamanho = new Vector2(imgBola.Width, imgBola.Height);
bola_Hard.Posicao = new Vector2((window.ClientBounds.Width / 2) - (bola_Hard.Tamanho.X / 2), (window.ClientBounds.Height / 2) - (bola_Hard.Tamanho.Y / 2));

//velocidade Bola_Easy
bola_Easy.Velocidade = new Vector2(5.0f, 5.0f);
//velocidade Bola_Medium
bola_Medium.Velocidade = new Vector2(8.0f, 8.0f);
//velocidade Bola_Hard
bola_Hard.Velocidade = new Vector2(10.0f, 10.0f);

bola_Easy.Textura = imgBola;
bola_Medium.Textura = imgBola;
bola_Hard.Textura = imgBola;

//Player 1
//Assim como a bola, definimos também os dados de cada player
player1.Tamanho = new Vector2(imgPlayer.Width, imgPlayer.Height);
player1.Posicao = new Vector2(10f, (window.ClientBounds.Height / 2 - imgPlayer.Height / 2));
player1.Velocidade = new Vector2(0, 5);
player1.Textura = imgPlayer;

//Player 2
player2.Tamanho = new Vector2(imgPlayer.Width, imgPlayer.Height);
player2.Posicao = new Vector2((window.ClientBounds.Width - 10 - imgPlayer.Width), (window.ClientBounds.Height / 2 - imgPlayer.Height / 2));
player2.Velocidade = new Vector2(0, 5);
player2.Textura = imgPlayer;

pontos = new Rectangle[10];

//Carrega um array com a definição dos numeros
//Aqui realizamos o preenchimento de nosso array com seus
//respectivos valores para termos a posição certa de cada
//fatia dentro da imagem original
for (int i = 0; i < 10; i++)
{
pontos[i] = new Rectangle(i * 45, 0, 45, 75);
}


btnPlay_Play = new cButton(Content.Load<Texture2D>("play"), graphics.GraphicsDevice);
btnPlay_Play.setPosition(new Vector2(320, 300));

btnPlay_Controls = new cButton(Content.Load<Texture2D>("controls"), graphics.GraphicsDevice);
btnPlay_Controls.setPosition(new Vector2(320, 350));

btnPlay_Credits = new cButton(Content.Load<Texture2D>("credits"), graphics.GraphicsDevice);
btnPlay_Credits.setPosition(new Vector2(320, 400));

btnPlay_Easy = new cButton(Content.Load<Texture2D>("easy"), graphics.GraphicsDevice);
btnPlay_Easy.setPosition(new Vector2(320, 300));

btnPlay_Medium = new cButton(Content.Load<Texture2D>("medium"), graphics.GraphicsDevice);
btnPlay_Medium.setPosition(new Vector2(320, 350));

btnPlay_Hard = new cButton(Content.Load<Texture2D>("hard"), graphics.GraphicsDevice);
btnPlay_Hard.setPosition(new Vector2(320, 400));

}

protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}

protected override void Update(GameTime gameTime)
{
MouseState mouse = Mouse.GetState();
KeyboardState keyboardstate = Keyboard.GetState();

switch (CurrentGameState)
{
case GameState.MainMenu:
{
if (btnPlay_Play.isClicked == true)

CurrentGameState = GameState.Play;
btnPlay_Play.update(mouse);

if (btnPlay_Controls.isClicked == true)

CurrentGameState = GameState.Controls;
btnPlay_Controls.update(mouse);

if (btnPlay_Credits.isClicked == true)

CurrentGameState = GameState.Credits;
btnPlay_Credits.update(mouse);

break;
}

case GameState.Play:
{
//Desenhar Nome do Jogo
//spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);

//Menu dentro do Play
switch (CurrentGameState)
{
case GameState.Play:
{
if (btnPlay_Easy.isClicked == true)

CurrentGameState = GameState.Easy;
btnPlay_Easy.update(mouse);

if (btnPlay_Medium.isClicked == true)

CurrentGameState = GameState.Medium;
btnPlay_Medium.update(mouse);

if (btnPlay_Hard.isClicked == true)

CurrentGameState = GameState.Hard;
btnPlay_Hard.update(mouse);


break;
}

case GameState.Easy:
{
//Desenhar Nome do Jogo
//spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);


//Retroceder para o Play
if (keyboardstate.IsKeyDown(Keys.Escape))
{
CurrentGameState = GameState.Play;
break;
}

break;
}

case GameState.Medium:
{
//Desenhar Nome do Jogo
//spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);

//Retroceder para o MainMenu
if (keyboardstate.IsKeyDown(Keys.Escape))
{
CurrentGameState = GameState.Play;
break;
}

break;
}

case GameState.Hard:
{
//Desenhar Nome do Jogo
//spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);

//Retroceder para o MainMenu
if (keyboardstate.IsKeyDown(Keys.Escape))
{
CurrentGameState = GameState.Play;
break;
}

break;
}

}

//Retroceder para o MainMenu
if (keyboardstate.IsKeyDown(Keys.Escape))
{
CurrentGameState = GameState.MainMenu;
break;
}

break;
}

case GameState.Controls:
{
//Desenhar Nome do Jogo
//spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);

break;
}

case GameState.Credits:
{
//Desenhar Nome do Jogo
//spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);

break;
}
}

//Bola_Easy
bola_Easy.checaColisao_Easy(player1.Retangulo, player2.Retangulo);
bola_Easy.mover_Easy(Window, ref pontosPlayer1_Easy, ref pontosPlayer2_Easy);
movePlayers();

if (pontosPlayer1_Easy > 9 || pontosPlayer2_Easy > 9)
{
pontosPlayer1_Easy = 0;
pontosPlayer2_Easy = 0;
}

//Bola_Medium
bola_Medium.checaColisao_Medium(player1.Retangulo, player2.Retangulo);
bola_Medium.mover_Medium(Window, ref pontosPlayer1_Medium, ref pontosPlayer2_Medium);
movePlayers();

if (pontosPlayer1_Medium > 9 || pontosPlayer2_Medium > 9)
{
pontosPlayer1_Medium = 0;
pontosPlayer2_Medium = 0;
}

//Bola_Hard
bola_Hard.checaColisao_Hard(player1.Retangulo, player2.Retangulo);
bola_Hard.mover_Hard(Window, ref pontosPlayer1_Hard, ref pontosPlayer2_Hard);
movePlayers();

if (pontosPlayer1_Hard > 9 || pontosPlayer2_Hard > 9)
{
pontosPlayer1_Hard = 0;
pontosPlayer2_Hard = 0;
}

base.Update(gameTime);
}

public void movePlayers()
{
KeyboardState keys = Keyboard.GetState();

//Player 1
if (keys.IsKeyDown(Keys.A))
{
if (player1.Posicao.Y < 0)
player1.Posicao = new Vector2(player1.Posicao.X, 0);
player1.Posicao -= player1.Velocidade;
}

if (keys.IsKeyDown(Keys.Z))
{
if (player1.Posicao.Y > window.ClientBounds.Height - player1.Textura.Height)
player1.Posicao = new Vector2(player1.Posicao.X, (window.ClientBounds.Height - imgPlayer.Height));
player1.Posicao += player1.Velocidade;
}

//Player 2
if (keys.IsKeyDown(Keys.Up))
{
if (player2.Posicao.Y < 0)
player2.Posicao = new Vector2(player2.Posicao.X, 0);
player2.Posicao -= player2.Velocidade;
}

if (keys.IsKeyDown(Keys.Down))
{
if (player2.Posicao.Y > window.ClientBounds.Height - player2.Textura.Height)
player2.Posicao = new Vector2(player2.Posicao.X, (window.ClientBounds.Height - imgPlayer.Height));
player2.Posicao += player2.Velocidade;
}

//Voltar ao Menu Inicial
if (keys.IsKeyDown(Keys.O))
{

}

}

protected override void Draw(GameTime gameTime)
{
// Desenha as texturas na tela
spriteBatch.Begin();

switch (CurrentGameState)
{
case GameState.MainMenu:
{
spriteBatch.Draw(Content.Load<Texture2D>("background_pong_the_game"), new Rectangle(0, 0, screenWidth, screenHeight), Color.White);
btnPlay_Play.Draw(spriteBatch);
btnPlay_Controls.Draw(spriteBatch);
btnPlay_Credits.Draw(spriteBatch);
break;
}

case GameState.Play:
{
//graphics.GraphicsDevice.Clear(Color.White);
spriteBatch.Draw(Content.Load<Texture2D>("background_pong_the_game"), new Rectangle(0, 0, screenWidth, screenHeight), Color.White);
btnPlay_Easy.Draw(spriteBatch);
btnPlay_Medium.Draw(spriteBatch);
btnPlay_Hard.Draw(spriteBatch);
break;

switch (CurrentGameState)
{
case GameState.Easy:
{
break;
}

case GameState.Medium:
{
break;
}

case GameState.Hard:
{
break;
}

break;

}

}



case GameState.Controls:
{

break;
}

case GameState.Credits:
{

break;
}
}


spriteBatch.End();

base.Draw(gameTime);
}
}
}

A minha dificuldade actual é que após entrar no Sub_Menu "Play" os botões "Easy", "Medium" e "Hard" Não são apresentados, ficando a tela limpa sem qualquer coisa impressa.

No entanto o MENU principal e as opções "Play", "Controls" e "Credits" aparecem correctamente... Já verifiquei todo o código e não consigo encontrar nenhum erro ou problema. Alguém tem umas dicas para me dar?

Cumps

Editado por Psycop

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Sponsor

Viva,

primeiro no Draw estas a carregar Texturas e não é indicado fazeres isso ai...

Depois o que é o "Play"? É ojogo é o menu?!

Explique a ordem do seu jogo a ordem que são apresentados os ecras do seu jogo!

Editado por Marco_5

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

Olá Marco...

Como já deve ter percebido eu sou inexperiente em XNA, assim como um aprendiz de C#.

O Play tem como objectivo levar a um Sub_menu.

Ou seja:

MENU:

- Play:

- Easy

- Medium

- Hard

- Controls:

- Credits:

Tal como disseste que é errado fazer o load no Draw, corrigi essa situação da seguinte forma:

//Iclusão de Menu's e retrocesso para o MainMenu
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 Pong_The_Game_1._01
{
   public class Game1 : Microsoft.Xna.Framework.Game
   {
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    SpriteFont Arial;
    //Classe Bola
    Bola_Easy bola_Easy;
    Bola_Medium bola_Medium;
    Bola_Hard bola_Hard;
    //Classe Player
    Player player1;
    Player player2;
    //Textura a ser utilizada na classe Bola
    Texture2D imgBola;
    //Textura a ser utilizada na classe Player
    Texture2D imgPlayer;
    //Textura para gerar os pontos dos jogadores
    //Texture2D imgNumeros;
    Texture2D background;
    //Textura da "rede"
    Texture2D imgRede;
    //Array que irá receber cada "fatia" da imagem com seu respectivo número
    Rectangle[] pontos = null;
    //Pontos dos jogadores_Easy
    int pontosPlayer1_Easy;
    int pontosPlayer2_Easy;
    //Pontos dos jogadores_Medium
    int pontosPlayer1_Medium;
    int pontosPlayer2_Medium;
    //Pontos dos jogadores_Hard
    int pontosPlayer1_Hard;
    int pontosPlayer2_Hard;
    enum GameState
    {
	    MainMenu,
	    Play,
	    Controls,
	    Credits,
	    Easy,
	    Medium,
	    Hard
    }
    GameState CurrentGameState = GameState.MainMenu;
    int screenWidth = 800, screenHeight = 600;
    cButton btnPlay_Play;
    cButton btnPlay_Controls;
    cButton btnPlay_Credits;
    cButton btnPlay_Easy;
    cButton btnPlay_Medium;
    cButton btnPlay_Hard;

    public Game1()
    {
	    graphics = new GraphicsDeviceManager(this);
	    Content.RootDirectory = "Content";
    }
    protected override void Initialize()
    {
	    bola_Easy = new Bola_Easy();
	    bola_Medium = new Bola_Medium();
	    bola_Hard = new Bola_Hard();
	    player1 = new Player();
	    player2 = new Player();
	    pontosPlayer1_Easy = 0;
	    pontosPlayer2_Easy = 0;
	    pontosPlayer1_Medium = 0;
	    pontosPlayer2_Medium = 0;
	    pontosPlayer1_Hard = 0;
	    pontosPlayer2_Hard = 0;
	    base.Initialize();
    }
    protected override void LoadContent()
    {
	    spriteBatch = new SpriteBatch(GraphicsDevice);
	    graphics.PreferredBackBufferWidth = screenWidth;
	    graphics.PreferredBackBufferHeight = screenHeight;
	    graphics.ApplyChanges();
	    IsMouseVisible = true;
	    Arial = Content.Load<SpriteFont>("Arial");
	    //Carregando as imagens que serão utilizadas no jogo
	    imgBola = Content.Load<Texture2D>("bola");
	    imgPlayer = Content.Load<Texture2D>("player");
	    imgRede = Content.Load<Texture2D>("rede");
	    //Definições da Bola_Easy
	    //Aqui definimos as propriedades da bola como Tamanho, Posição inicial na tela
	    //velocidade e qual a textura a ser utilizada.
	    //Note tambem que utilizamos a classe Windows.ClientBound para posicionarmos
	    //nossa bola_Easy no centro da tela
	    bola_Easy.Tamanho = new Vector2(imgBola.Width, imgBola.Height);
	    bola_Easy.Posicao = new Vector2((window.ClientBounds.Width / 2) - (bola_Easy.Tamanho.X / 2), (window.ClientBounds.Height / 2) - (bola_Easy.Tamanho.Y / 2));
	    //nossa bola_Medium no centro da tela
	    bola_Medium.Tamanho = new Vector2(imgBola.Width, imgBola.Height);
	    bola_Medium.Posicao = new Vector2((window.ClientBounds.Width / 2) - (bola_Medium.Tamanho.X / 2), (window.ClientBounds.Height / 2) - (bola_Medium.Tamanho.Y / 2));
	    //nossa bola_Hard no centro da tela
	    bola_Hard.Tamanho = new Vector2(imgBola.Width, imgBola.Height);
	    bola_Hard.Posicao = new Vector2((window.ClientBounds.Width / 2) - (bola_Hard.Tamanho.X / 2), (window.ClientBounds.Height / 2) - (bola_Hard.Tamanho.Y / 2));
	    //velocidade Bola_Easy
	    bola_Easy.Velocidade = new Vector2(5.0f, 5.0f);
	    //velocidade Bola_Medium
	    bola_Medium.Velocidade = new Vector2(8.0f, 8.0f);
	    //velocidade Bola_Hard
	    bola_Hard.Velocidade = new Vector2(10.0f, 10.0f);
	    bola_Easy.Textura = imgBola;
	    bola_Medium.Textura = imgBola;
	    bola_Hard.Textura = imgBola;
	    //Player 1
	    //Assim como a bola, definimos também os dados de cada player
	    player1.Tamanho = new Vector2(imgPlayer.Width, imgPlayer.Height);
	    player1.Posicao = new Vector2(10f, (window.ClientBounds.Height / 2 - imgPlayer.Height / 2));
	    player1.Velocidade = new Vector2(0, 5);
	    player1.Textura = imgPlayer;
	    //Player 2
	    player2.Tamanho = new Vector2(imgPlayer.Width, imgPlayer.Height);
	    player2.Posicao = new Vector2((window.ClientBounds.Width - 10 - imgPlayer.Width), (window.ClientBounds.Height / 2 - imgPlayer.Height / 2));
	    player2.Velocidade = new Vector2(0, 5);
	    player2.Textura = imgPlayer;
	    pontos = new Rectangle[10];
	    //Carrega um array com a definição dos numeros
	    //Aqui realizamos o preenchimento de nosso array com seus
	    //respectivos valores para termos a posição certa de cada
	    //fatia dentro da imagem original
	    for (int i = 0; i < 10; i++)
	    {
		    pontos[i] = new Rectangle(i * 45, 0, 45, 75);
	    }

	    btnPlay_Play = new cButton(Content.Load<Texture2D>("play"), graphics.GraphicsDevice);
	    btnPlay_Play.setPosition(new Vector2(320, 300));
	    btnPlay_Controls = new cButton(Content.Load<Texture2D>("controls"), graphics.GraphicsDevice);
	    btnPlay_Controls.setPosition(new Vector2(320, 350));
	    btnPlay_Credits = new cButton(Content.Load<Texture2D>("credits"), graphics.GraphicsDevice);
	    btnPlay_Credits.setPosition(new Vector2(320, 400));
	    btnPlay_Easy = new cButton(Content.Load<Texture2D>("easy"), graphics.GraphicsDevice);
	    btnPlay_Easy.setPosition(new Vector2(320, 300));
	    btnPlay_Medium = new cButton(Content.Load<Texture2D>("medium"), graphics.GraphicsDevice);
	    btnPlay_Medium.setPosition(new Vector2(320, 350));
	    btnPlay_Hard = new cButton(Content.Load<Texture2D>("hard"), graphics.GraphicsDevice);
	    btnPlay_Hard.setPosition(new Vector2(320, 400));
	    background = Content.Load<Texture2D>("background_pong_the_game");
    }
    protected override void UnloadContent()
    {
	    // TODO: Unload any non ContentManager content here
    }
    protected override void Update(GameTime gameTime)
    {
	    MouseState mouse = Mouse.GetState();
	    KeyboardState keyboardstate = Keyboard.GetState();
	    switch (CurrentGameState)
	    {
		    case GameState.MainMenu:
			    {
				    if (btnPlay_Play.isClicked == true)
					    CurrentGameState = GameState.Play;
					    btnPlay_Play.update(mouse);
				    if (btnPlay_Controls.isClicked == true)
					    CurrentGameState = GameState.Controls;
					    btnPlay_Controls.update(mouse);
				    if (btnPlay_Credits.isClicked == true)
					    CurrentGameState = GameState.Credits;
					    btnPlay_Credits.update(mouse);
				    break;
			    }
		    case GameState.Play:
			    {
				    //Desenhar Nome do Jogo
				    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
				    //Menu dentro do Play
				    switch (CurrentGameState)
				    {
					    case GameState.Play:
						    {
							    if (btnPlay_Easy.isClicked == true)
								    CurrentGameState = GameState.Easy;
								    btnPlay_Easy.update(mouse);
							    if (btnPlay_Medium.isClicked == true)
								    CurrentGameState = GameState.Medium;
								    btnPlay_Medium.update(mouse);
							    if (btnPlay_Hard.isClicked == true)
								    CurrentGameState = GameState.Hard;
								    btnPlay_Hard.update(mouse);

							    break;
						    }
					    case GameState.Easy:
						    {
							    //Desenhar Nome do Jogo
							    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);

							    //Retroceder para o Play
							    if (keyboardstate.IsKeyDown(Keys.Escape))
							    {
								    CurrentGameState = GameState.Play;
								    break;
							    }
							    break;
						    }
					    case GameState.Medium:
						    {
							    //Desenhar Nome do Jogo
							    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
							    //Retroceder para o MainMenu
							    if (keyboardstate.IsKeyDown(Keys.Escape))
							    {
								    CurrentGameState = GameState.Play;
								    break;
							    }
							    break;
						    }
					    case GameState.Hard:
						    {
							    //Desenhar Nome do Jogo
							    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
							    //Retroceder para o MainMenu
							    if (keyboardstate.IsKeyDown(Keys.Escape))
							    {
								    CurrentGameState = GameState.Play;
								    break;
							    }
							    break;
						    }
				    }
				    //Retroceder para o MainMenu
				    if (keyboardstate.IsKeyDown(Keys.Escape))
				    {
					    CurrentGameState = GameState.MainMenu;
					    break;
				    }
				    break;
			    }
		    case GameState.Controls:
			    {
				    //Desenhar Nome do Jogo
				    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
				    break;
			    }
		    case GameState.Credits:
			    {
				    //Desenhar Nome do Jogo
				    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
				    break;
			    }
	    }
	    //Bola_Easy
	    bola_Easy.checaColisao_Easy(player1.Retangulo, player2.Retangulo);
	    bola_Easy.mover_Easy(Window, ref pontosPlayer1_Easy, ref pontosPlayer2_Easy);
	    movePlayers();
	    if (pontosPlayer1_Easy > 9 || pontosPlayer2_Easy > 9)
	    {
		    pontosPlayer1_Easy = 0;
		    pontosPlayer2_Easy = 0;
	    }
	    //Bola_Medium
	    bola_Medium.checaColisao_Medium(player1.Retangulo, player2.Retangulo);
	    bola_Medium.mover_Medium(Window, ref pontosPlayer1_Medium, ref pontosPlayer2_Medium);
	    movePlayers();
	    if (pontosPlayer1_Medium > 9 || pontosPlayer2_Medium > 9)
	    {
		    pontosPlayer1_Medium = 0;
		    pontosPlayer2_Medium = 0;
	    }
	    //Bola_Hard
	    bola_Hard.checaColisao_Hard(player1.Retangulo, player2.Retangulo);
	    bola_Hard.mover_Hard(Window, ref pontosPlayer1_Hard, ref pontosPlayer2_Hard);
	    movePlayers();
	    if (pontosPlayer1_Hard > 9 || pontosPlayer2_Hard > 9)
	    {
		    pontosPlayer1_Hard = 0;
		    pontosPlayer2_Hard = 0;
	    }
	    base.Update(gameTime);
    }
    public void movePlayers()
    {
	    KeyboardState keys = Keyboard.GetState();
	    //Player 1
	    if (keys.IsKeyDown(Keys.A))
	    {
		    if (player1.Posicao.Y < 0)
			    player1.Posicao = new Vector2(player1.Posicao.X, 0);
		    player1.Posicao -= player1.Velocidade;
	    }
	    if (keys.IsKeyDown(Keys.Z))
	    {
		    if (player1.Posicao.Y > window.ClientBounds.Height - player1.Textura.Height)
			    player1.Posicao = new Vector2(player1.Posicao.X, (window.ClientBounds.Height - imgPlayer.Height));
		    player1.Posicao += player1.Velocidade;
	    }
	    //Player 2
	    if (keys.IsKeyDown(Keys.Up))
	    {
		    if (player2.Posicao.Y < 0)
			    player2.Posicao = new Vector2(player2.Posicao.X, 0);
		    player2.Posicao -= player2.Velocidade;
	    }
	    if (keys.IsKeyDown(Keys.Down))
	    {
		    if (player2.Posicao.Y > window.ClientBounds.Height - player2.Textura.Height)
			    player2.Posicao = new Vector2(player2.Posicao.X, (window.ClientBounds.Height - imgPlayer.Height));
		    player2.Posicao += player2.Velocidade;
	    }
	    //Voltar ao Menu Inicial
	    if (keys.IsKeyDown(Keys.O))
	    {
	    }
    }
    protected override void Draw(GameTime gameTime)
    {
	    // Desenha as texturas na tela
	    spriteBatch.Begin();
	    switch (CurrentGameState)
	    {
		    case GameState.MainMenu:
			    {
				    spriteBatch.Draw(background, new Rectangle(0, 0, 800, 600), Color.White);
				    btnPlay_Play.Draw(spriteBatch);
				    btnPlay_Controls.Draw(spriteBatch);
				    btnPlay_Credits.Draw(spriteBatch);
				    break;
			    }
		    case GameState.Play:
			    {
				    //graphics.GraphicsDevice.Clear(Color.White);
				    spriteBatch.Draw(background, new Rectangle(0, 0, 800, 600), Color.White);
				    btnPlay_Easy.Draw(spriteBatch);
				    btnPlay_Medium.Draw(spriteBatch);
				    btnPlay_Hard.Draw(spriteBatch);
				    break;
				    switch (CurrentGameState)
				    {
					    case GameState.Easy:
					    {
						    break;
					    }
					    case GameState.Medium:
					    {
						    break;
					    }
					    case GameState.Hard:
					    {
						    break;
					    }

				    }
				    break;
				  }


		    case GameState.Controls:
			    {
				    break;
			    }
		    case GameState.Credits:
			    {
				    break;
			    }
	    }

	    spriteBatch.End();
	    base.Draw(gameTime);
    }
   }
}

É esta estrutura que estou a tentar implementar. Antes de passar a optimizar e corrigir tudo o que não está "tão" bem feito queria ter tudo a funcionar e então depois explorar e optimizar os métodos.

Editado por Psycop

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

Após algumas mudanças no código, continuo com o mesmo problema no Sub_Menu "Play" onde as opções continuam sem aparecer.

O código é o seguinte:

//Iclusão de Menu's e retrocesso para o MainMenu
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 Pong_The_Game_1._01
{
   public class Game1 : Microsoft.Xna.Framework.Game
   {
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    SpriteFont Arial;
    //Classe Bola
    Bola_Easy bola_Easy;
    Bola_Medium bola_Medium;
    Bola_Hard bola_Hard;
    //Classe Player
    Player player1;
    Player player2;
    //Textura a ser utilizada na classe Bola
    Texture2D imgBola;
    //Textura a ser utilizada na classe Player
    Texture2D imgPlayer;

    //Texture2D Imagns Background;
    Texture2D background;
    Texture2D controls_background;
    Texture2D credits_background;
    //Textura da "rede"
    Texture2D imgRede;
    //Array que irá receber cada "fatia" da imagem com seu respectivo número
    Rectangle[] pontos = null;
    //Pontos dos jogadores_Easy
    int pontosPlayer1_Easy;
    int pontosPlayer2_Easy;
    //Pontos dos jogadores_Medium
    int pontosPlayer1_Medium;
    int pontosPlayer2_Medium;
    //Pontos dos jogadores_Hard
    int pontosPlayer1_Hard;
    int pontosPlayer2_Hard;
    enum GameState
    {
	    MainMenu,
	    Play_Menu,
	    Play,
	    Controls,
	    Credits,
	    Easy,
	    Medium,
	    Hard
    }
    GameState CurrentGameState = GameState.MainMenu;
    int screenWidth = 800, screenHeight = 600;
    cButton btnPlay_Play;
    cButton btnPlay_Controls;
    cButton btnPlay_Credits;
    cButton btnPlay_Easy;
    cButton btnPlay_Medium;
    cButton btnPlay_Hard;

    public Game1()
    {
	    graphics = new GraphicsDeviceManager(this);
	    Content.RootDirectory = "Content";
    }
    protected override void Initialize()
    {
	    bola_Easy = new Bola_Easy();
	    bola_Medium = new Bola_Medium();
	    bola_Hard = new Bola_Hard();
	    player1 = new Player();
	    player2 = new Player();
	    pontosPlayer1_Easy = 0;
	    pontosPlayer2_Easy = 0;
	    pontosPlayer1_Medium = 0;
	    pontosPlayer2_Medium = 0;
	    pontosPlayer1_Hard = 0;
	    pontosPlayer2_Hard = 0;
	    base.Initialize();
    }
    protected override void LoadContent()
    {
	    spriteBatch = new SpriteBatch(GraphicsDevice);
	    graphics.PreferredBackBufferWidth = screenWidth;
	    graphics.PreferredBackBufferHeight = screenHeight;
	    graphics.ApplyChanges();
	    IsMouseVisible = true;
	    Arial = Content.Load<SpriteFont>("Arial");
	    //Carregando as imagens que serão utilizadas no jogo
	    imgBola = Content.Load<Texture2D>("bola");
	    imgPlayer = Content.Load<Texture2D>("player");
	    imgRede = Content.Load<Texture2D>("rede");
	    //Definições da Bola_Easy
	    //Aqui definimos as propriedades da bola como Tamanho, Posição inicial na tela
	    //velocidade e qual a textura a ser utilizada.
	    //Note tambem que utilizamos a classe Windows.ClientBound para posicionarmos
	    //nossa bola_Easy no centro da tela
	    bola_Easy.Tamanho = new Vector2(imgBola.Width, imgBola.Height);
	    bola_Easy.Posicao = new Vector2((window.ClientBounds.Width / 2) - (bola_Easy.Tamanho.X / 2), (window.ClientBounds.Height / 2) - (bola_Easy.Tamanho.Y / 2));
	    //nossa bola_Medium no centro da tela
	    bola_Medium.Tamanho = new Vector2(imgBola.Width, imgBola.Height);
	    bola_Medium.Posicao = new Vector2((window.ClientBounds.Width / 2) - (bola_Medium.Tamanho.X / 2), (window.ClientBounds.Height / 2) - (bola_Medium.Tamanho.Y / 2));
	    //nossa bola_Hard no centro da tela
	    bola_Hard.Tamanho = new Vector2(imgBola.Width, imgBola.Height);
	    bola_Hard.Posicao = new Vector2((window.ClientBounds.Width / 2) - (bola_Hard.Tamanho.X / 2), (window.ClientBounds.Height / 2) - (bola_Hard.Tamanho.Y / 2));
	    //velocidade Bola_Easy
	    bola_Easy.Velocidade = new Vector2(5.0f, 5.0f);
	    //velocidade Bola_Medium
	    bola_Medium.Velocidade = new Vector2(8.0f, 8.0f);
	    //velocidade Bola_Hard
	    bola_Hard.Velocidade = new Vector2(10.0f, 10.0f);
	    bola_Easy.Textura = imgBola;
	    bola_Medium.Textura = imgBola;
	    bola_Hard.Textura = imgBola;
	    //Player 1
	    //Assim como a bola, definimos também os dados de cada player
	    player1.Tamanho = new Vector2(imgPlayer.Width, imgPlayer.Height);
	    player1.Posicao = new Vector2(10f, (window.ClientBounds.Height / 2 - imgPlayer.Height / 2));
	    player1.Velocidade = new Vector2(0, 5);
	    player1.Textura = imgPlayer;
	    //Player 2
	    player2.Tamanho = new Vector2(imgPlayer.Width, imgPlayer.Height);
	    player2.Posicao = new Vector2((window.ClientBounds.Width - 10 - imgPlayer.Width), (window.ClientBounds.Height / 2 - imgPlayer.Height / 2));
	    player2.Velocidade = new Vector2(0, 5);
	    player2.Textura = imgPlayer;
	    pontos = new Rectangle[10];
	    //Carrega um array com a definição dos numeros
	    //Aqui realizamos o preenchimento de nosso array com seus
	    //respectivos valores para termos a posição certa de cada
	    //fatia dentro da imagem original
	    for (int i = 0; i < 10; i++)
	    {
		    pontos[i] = new Rectangle(i * 45, 0, 45, 75);
	    }

	    btnPlay_Play = new cButton(Content.Load<Texture2D>("play"), graphics.GraphicsDevice);
	    btnPlay_Play.setPosition(new Vector2(320, 300));
	    btnPlay_Controls = new cButton(Content.Load<Texture2D>("controls"), graphics.GraphicsDevice);
	    btnPlay_Controls.setPosition(new Vector2(320, 350));
	    btnPlay_Credits = new cButton(Content.Load<Texture2D>("credits"), graphics.GraphicsDevice);
	    btnPlay_Credits.setPosition(new Vector2(320, 400));
	    btnPlay_Easy = new cButton(Content.Load<Texture2D>("easy"), graphics.GraphicsDevice);
	    btnPlay_Easy.setPosition(new Vector2(320, 300));
	    btnPlay_Medium = new cButton(Content.Load<Texture2D>("medium"), graphics.GraphicsDevice);
	    btnPlay_Medium.setPosition(new Vector2(320, 350));
	    btnPlay_Hard = new cButton(Content.Load<Texture2D>("hard"), graphics.GraphicsDevice);
	    btnPlay_Hard.setPosition(new Vector2(320, 400));
	    background = Content.Load<Texture2D>("background_pong_the_game");
	    controls_background = Content.Load<Texture2D>("controls_background");
	    credits_background = Content.Load<Texture2D>("credits_background");
    }
    protected override void UnloadContent()
    {
	    // TODO: Unload any non ContentManager content here
    }
    protected override void Update(GameTime gameTime)
    {
	    MouseState mouse = Mouse.GetState();
	    KeyboardState keyboardstate = Keyboard.GetState();
	    switch (CurrentGameState)
	    {
		    case GameState.MainMenu:
			    {
				    if (btnPlay_Play.isClicked == true)
					    CurrentGameState = GameState.Play;
					    btnPlay_Play.update(mouse);
				    if (btnPlay_Controls.isClicked == true)
					    CurrentGameState = GameState.Controls;
					    btnPlay_Controls.update(mouse);
				    if (btnPlay_Credits.isClicked == true)
					    CurrentGameState = GameState.Credits;
					    btnPlay_Credits.update(mouse);
				    break;
			    }
		    case GameState.Play:
			    {
				    //Desenhar Nome do Jogo
				    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);

				    //Menu dentro do Play
				    switch (CurrentGameState)
				    {
					    case GameState.Play:
						    {
							    if (btnPlay_Easy.isClicked == true)
								    CurrentGameState = GameState.Easy;
								    btnPlay_Easy.update(mouse);
							    if (btnPlay_Medium.isClicked == true)
								    CurrentGameState = GameState.Medium;
								    btnPlay_Medium.update(mouse);
							    if (btnPlay_Hard.isClicked == true)
								    CurrentGameState = GameState.Hard;
								    btnPlay_Hard.update(mouse);

							    break;
						    }
					    case GameState.Easy:
						    {
							    //Desenhar Nome do Jogo
							    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
							    break;
						    }
					    case GameState.Medium:
						    {
							    //Desenhar Nome do Jogo
							    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);

							    break;
						    }
					    case GameState.Hard:
						    {
							    //Desenhar Nome do Jogo
							    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);

							    break;
						    }
				    }
				    break;
			    }
		    case GameState.Controls:
			    {
				    //Desenhar Nome do Jogo
				    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
				    //Retroceder para o MainMenu
				    if (keyboardstate.IsKeyDown(Keys.Escape))
				    {
					    CurrentGameState = GameState.MainMenu;
					    break;
				    }
				    break;
			    }
		    case GameState.Credits:
			    {
				    //Desenhar Nome do Jogo
				    //spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
				    //Retroceder para o MainMenu
				    if (keyboardstate.IsKeyDown(Keys.Escape))
				    {
					    CurrentGameState = GameState.MainMenu;
					    break;
				    }
				    break;
			    }
	    }
	    //Bola_Easy
	    bola_Easy.checaColisao_Easy(player1.Retangulo, player2.Retangulo);
	    bola_Easy.mover_Easy(Window, ref pontosPlayer1_Easy, ref pontosPlayer2_Easy);
	    movePlayers();
	    if (pontosPlayer1_Easy > 9 || pontosPlayer2_Easy > 9)
	    {
		    pontosPlayer1_Easy = 0;
		    pontosPlayer2_Easy = 0;
	    }
	    //Bola_Medium
	    bola_Medium.checaColisao_Medium(player1.Retangulo, player2.Retangulo);
	    bola_Medium.mover_Medium(Window, ref pontosPlayer1_Medium, ref pontosPlayer2_Medium);
	    movePlayers();
	    if (pontosPlayer1_Medium > 9 || pontosPlayer2_Medium > 9)
	    {
		    pontosPlayer1_Medium = 0;
		    pontosPlayer2_Medium = 0;
	    }
	    //Bola_Hard
	    bola_Hard.checaColisao_Hard(player1.Retangulo, player2.Retangulo);
	    bola_Hard.mover_Hard(Window, ref pontosPlayer1_Hard, ref pontosPlayer2_Hard);
	    movePlayers();
	    if (pontosPlayer1_Hard > 9 || pontosPlayer2_Hard > 9)
	    {
		    pontosPlayer1_Hard = 0;
		    pontosPlayer2_Hard = 0;
	    }
	    base.Update(gameTime);
    }
    public void movePlayers()
    {
	    KeyboardState keys = Keyboard.GetState();
	    //Player 1
	    if (keys.IsKeyDown(Keys.A))
	    {
		    if (player1.Posicao.Y < 0)
			    player1.Posicao = new Vector2(player1.Posicao.X, 0);
		    player1.Posicao -= player1.Velocidade;
	    }
	    if (keys.IsKeyDown(Keys.Z))
	    {
		    if (player1.Posicao.Y > window.ClientBounds.Height - player1.Textura.Height)
			    player1.Posicao = new Vector2(player1.Posicao.X, (window.ClientBounds.Height - imgPlayer.Height));
		    player1.Posicao += player1.Velocidade;
	    }
	    //Player 2
	    if (keys.IsKeyDown(Keys.Up))
	    {
		    if (player2.Posicao.Y < 0)
			    player2.Posicao = new Vector2(player2.Posicao.X, 0);
		    player2.Posicao -= player2.Velocidade;
	    }
	    if (keys.IsKeyDown(Keys.Down))
	    {
		    if (player2.Posicao.Y > window.ClientBounds.Height - player2.Textura.Height)
			    player2.Posicao = new Vector2(player2.Posicao.X, (window.ClientBounds.Height - imgPlayer.Height));
		    player2.Posicao += player2.Velocidade;
	    }
	    //Voltar ao Menu Inicial
	    if (keys.IsKeyDown(Keys.O))
	    {
	    }
    }
    protected override void Draw(GameTime gameTime)
    {
	    // Desenha as texturas na tela
	    spriteBatch.Begin();
	    switch (CurrentGameState)
	    {
		    case GameState.MainMenu:
			    {
				    spriteBatch.Draw(background, new Rectangle(0, 0, 800, 600), Color.White);
				    btnPlay_Play.Draw(spriteBatch);
				    btnPlay_Controls.Draw(spriteBatch);
				    btnPlay_Credits.Draw(spriteBatch);
				    break;
			    }
		    case GameState.Play:
			    {
				    //graphics.GraphicsDevice.Clear(Color.White);
				    spriteBatch.Draw(background, new Rectangle(0, 0, 800, 600), Color.White);
				    btnPlay_Easy.Draw(spriteBatch);
				    btnPlay_Medium.Draw(spriteBatch);
				    btnPlay_Hard.Draw(spriteBatch);

				    switch (CurrentGameState)
				    {
					    case GameState.Easy:
					    {
						    graphics.GraphicsDevice.Clear(Color.Black);
						    //Posicionamos nossa "rede" no centro da tela
						    spriteBatch.Draw(imgRede, new Vector2((window.ClientBounds.Width * .5f), 0), Color.White);
						    //Desenhar Nome do Jogo
						    spriteBatch.DrawString(Arial, "Pong_The_Game_Easy", new Vector2(220, 10), Color.White);
						    //Desenhamos a pontuação do player 1 e do player 2
						    spriteBatch.DrawString(Arial, pontosPlayer1_Easy.ToString() + ":" + pontosPlayer2_Easy.ToString(), new Vector2(380, 50), Color.White);
						    //Desenhamos nossa "bola" apesar de ser quadrada..rsrs
						    spriteBatch.Draw(bola_Easy.Textura, bola_Easy.Retangulo, Color.White);
						    //Desenhamos os Player, um de cada lado
						    spriteBatch.Draw(player1.Textura, player1.Retangulo, Color.White);
						    spriteBatch.Draw(player2.Textura, player2.Retangulo, Color.White);
						    break;
					    }
					    case GameState.Medium:
					    {
						    //Posicionamos nossa "rede" no centro da tela
						    spriteBatch.Draw(imgRede, new Vector2((window.ClientBounds.Width * .5f), 0), Color.White);
						    //Desenhar Nome do Jogo
						    graphics.GraphicsDevice.Clear(Color.Black);
						    spriteBatch.DrawString(Arial, "Pong_The_Game_Medium", new Vector2(220, 10), Color.White);
						    //Desenhamos a pontuação do player 1 e do player 2
						    spriteBatch.DrawString(Arial, pontosPlayer1_Medium.ToString() + ":" + pontosPlayer2_Medium.ToString(), new Vector2(380, 50), Color.White);
						    //Desenhamos nossa "bola" apesar de ser quadrada..rsrs
						    spriteBatch.Draw(bola_Medium.Textura, bola_Medium.Retangulo, Color.White);
						    //Desenhamos os Player, um de cada lado
						    spriteBatch.Draw(player1.Textura, player1.Retangulo, Color.White);
						    spriteBatch.Draw(player2.Textura, player2.Retangulo, Color.White);
						    break;
					    }
					    case GameState.Hard:
					    {
						    //Posicionamos nossa "rede" no centro da tela
						    spriteBatch.Draw(imgRede, new Vector2((window.ClientBounds.Width * .5f), 0), Color.White);
						    //Desenhar Nome do Jogo
						    graphics.GraphicsDevice.Clear(Color.Black);
						    spriteBatch.DrawString(Arial, "Pong_The_Game_Hard", new Vector2(220, 10), Color.White);
						    //Desenhamos a pontuação do player 1 e do player 2
						    spriteBatch.DrawString(Arial, pontosPlayer1_Hard.ToString() + ":" + pontosPlayer2_Hard.ToString(), new Vector2(380, 50), Color.White);
						    //Desenhamos nossa "bola" apesar de ser quadrada..rsrs
						    spriteBatch.Draw(bola_Hard.Textura, bola_Hard.Retangulo, Color.White);
						    //Desenhamos os Player, um de cada lado
						    spriteBatch.Draw(player1.Textura, player1.Retangulo, Color.White);
						    spriteBatch.Draw(player2.Textura, player2.Retangulo, Color.White);
						    break;
					    }

				    }
				    break;
				  }


		    case GameState.Controls:
			    {
				    spriteBatch.Draw(controls_background, new Rectangle(0, 0, 800, 600), Color.White);
				    break;
			    }
		    case GameState.Credits:
			    {
				    spriteBatch.Draw(credits_background, new Rectangle(0, 0, 800, 600), Color.White);
				    break;
			    }
	    }

	    spriteBatch.End();
	    base.Draw(gameTime);
    }
   }
}

O que poderei estar eu a fazer de errado?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Sponsor

Tu tens isto:

case GameState.Play:
  {
	   //graphics.GraphicsDevice.Clear(Color.White);
	   spriteBatch.Draw(background, new Rectangle(0, 0, 800, 600), Color.White);
	    btnPlay_Easy.Draw(spriteBatch);
	    btnPlay_Medium.Draw(spriteBatch);
	    btnPlay_Hard.Draw(spriteBatch);

	    switch (CurrentGameState)
		 {
		   case GameState.Easy:
  			 {
			  graphics.GraphicsDevice.Clear(Color.Black);
			  //Posicionamos nossa "rede" no centro da tela
     			 spriteBatch.Draw(imgRede, new Vector2((window.ClientBounds.Width * .5f), 0), Color.White);
			   //Desenhar Nome do Jogo
			   spriteBatch.DrawString(Arial, "Pong_The_Game_Easy", new Vector2(220, 10), Color.White);
			   //Desenhamos a pontuação do player 1 e do player 2
			   spriteBatch.DrawString(Arial, pontosPlayer1_Easy.ToString() + ":" + pontosPlayer2_Easy.ToString(), new Vector2(380, 50), Color.White);
			  //Desenhamos nossa "bola" apesar de ser quadrada..rsrs
			 spriteBatch.Draw(bola_Easy.Textura, bola_Easy.Retangulo, Color.White);
			 //Desenhamos os Player, um de cada lado
		     spriteBatch.Draw(player1.Textura, player1.Retangulo, Color.White);
			 spriteBatch.Draw(player2.Textura, player2.Retangulo, Color.White);
			 break;
		   }
		  case GameState.Medium:
		    {
		       //Posicionamos nossa "rede" no centro da tela
		       spriteBatch.Draw(imgRede, new Vector2((window.ClientBounds.Width * .5f), 0), Color.White);
			   //Desenhar Nome do Jogo
			  graphics.GraphicsDevice.Clear(Color.Black);
			  spriteBatch.DrawString(Arial, "Pong_The_Game_Medium", new Vector2(220, 10), Color.White);
			  //Desenhamos a pontuação do player 1 e do player 2
			  spriteBatch.DrawString(Arial, pontosPlayer1_Medium.ToString() + ":" + pontosPlayer2_Medium.ToString(), new Vector2(380, 50), Color.White);
			  //Desenhamos nossa "bola" apesar de ser quadrada..rsrs
		      spriteBatch.Draw(bola_Medium.Textura, bola_Medium.Retangulo, Color.White);
			  //Desenhamos os Player, um de cada lado
			 spriteBatch.Draw(player1.Textura, player1.Retangulo, Color.White);
			 spriteBatch.Draw(player2.Textura, player2.Retangulo, Color.White);
			 break;
		    }
			 case GameState.Hard:
		      {
			    //Posicionamos nossa "rede" no centro da tela
			   spriteBatch.Draw(imgRede, new Vector2((window.ClientBounds.Width * .5f), 0), Color.White);
			   //Desenhar Nome do Jogo
			  graphics.GraphicsDevice.Clear(Color.Black);
			  spriteBatch.DrawString(Arial, "Pong_The_Game_Hard", new Vector2(220, 10), Color.White);
			  //Desenhamos a pontuação do player 1 e do player 2
		      spriteBatch.DrawString(Arial, pontosPlayer1_Hard.ToString() + ":" + pontosPlayer2_Hard.ToString(), new Vector2(380, 50), Color.White);
			  //Desenhamos nossa "bola" apesar de ser quadrada..rsrs
			  spriteBatch.Draw(bola_Hard.Textura, bola_Hard.Retangulo, Color.White);
			   //Desenhamos os Player, um de cada lado
			  spriteBatch.Draw(player1.Textura, player1.Retangulo, Color.White);
			  spriteBatch.Draw(player2.Textura, player2.Retangulo, Color.White);
			  break;
			 }
		    }
		   break;

Se o CurrentGameState estiver no Play não esta nos outros estados... Para que dentro de um caso do switch tornas a fazer o switch com a mesma variável?

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

Olá

O segundo switch seria para o sub_menu... No entanto que estado deveria ter o CurrentGameState?

Não entendi bem a estrutura do que indicas.

Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Sponsor

Tens de ter uma variavel que te indica se estas no menu principal, no menu secundário, em jogo. E depois tens de ter outra que te indique, dentro do menu secundário, por exemplo se já escolheu, se voltou para trás...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

só uma pergunta que, apesar seria uma solução para o teu problema, dependendo da tua resposta pode ser "usável" :

sabes o que é uma máquina de estados ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Sponsor

só uma pergunta que, apesar seria uma solução para o teu problema, dependendo da tua resposta pode ser "usável" :

sabes o que é uma máquina de estados ?

Isso mesmo. Se der uma leitura sobre isso vai simplificar as ideias...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

só uma pergunta que, apesar seria uma solução para o teu problema, dependendo da tua resposta pode ser "usável" :

sabes o que é uma máquina de estados ?

Pois, provavelmente é esse o meu problema. Eu não sei o que é uma máquina de estados.

Vou ler algo sobre isso. Recomendas ler algo em especial?

Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

a razão de ter dito que dependendo da tua resposta, é que é um conceito muito genérico.

a maior parte da documentação existente online não é direccionada a programação pura porque é algo usado em imensas coisas (principalmente em electrónica)

podes dar uma vista de olhos na wikipédia, mas o melhor é fazeres o que estas a fazer, como estás a fazer e depois testar máquinas de estados com pequenas aplicações de teste.


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Sponsor

Nesse caso, teria de ter uma 2ª variavel dentro do play certo?

onde deve incidir essa variável?

cumps

No update para os casos do switch usas a nova variável:

protected override void Update(GameTime gameTime)
{
MouseState mouse = Mouse.GetState();
KeyboardState keyboardstate = Keyboard.GetState();

switch (CurrentGameState)
{
case GameState.Play:
{
//Desenhar Nome do Jogo
//spriteBatch.DrawString(Arial, "Pong_The_Game", new Vector2(260, 10), Color.White);
//Menu dentro do Play
									 switch (CurrentGameState)
									 {
											 case GameState.Play:
													 {
															 if (btnPlay_Easy.isClicked == true)
SEGUNDA_VARIAVEL= GameState.Easy;

Depois no Draw depois de verificares o CurrentGameState e caso seja Play, verificas a segunda variável e desenhas de acordo com essa variável...

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

Boas

Tentei implementar aquilo que me disseste de uma variavel diferente para o Sub menu Play, foi o que tentei fazer no seguinte código:

cButton.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;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;


namespace Pong_The_Game_1._03
{
   class cButton
   {
       Texture2D texture;
       Vector2 position;
       Rectangle rectangle;

       Color colour = new Color(255, 255, 255, 255);

       public Vector2 size;

       public cButton(Texture2D newTexture, GraphicsDevice graphics)
       {
           texture = newTexture;

           //screenW = 800, screenH = 600
           //imdW = 100, imdH = 20

           size = new Vector2(graphics.Viewport.Width / 5, graphics.Viewport.Height / 15);
       }

       bool down;

       public bool isClicked;

       public void update(MouseState mouse)
       {
           rectangle = new Rectangle((int)position.X, (int)position.Y, (int)size.X, (int)size.Y);

           Rectangle mouseRectangle = new Rectangle(mouse.X, mouse.Y, 1, 1);

           if (mouseRectangle.Intersects(rectangle))
           {

               if (mouse.LeftButton == ButtonState.Pressed)
               {
                   isClicked = true;
               }
               else
               {
                   isClicked = false;
               }
           }
       }


       public void setPosition(Vector2 newPosition)
       {
           position = newPosition;
       }

       public void Draw(SpriteBatch spriteBatch)
       {
           spriteBatch.Draw(texture, rectangle, colour);
       }
   }
}

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;
namespace Pong_The_Game_1._03
{

   public class Game1 : Microsoft.Xna.Framework.Game
   {
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    //Variavel para upload da fonte Arial
    SpriteFont Arial;
    //Texture2D Imagens Background;
    Texture2D background;
    Texture2D controls_background;
    Texture2D credits_background;
    //Enumeração dos estados do Jogo para o MENU / Botões
    enum GameState
    {
	    MainMenu,
	    Play,
	    Play_Menu,
	    Controls,
	    Credits,
	    Easy,
	    Medium,
	    Hard,
	    Back
    }
    //Estado Actual do GameState
    GameState CurrentGameState = GameState.MainMenu;
    //Estado do GameState no Menu Play
    GameState Current_Play_GameState = GameState.Play_Menu;
    //Definição do tamanho do Ecrã
    int screenWidth = 800, screenHeight = 600;
    //Variáveis de cada Botão
    cButton btnPlay_Play;
    cButton btnPlay_Controls;
    cButton btnPlay_Credits;
    cButton btnPlay_Easy;
    cButton btnPlay_Medium;
    cButton btnPlay_Hard;
    cButton btnPlay_Back;
    public Game1()
    {
	    graphics = new GraphicsDeviceManager(this);
	    Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {
	    // TODO: Add your initialization logic here
	    base.Initialize();
    }

    protected override void LoadContent()
    {
	    // Create a new SpriteBatch, which can be used to draw textures.
	    spriteBatch = new SpriteBatch(GraphicsDevice);
	    //Definição do tamanho do Ecrã
	    graphics.PreferredBackBufferWidth = screenWidth;
	    graphics.PreferredBackBufferHeight = screenHeight;
	    graphics.ApplyChanges();
	    IsMouseVisible = true;
	    //Upload da Fonte Arial
	    Arial = Content.Load<SpriteFont>("Arial");
	    //Upload dos Botões:
	    btnPlay_Play = new cButton(Content.Load<Texture2D>("play"), graphics.GraphicsDevice);
	    btnPlay_Play.setPosition(new Vector2(320, 300));
	    btnPlay_Controls = new cButton(Content.Load<Texture2D>("controls"), graphics.GraphicsDevice);
	    btnPlay_Controls.setPosition(new Vector2(320, 350));
	    btnPlay_Credits = new cButton(Content.Load<Texture2D>("credits"), graphics.GraphicsDevice);
	    btnPlay_Credits.setPosition(new Vector2(320, 400));
	    btnPlay_Easy = new cButton(Content.Load<Texture2D>("easy"), graphics.GraphicsDevice);
	    btnPlay_Easy.setPosition(new Vector2(320, 300));
	    btnPlay_Medium = new cButton(Content.Load<Texture2D>("medium"), graphics.GraphicsDevice);
	    btnPlay_Medium.setPosition(new Vector2(320, 350));
	    btnPlay_Hard = new cButton(Content.Load<Texture2D>("hard"), graphics.GraphicsDevice);
	    btnPlay_Hard.setPosition(new Vector2(320, 400));
	    btnPlay_Back = new cButton(Content.Load<Texture2D>("back"), graphics.GraphicsDevice);
	    btnPlay_Back.setPosition(new Vector2(20, 550));
	    //Upload das Img Background
	    background = Content.Load<Texture2D>("background_pong_the_game");
	    controls_background = Content.Load<Texture2D>("controls_background");
	    credits_background = Content.Load<Texture2D>("credits_background");
    }

    protected override void UnloadContent()
    {
	    // TODO: Unload any non ContentManager content here
    }

    protected override void Update(GameTime gameTime)
    {
	    // Allows the game to exit
	    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
		    this.Exit();
	    //Definição do GameState do Rato
	    MouseState mouse = Mouse.GetState();
	    //Menu Principal
	    switch (CurrentGameState)
	    {
		    //Definição do Menu Principal
		    case GameState.MainMenu:
		    {
			    if (btnPlay_Play.isClicked == true)
				    CurrentGameState = GameState.Play;
				    btnPlay_Play.update(mouse);
			    if (btnPlay_Controls.isClicked == true)
				    CurrentGameState = GameState.Controls;
				    btnPlay_Controls.update(mouse);
			    if (btnPlay_Credits.isClicked == true)
				    CurrentGameState = GameState.Credits;
				    btnPlay_Credits.update(mouse);
			    break;  
		    }

		    //Metodo do Play
		    case GameState.Play:
		    {
			    //Play_Menu
			    switch (Current_Play_GameState)
			    {
				    //Definição do Play_Menu
				    case GameState.Play_Menu:
					    {
						    if (btnPlay_Easy.isClicked == true)
							    Current_Play_GameState = GameState.Easy;
							    btnPlay_Easy.update(mouse);
						    if (btnPlay_Medium.isClicked == true)
							    Current_Play_GameState = GameState.Medium;
							    btnPlay_Medium.update(mouse);
						    if (btnPlay_Hard.isClicked == true)
							    Current_Play_GameState = GameState.Hard;
							    btnPlay_Hard.update(mouse);
						    break;
					    }
				    case GameState.Easy:
					    {
						    break;
					    }
				    case GameState.Medium:
					    {
						    break;
					    }
				    case GameState.Hard:
					    {
						    break;
					    }
			    }
			    break;
		    }
		    //Metodo do Controls
		    case GameState.Controls:
		    {
			    break;
		    }
		    //Metodo do Credits
		    case GameState.Credits:
		    {
			    break;
		    }
		    //Metodo Default
		    default:
		    {
			    break;
		    }
	    }

	    base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
	    // Desenha as texturas na tela
	    spriteBatch.Begin();

	    //Desenha o Menu Principal no Ecrã
	    //Menu Principal
	    switch (CurrentGameState)
	    {
		    //Definição do Menu Principal
		    case GameState.MainMenu:
			    {
				    spriteBatch.Draw(background, new Rectangle(0, 0, 800, 600), Color.White);
				    btnPlay_Play.Draw(spriteBatch);
				    btnPlay_Controls.Draw(spriteBatch);
				    btnPlay_Credits.Draw(spriteBatch);
				    break;
			    }
		    //Metodo do Play
		    case GameState.Play:
			    {
				    //Play_Menu
				    switch (Current_Play_GameState)
				    {
					    //Definição do Play_Menu
					    case GameState.Play_Menu:
						    {
							    spriteBatch.Draw(background, new Rectangle(0, 0, 800, 600), Color.White);
							    btnPlay_Easy.Draw(spriteBatch);
							    btnPlay_Medium.Draw(spriteBatch);
							    btnPlay_Hard.Draw(spriteBatch);
							    break;
						    }
					    case GameState.Easy:
						    {
							    break;
						    }
					    case GameState.Medium:
						    {
							    break;
						    }
					    case GameState.Hard:
						    {
							    break;
						    }  
				    }
				    break;
			    }
		    //Metodo do Controls
		    case GameState.Controls:
			    {
				    break;
			    }
		    //Metodo do Credits
		    case GameState.Credits:
			    {
				    break;
			    }
		    //Metodo Default
		    default:
			    {
				    break;
			    }
	    }
	    spriteBatch.End();
	    base.Draw(gameTime);
    }
   }
}

No entanto continuo com problemas quando clico no botão play e este segue para o seu sub-menu. Os icones do sub menu aparecem momentaneamente e depois fica a tela vazia com a cor default.

Porque será que isso acontece?

Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Sponsor

Tu do draw tens:

switch (Current_Play_GameState)
									 {
											 //Definição do Play_Menu
											 case GameState.Play_Menu:
													 {
															 spriteBatch.Draw(background, new Rectangle(0, 0, 800, 600), Color.White);
															 btnPlay_Easy.Draw(spriteBatch);
															 btnPlay_Medium.Draw(spriteBatch);
															 btnPlay_Hard.Draw(spriteBatch);
															 break;
													 }

Mas o teu Current_Play_GameState nunca o defines como sendo GameState.Play_Menu logo não te vai desenhar os botoes.

Primeiro faz um esquema ou algo do gênero que represente o teu jogo, assim é mais facil seguires a lógica do jogo...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

Tu do draw tens:

switch (Current_Play_GameState)
									 {
											 //Definição do Play_Menu
											 case GameState.Play_Menu:
													 {
															 spriteBatch.Draw(background, new Rectangle(0, 0, 800, 600), Color.White);
															 btnPlay_Easy.Draw(spriteBatch);
															 btnPlay_Medium.Draw(spriteBatch);
															 btnPlay_Hard.Draw(spriteBatch);
															 break;
													 }

Mas o teu Current_Play_GameState nunca o defines como sendo GameState.Play_Menu logo não te vai desenhar os botoes.

Primeiro faz um esquema ou algo do gênero que represente o teu jogo, assim é mais facil seguires a lógica do jogo...

O Current_Play_GameState como sendo GameState.Play_Menu esta definido logo abaixo do CurrentGameState no cimo do código. Tirando isso verificas mais algum erro?

Os botões no segundo MENU são apresentados, mas apenas momentaneamente ficando logo a tela com a cor default.

Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.