Jump to content
  • Advertisement
Sign in to follow this  
Chris Lawhorn

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

This topic is 2121 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
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!