0

我正在使用 XNA 构建游戏。

我有一个 foreach 循环,它遍历一个带有瓷砖的列表。在 foreach 循环中,它会检查鼠标是否被点击、鼠标是否在瓷砖上以及鼠标是否在某个容器内。

哪里出错了,在里面

MouseInput.IsTileHovered(tile, camera)

每个图块都有自己的图块位置,范围从 x=1 和 y=1 到 x=20 和 y=15。但是,在 IsTileHovered() 函数中,平铺位置始终为 x=1 和 y=1。这是不正确的。正如我所说,每块瓷砖都有自己的位置,这是独一无二的。tilePosition 用于计算 worldPosition。

带有 foreach 循环的函数

public void PlaceNewTileOnMap(MapEditorTile newTile)
{
    foreach (Tile tile in tiles)
    {
        if (MouseInput.IsClicked() && MouseInput.IsTileHovered(tile, camera)
            && MouseInput.IsMouseWithinTileContainer(backgroundRectangle))
        {
            tile.SetTileInfo(newTile.GetTileInfo());
            tile.SetCurrentFrame(newTile.GetCurrentFrame());

            Vector2 maxTiles = new Vector2(
                Constants.MAP_EDITOR_DEFAULT_HORIZONTAL_TILES,
                Constants.MAP_EDITOR_DEFAULT_VERTICAL_TILES);

            MainTileGenerator tileGenerator = new MainTileGenerator(tile, tiles, maxTiles);
            UpdateCorrectedTiles(tileGenerator.CorrectTiles());
        }
    }
}

总是接收位置 x=1 和 y=1 的图块的函数

public static bool IsTileHovered(Tile tile, Camera camera)
{
    Vector2 mouseWorldPosition = Vector2.Transform(new Vector2(newMouseState.X, newMouseState.Y),
        Matrix.Invert(camera.GetTransformation()));

    if (mouseWorldPosition.X > tile.GetWorldPosition().X
        && mouseWorldPosition.X < tile.GetWorldPosition().X + (tile.GetSingleElementSize().X * GameServices.UIService.ScreenScale)
        && mouseWorldPosition.Y > tile.GetWorldPosition().Y
        && mouseWorldPosition.Y < tile.GetWorldPosition().Y + (tile.GetSingleElementSize().Y * GameServices.UIService.ScreenScale))
    {
        return true;
    }
    else
    {
        return false;
    }
}

当我在 foreach 循环中将 tilePositions 写入控制台时,但在 if 语句之前,我得到了所有唯一的 tilePositions,这是正确的。但是,当我在 IsTileHovered() 函数中执行相同操作时,tilePosition 为 x=1 和 y=1,无论它使用列表中的哪个图块。

有谁知道我做错了什么?

4

1 回答 1

0

好吧,所以这对我来说太愚蠢了。看来,

MouseInput.IsClicked

在 foreach 中的第二个图块上返回 false,即使它仍然是同一帧。所以我所要做的就是改变 if 语句中的顺序

if (MouseInput.IsClicked() && MouseInput.IsTileHovered(tile, camera)
        && MouseInput.IsMouseWithinTileContainer(backgroundRectangle))

if (MouseInput.IsTileHovered(tile, camera)
    && Input.IsMouseWithinTileContainer(backgroundRectangle)
    && MouseInput.IsClicked())

它现在会检查鼠标是否最后被点击了,所以现在它会循环遍历所有我想要的图块。:)

于 2013-03-09T16:15:37.627 回答