Requisitos:
Monogame: http://www.monogame.net/downloads/
Visual Studio: https://www.visualstudio.com/pt-br/vs/community/
Genkai.dll: http://cafecomengine.blogspot.com.br/p/genkai-framework.html
Passo 01:
Crie um novo projeto no Visual Studio, vou nomeá-lo de PongGame. Referencie a dll "Genkai.dll" ao projeto.
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Genkai;
Na solução criada, no arquivo Game1.cs, crie duas variáveis chamadas sceneManager e inputHelperManager:
public class Game1 : Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
SceneManager sceneManager;
InputHelperManager inputHelperManager;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
No método Initialize() inicialize a variável inputHelperManager (e o adicione ao Services), modifique também a posição da janela do jogo e seu tamanho:
protected override void Initialize()
{
// TODO: Add your initialization logic here
inputHelperManager = new InputHelperManager(this);
inputHelperManager.Add(PlayerIndex.One, KeyboardSettings.KeyboardDefault().GetKeyboardMap());
Services.AddService(inputHelperManager);
GameHelper.SetGameSize(GameSize.w800h600, ref graphics);
Window.Position = GameHelper.GetCenterScreen(this);
base.Initialize();
}
No método LoadContent() inicialize a variável sceneManager com o seguinte código (não se preocupe se no momento o Visual Studio informar algum erro):
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
Services.AddService(spriteBatch);
// TODO: use this.Content to load your game content here
sceneManager = new SceneManager(this);
Services.AddService(sceneManager);
sceneManager.Add("pong", new PongScene(this));
sceneManager.Change("pong");
}
No método Update() digite o seguinte código:
protected override void Update(GameTime gameTime)
{
if (inputHelperManager.One.IsPress(Buttons.Back))
Exit();
// TODO: Add your update logic here
inputHelperManager.Update(gameTime);
sceneManager.Update(gameTime);
base.Update(gameTime);
}
e no método Draw() o seguinte código:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(sceneManager.ActiveScene.BackColor);
// TODO: Add your drawing code here
sceneManager.Draw(gameTime);
base.Draw(gameTime);
}
Passo 02:
Crie uma nova classe chama PongScene.cs. Ela será herdeira da classe Genkai.Scene. Digite então o seguinte código:
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using System;
using Genkai;
namespace PongGame
{
public class PongScene : Scene
{
public PongScene(Game game) : base(game, TimeSpan.Zero, true) { }
Crie agora um método sobrecarregado sem retorno chamado Load():
public override void Load()
{
base.Load();
}
dentro dele digite o seguinte código:
//Troca a cor de fundo.
BackColor = Color.Green;
//Retângulo de fundo ------------------------------------------------------------------------
AnimatedEntity backRectangle = AnimatedEntity.CreateRectangle(this.Game, new Vector2(600, 400), Color.Black);
backRectangle.SetPosition(100, 100);
Agora vamos criar o retângulo e desenvolver a lógica do jogador 01:
//Retângulo do jogador 1 --------------------------------------------------------------------
AnimatedEntity rectangleOne = AnimatedEntity.CreateRectangle(this.Game, new Vector2(10, 100), Color.White);
rectangleOne.SetPosition(backRectangle.Position.X + 20, backRectangle.Position.Y + 10);
rectangleOne.OnUpdate += (GameTime gt, AnimatedEntity e) =>
{
//Verifica a posição e corrige se necessário
if (!e.IsAbove(backRectangle, 20))
{
if (e.Input.IsDown(Buttons.DPadUp))
e.Y -= 5;
}
if (!e.IsBelow(backRectangle, -20, true))
{
if (e.Input.IsDown(Buttons.DPadDown))
e.Y += 5;
}
};
O mesmo para o jogador 02:
//Retângulo do jogador 2 --------------------------------------------------------------------
AnimatedEntity rectangleTwo = AnimatedEntity.CreateRectangle(this.Game, new Vector2(10, 100), Color.White);
rectangleTwo.SetPosition(backRectangle.Position.X + backRectangle.Width - 30, backRectangle.Position.Y + 10);
//rectangleTwo.Input = Game.Services.GetService<InputHelperManager>().Two;
rectangleTwo.OnUpdate += (GameTime gt, AnimatedEntity e) =>
{
//Verifica a posição e corrige se necessário
if (!e.IsAbove(backRectangle, 20, false))
{
if (e.Input.IsDown(Buttons.DPadUp))
e.Y -= 5;
}
if (!e.IsBelow(backRectangle, -20, true))
{
if (e.Input.IsDown(Buttons.DPadDown))
e.Y += 5;
}
};
Criemos então o retângulo da bola e sua lógica:
//Bola--------------------------------------------------------------------------------------
AnimatedEntity ball = AnimatedEntity.CreateRectangle(this.Game, new Vector2(10, 10), Color.White);
ball.SetScreenPosition(Camera, AlignType.Center);
ball.SetVelocity(-2, -2);
ball.OnUpdate += (GameTime gt, AnimatedEntity e) =>
{
//Checa posição na borda
if (e.IsAbove(backRectangle, 10) || e.IsBelow(backRectangle, -10, true))
e.InvertVelocityY();
//Checa colisão
if(e.Collide(rectangleOne))
{
e.X = (rectangleOne.X + rectangleOne.Width) + 1;
e.InvertVelocityX();
if (e.X_Velocity < 20)
e.X_Velocity += 0.5f;
}
if (e.Collide(rectangleTwo))
{
e.X = (rectangleTwo.X - rectangleTwo.Width) - 1;
e.InvertVelocityX();
if(e.X_Velocity > -20)
e.X_Velocity += -0.5f;
}
//Checa se foi ponto
if (e.IsOnTheLeft(backRectangle, 0, true))
{
e.SetScreenPosition(Camera, AlignType.Center);
float x = e.X_Velocity - (e.X_Velocity - 2);
e.X_Velocity = x;
}
if(e.IsOnTheRight(backRectangle, 0, false))
{
e.SetScreenPosition(Camera, AlignType.Center);
float x = e.X_Velocity - (e.X_Velocity - 2);
e.X_Velocity = x * -1;
}
};
Por fim adicionamos as entidades à cena com o método Entitys.Add();
//Entidades --------------------------------------------------------------------------------
Entitys.Add("backRectangle", backRectangle);
Entitys.Add("rectangleOne", rectangleOne);
Entitys.Add("rectangleTwo", rectangleTwo);
Entitys.Add("ball", ball);
base.Load();
Rode o código e finalize colocando algum efeito de som.
Abraços.