Jump to content

  • Log In with Google      Sign In   
  • Create Account


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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 Bagofsheep   Members   -  Reputation: 107

Like
0Likes
Like

Posted 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.

Sponsor:

#2 Bagofsheep   Members   -  Reputation: 107

Like
0Likes
Like

Posted 30 August 2012 - 09:03 PM

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




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS