Platformer入门套件相机滚动问题

时间:2013-06-14 20:17:09

标签: c# matrix xna camera 2d

我正在使用XNA平台套件&我正在尝试实现跟随玩家的相机。我跟着David Amador's 2D Camera tutorial,相机按预期工作,它跟随玩家。但问题是我的所有瓷砖都不在“更新”方法中。

瓷砖在屏幕上正确绘制,但是如果我尝试点击一个瓷砖(我已经实现了,如果你用鼠标点击一个瓷砖它会破坏和消失)没有任何反应,但是如果我点击屏幕的底部(在我实施相机之前绘制的瓷砖,它们应该消失。如果有人遇到这个问题我会喜欢一些帮助!

(当我实现相机时,就像我的鼠标位置不正确一样)

这是来自Player类更新方法(这是我进行更改的地方)

代码:

 MouseState mouseState = Mouse.GetState();
   int cellX = (int)(camera.Pos.X + mouseState.X) / Tile.Width;
   int cellY = (int)(camera.Pos.Y + mouseState.Y) / Tile.Height;
   if (cellX < Level.Width && cellX >= 0 && cellY < Level.Height && cellY >= 0)
   {
       if (Level.GetTileAt(cellX, cellY).Collision != TileCollision.Passable)
       {
           if (Level.tiles[cellX, cellY].isDead != true)
           {
               selectionHooverRectangle = Level.GetBounds(cellX, cellY);
               drawHooverRectangle = true;
               hooveredVaildTile = true;
           }
           else
           {
               drawHooverRectangle = false;
               hooveredVaildTile = false;
           }
       }
       else
       {
           drawHooverRectangle = false;
           hooveredVaildTile = false;
       }
   } 

   if (cellX < Level.Width && cellX >= 0 && cellY < Level.Height && cellY >= 0)
   {
       if (mouseState.LeftButton == ButtonState.Pressed)
       {
           Level.tiles[cellX, cellY].isDead = true;
       }
   }

1 个答案:

答案 0 :(得分:0)

设置图块时,需要将相机位置添加到鼠标位置。

我假设你使用这样的东西来描述/创建瓷砖,任何带有X和Y值的东西都可以使用,所以只需替换你的方法所需的东西。

Tiles[MouseX / TileSize, MouseY / TileSize] = new Tile(...);

现在要添加相机位置,如果您希望缩放和旋转也可以继续使用matrix。然后我们只添加翻译值。

//Get the transformation matrix
Matrix cameraTransform = cam.get_transformation(device /* Send the variable that has your graphic device here */));

//Find the X and Y position by adding the matrix value to the mouse position, and scaling it down by your tile size
float X = (-cameraTransform.Translation.X + MouseX) / TileSize;
float Y = (-cameraTransform.Translation.Y + MouseY) / TileSize;

//Do Stuff with the tile
Tiles[(int)X,(int)Y] = new Tile(...);

或者,如果您不关心旋转和缩放,您只需添加没有矩阵的摄像机位置

float X = (cam.Position.X + MouseX) / TileSize;
float Y = (cam.Position.Y + MouseY) / TileSize;

//Do Stuff with the tile
Tiles[(int)X,(int)Y] = new Tile(...);