Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


Bagofsheep

Member Since 29 Aug 2012
Offline Last Active Feb 08 2013 07:37 PM

Topics I've Started

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

29 August 2012 - 04:49 PM

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.

PARTNERS