0

我正在使用 XNA Platformer Kit & 我正在尝试实现一个跟随玩家的相机。我遵循了David Amador 的 2D 相机教程,相机按预期工作,它跟随玩家。但问题是我所有的图块都不应该在“更新”方法中。

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

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

这是来自 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;
       }
   }
4

1 回答 1

0

设置磁贴时,您需要将相机位置添加到鼠标位置。

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

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

现在要添加您的相机位置,如果您希望缩放和旋转也继续进行,我们将需要使用矩阵。然后我们只需添加翻译值。

//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(...);
于 2013-06-14T21:40:22.393 回答