Jump to content

View more

Image of the Day

#indiedev  #indiegame #screenshotsaturday https://t.co/IwVbswGrhe
IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

Sign up now

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

4: Adsense

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   


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.

#2 Bagofsheep   Members   


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:

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.