3

学習課題として 2D スクロール XNA ゲームを作成しようとしていますが、スクロール バックグラウンドで問題が発生しました。テキスト ファイルからレベルを読み込み、解析して適切なタイルを作成し、それらをマトリックス (タイル[,]) に格納しています。

次に、タイルの位置を変更する更新メソッドを用意して、再描画時にタイルが移動するようにします。

現在、すべてのタイルをループして、移動する前にすべてを描画しています。これは明らかにあまり効率的ではありません。理想的には、画面にタイルを描画するだけです。次のように、ビューポートを取得し、タイルの高さ/幅を使用して、画面に収まるタイルの数を決定し、それらのタイルのみをループすることでこれを行うことができます。

private void DrawTiles(SpriteBatch spriteBatch)
{
    float tileWidth = 40;
    float tileHeight = 32;


    for (int y = 0; y < (int)Math.Ceiling(mViewport.Height / tileHeight); ++y)
    {

       for (int x = 0; x < (int)Math.Ceiling(mViewport.Width / tileWidth); ++x)
        {
            tiles[x, y].Draw(spriteBatch);
        }
    }
}

ただし、これは元のビューポートにタイルを描画するだけです。外側のタイルは、位置が表示されても描画されません。

これは、カウンターを使用してループを開始および終了し、draw メソッドが呼び出されるたびにインクリメントすることで解決できると思います。ただし、これが優れた解決策だとは思いませんが、残念ながら、ビューポート内のタイルのみが描画されるようにするためのより良い方法は考えられません。

4

2 に答える 2

0

私がデザインに実装したのは、プロパティ IsInView と衝突プロパティを含む継承されたインターフェイスでした。または、あなたの場合は位置を置き換えることができました。次に、ループしてオブジェクトが表示されているかどうかを判断する別のスレッドを作成しました。次に、各オブジェクトで InView と OutView を描画リストに追加したり、描画リストから削除したりできます。

ループを使用して別のスレッドから実行します。-- これを適用して、タイルが表示されているかどうかを判断できます

    public void CalculateObjsInView()
    {
        foreach (Obj o in new List<Obj>(ObjInstanceList))
        {
            if (o == null)
                continue;
            if (Camera.CollisionMask.Intersects(o.CollisionMask))
                o.IsInView = true;
            else
                o.IsInView = false;
        }
    }

Obj クラスで

    private bool _isInView = false;
    public bool IsInView
    {
        get { return _isInView; }
        set
        {
            if (_isInView != value)
            {
                if (value)
                    InView();
                else
                    OutView();
            }
            _isInView = value;
        }
    }

    private void InView()
    {
        Game.ObjectDrawEventHandler.Add(Draw);
    }
    private void OutView()
    {
        Game.ObjectDrawEventHandler.Remove(Draw);
    }
于 2013-06-19T09:05:20.477 に答える