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 の 2 番目のタイルで 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 に答える