Following this admittedly brilliant and clean 2d camera class I have a camera on each player, and it works for multiplayer and i've divided the screen into two sections for split screen by giving each camera a viewport. However in the game it looks like this
I'm not sure if thats their position relative to the screen or what
The relevant gameScreen code, the makePlayers is setup so it could theoretically work for up to 4 players
private void makePlayers()
{
int rowCount = 1;
if (NumberOfPlayers > 2) rowCount = 2;
players = new Player[NumberOfPlayers];
for (int i = 0; i < players.Length; i++)
{
int xSize = GameRef.Window.ClientBounds.Width / 2;
int ySize = GameRef.Window.ClientBounds.Height / rowCount;
int col = i % rowCount;
int row = i / rowCount;
int xPoint = 0 + xSize * row;
int yPoint = 0 + ySize * col;
Viewport viewport = new Viewport(xPoint, yPoint, xSize, ySize);
Vector2 playerPosition = new Vector2(viewport.TitleSafeArea.X + viewport.TitleSafeArea.Width / 2,
viewport.TitleSafeArea.Y + viewport.TitleSafeArea.Height / 2);
players[i] = new Player(playerPosition, playerSprites[i], GameRef, viewport);
}
//players[1].Keyboard = true;
}
public override void Draw(GameTime gameTime)
{
base.Draw(gameTime);
foreach (Player player in players)
{
GraphicsDevice.Viewport = player.PlayerCamera.ViewPort;
GameRef.spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, player.PlayerCamera.Transform);
map.Draw(GameRef.spriteBatch);
// Draw the Player
player.Draw(GameRef.spriteBatch);
// Draw UI screen elements
GraphicsDevice.Viewport = Viewport;
ControlManager.Draw(GameRef.spriteBatch);
GameRef.spriteBatch.End();
}
}
the player's initialize and draw methods are like so
internal void Initialize()
{
this.score = 0;
this.angle = (float)(Math.PI * 0 / 180);//Start sprite at it's default rotation
int width = utils.scaleInt(picture.Width, imageScale);
int height = utils.scaleInt(picture.Height, imageScale);
this.hitBox = new HitBox(new Vector2(centerPos.X - width / 2, centerPos.Y - height / 2), width, height, Color.Black, game.Window.ClientBounds);
playerCamera.Initialize();
}
#region Methods
public void Draw(SpriteBatch spriteBatch)
{
//Console.WriteLine("Hitbox: X({0}),Y({1})", hitBox.Points[0].X, hitBox.Points[0].Y);
//Console.WriteLine("Image: X({0}),Y({1})", centerPos.X, centerPos.Y);
Vector2 orgin = new Vector2(picture.Width / 2, picture.Height / 2);
hitBox.Draw(spriteBatch);
utils.DrawCrosshair(spriteBatch, Position, game.Window.ClientBounds, Color.Red);
spriteBatch.Draw(picture, Position, null, Color.White, angle, orgin, imageScale, SpriteEffects.None, 0.1f);
}
as I said I think I'm gonna need to do something with the render position but I'm to entirely sure what or how it would be elegant to say the least