• Advertisement
Sign in to follow this  

Issues with a Matrix Camera in 2D top-down game

This topic is 1970 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I created a simple camera that utilizes a Matrix (with the help of a tutorial). It's for a top-down 2D game. Here's the code:

[source lang="csharp"] class Camera
{
Vector2 position;
Matrix viewMatrix;

public Matrix ViewMatrix
{
get { return viewMatrix; }
}

public void Update(Vector2 playerPosition, int screenWidth, int screenHeight)
{
position.X = playerPosition.X - (screenWidth / 2);
position.Y = playerPosition.Y - (screenHeight / 2);

viewMatrix = Matrix.CreateTranslation(new Vector3(-position, 0));
}
}[/source]


I use this camera's matrix in my draw method so it will affect all of the objects and make the screen "scroll". The problem is when I start moving in any direction, my character's rotation starts to screw up. Essentially the further I move in any direction the more his rotation is locked to a specific direction. Another issue is that text is supposed to be drawn when the player's mouse is over an enemy. If I move just a bit though the text stops appearing above their head despite the mouse being on top of them. Here is the code for the draw method in the game:

[source lang="csharp"] protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, camera.ViewMatrix);

foreach (Gun gun in guns)
{
gun.updateRectangle();
gun.Draw(spriteBatch);
}

//Draw enemies and display their health if the player's mouse is over one
foreach (Actor d in enemies)
{
spriteBatch.Draw(d.Sprite, d.getPos(), null, Color.White, d.Rotation, d.getOrigin(), 1, SpriteEffects.None, 0);

if (playerMouse.isColliding(d))
spriteBatch.DrawString(healthFont, "" + d.Health + "/" + d.MaxHealth, new Vector2(d.X - 30, d.Y - 30), Color.White);
}

//Draw the bullets.
foreach (Bullet bu in bullets)
{
spriteBatch.Draw(bu.Sprite, bu.getPos(), null, Color.White, bu.Rotation, bu.getOrigin(), 1, SpriteEffects.None, 0);
}

//Draw the player
spriteBatch.Draw(player1feet.Sprite, player1feet.getPos(), null, Color.White, player1feet.Rotation, player1feet.getOrigin(), 1, SpriteEffects.None, 0);

if (playerInventory.EquippedWeapon != null)
{
spriteBatch.Draw(player1leftArm.Sprite, armPosition, null, Color.White, player1.Rotation + MathHelper.ToRadians(31), player1leftArm.getOrigin(), 1, SpriteEffects.None, 0);

if (playerInventory.EquippedWeapon.TypeofGun == Gun.GunType.Rifle)
spriteBatch.Draw(player1rightArm.Sprite, equippedGunPosition, null, Color.White, player1.Rotation, player1rightArm.getOrigin(), 1, SpriteEffects.None, 0);

spriteBatch.Draw(playerInventory.EquippedWeapon.OverheadSprite, equippedGunPosition, null, Color.White, player1.Rotation, playerInventory.EquippedWeapon.EquippedOrigin, 1, SpriteEffects.None, 0);
}

spriteBatch.Draw(player1shoulders.Sprite, player1shoulders.getPos(), null, Color.White, player1shoulders.Rotation, player1shoulders.getOrigin(), 1, SpriteEffects.None, 0);
spriteBatch.Draw(player1.Sprite, player1.getPos(), null, Color.White, player1.Rotation, player1.getOrigin(), 1, SpriteEffects.None, 0);

spriteBatch.End();

spriteBatch.Begin();

playerInventory.Draw(spriteBatch, sprite_inventory_square, sprite_inventory_equip_square, sprite_equip_highlight, debugFont, playerMouse.getPos(), playerMouse);

if (playerMouse.Object != null)
playerMouse.Object.Draw(spriteBatch);

//Draw the player's mouse
spriteBatch.Draw(playerMouse.Sprite, playerMouse.getPos(), null, Color.White, playerMouse.Rotation, playerMouse.getOrigin(), 1, SpriteEffects.None, 0);

spriteBatch.End();

base.Draw(gameTime);
}[/source]


Here is the code used to make the player rotate (to face the mouse):

[source lang="csharp"] public void facePoint(float x, float y)
{
float distanceX;
float distanceY;

distanceX = x - pos.X;
distanceY = y - pos.Y;

rotation = (float)Math.Atan2(distanceY, distanceX);
}[/source]


Let me know if more code needs to be seen.

Share this post


Link to post
Share on other sites
Advertisement
I finally found an answer. I will post a link here for those of you who may encounter a similar issue in the future:
http://gamedev.stackexchange.com/questions/25692/picking-2d-objects-after-transforming-camera-in-xna

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement