XNA - Foreach循环有奇怪的行为

时间:2013-03-09 11:31:31

标签: c# foreach xna

我正在使用XNA来构建游戏。

我有一个foreach循环,循环遍历带有tile的列表。在foreach循环中,它将检查是否单击了鼠标,鼠标是否位于图块上以及鼠标是否在某个容器内。

哪里出错了,就在

里面
MouseInput.IsTileHovered(tile, camera)

每个图块都有自己的图块位置,范围从x = 1到y = 1到x = 20和y = 15。 但是,在IsTileHovered()函数中,tile位置始终为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。

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

MouseInput.IsClicked

在foreach中的第二个tile上返回false,即使它仍然是相同的帧。所以我所要做的就是从

更改if语句中的顺序
if (MouseInput.IsClicked() && MouseInput.IsTileHovered(tile, camera)
        && MouseInput.IsMouseWithinTileContainer(backgroundRectangle))

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

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