7

別のタイルを指定して、特定のタイルの描画状態を設定する関数があります。描画状態が変化するタイルは、それを囲むタイルを比較し、それに応じて更新します。以下でそれを説明しようと思います

[b] [b] [a]
[b] [a] [a]
[a] [a] [a]  where a = sand && b = water

aがbがそれに隣接していることを検出すると、その描画状態を更新する必要があります。だから私は大文字、小文字、左大文字、右大文字で動作する関数を持っています。次に、その関数を変更して、左右のケース、右上のケース、右下のケースなどを処理できるようにする必要があります。これが私の関数です。

public override void CompareBorderingTiles(Tile T)
    {
        if (T is Water)
        {
            float leftBound = location.X - (Tile.TileWidth * Tile.TileScale);
            float rightBound = location.X + (Tile.TileWidth * Tile.TileScale);
            float upperBound = location.Y - (Tile.TileHieght * Tile.TileScale);
            float bottomBound = location.Y + (Tile.TileHieght * Tile.TileScale);
            if (T.GridLocation.X == leftBound)
            {
                drawstate = DrawState.Left;
            }
            if (T.GridLocation.X == rightBound)
                drawstate = DrawState.Right;
            if (T.GridLocation.Y == upperBound)
                drawstate = DrawState.Upper;
            if (T.GridLocation.Y == bottomBound)
                drawstate = DrawState.Lower; 
        }

        base.CompareBorderingTiles(T);
    }

なぜこの関数から抜け出したいのか、そうでないのかについては、かなり説明できるはずです。基本的に、ドローステートが何であるかを示す列挙型があります(ドローステートは列挙型です)。その正しい描画状態を設定してから関数から抜け出すことができるかどうか誰かに教えてもらえますか?

4

5 に答える 5

19

終了したい場所でreturnステートメントを使用するだけです。

return;

したがって、コードで次のことができます。

public override void CompareBorderingTiles(Tile T)
{
    if (T is Water)
    {
        float leftBound = location.X - (Tile.TileWidth * Tile.TileScale);
        float rightBound = location.X + (Tile.TileWidth * Tile.TileScale);
        float upperBound = location.Y - (Tile.TileHieght * Tile.TileScale);
        float bottomBound = location.Y + (Tile.TileHieght * Tile.TileScale);
        if (T.GridLocation.X == leftBound)
        {
            drawstate = DrawState.Left;
            return;
        }
        if (T.GridLocation.X == rightBound)
        {
            drawstate = DrawState.Right;
            return;
        }
        if (T.GridLocation.Y == upperBound)
        {
            drawstate = DrawState.Upper;
            return;
        }
        if (T.GridLocation.Y == bottomBound)
        {
            drawstate = DrawState.Lower; 
            return;
        }
    }

    base.CompareBorderingTiles(T);
}
于 2012-05-29T08:42:25.763 に答える
7

単独で使用するだけreturn;で、関数からすぐに「戻り」ます。

振り返ってみると、本当に戻る必要がありますか?

   if (T.GridLocation.X == leftBound)
    {
        drawstate = DrawState.Left;
    }
    else if (T.GridLocation.X == rightBound)
    {
        drawstate = DrawState.Right;
    }

    else if (T.GridLocation.Y == upperBound)
    {
        drawstate = DrawState.Upper;
    }
    else if (T.GridLocation.Y == bottomBound)
    {
        drawstate = DrawState.Lower; 
    }

これにより、将来的にコードを保守しやすくなります。

于 2012-05-29T08:42:23.173 に答える
7

で関数を終了できますreturn

于 2012-05-29T08:42:44.030 に答える
3

関数の任意の時点で使用できreturn;、関数はそのままになります。returnを使用すると、基本関数が呼び出されなくなります。基本関数をuseと呼ぶ必要がある場合、else if条件が満たされると、残りのifステートメントはチェックされません。

public override void CompareBorderingTiles(Tile T)
    {
        if (T is Water)
        {
            float leftBound = location.X - (Tile.TileWidth * Tile.TileScale);
            float rightBound = location.X + (Tile.TileWidth * Tile.TileScale);
            float upperBound = location.Y - (Tile.TileHieght * Tile.TileScale);
            float bottomBound = location.Y + (Tile.TileHieght * Tile.TileScale);
            if (T.GridLocation.X == leftBound)
            {
                drawstate = DrawState.Left;
            }
            else if (T.GridLocation.X == rightBound)
                drawstate = DrawState.Right;
            else if (T.GridLocation.Y == upperBound)
                drawstate = DrawState.Upper;
            else if (T.GridLocation.Y == bottomBound)
                drawstate = DrawState.Lower; 
        }

        base.CompareBorderingTiles(T);
    }
于 2012-05-29T08:46:23.717 に答える
0

関数を使用return; すると、voidとして返されます

于 2012-05-29T08:48:35.940 に答える