0

テキストファイルを1行ずつ読み取ってマップを作成しようとしています(単語ごとにその方法を見つけることができないため)。したがって、「33000000111」のような map00.txt を作成します (すべての数字は 1 行で、最初の 2 行は列と行の数であるため、読み込む行列は 000 000 111 のようになります)。ここで、下部に 3 つのタイルを描画することになっています (1 = タイルを描画)。これを行うには、行列 * ウィンドウの高さ (幅) / 行 (列) の行列数の位置にタイルを描画します。 問題:現在のウィンドウの幅と高さの正しいパラメーターを取得できません。

タイルをロードするためのコード:

    public int[,] LoadMatrix(string path) 
    {
        StreamReader sr = new StreamReader(path);
        int[,] a = new int[int.Parse(sr.ReadLine().ToString()), 
                           int.Parse(sr.ReadLine().ToString())];

        for(int i = 0; i < a.GetLength(0); i++)
            for (int j = 0; j < a.GetLength(1); j++)
            { a[i, j] =int.Parse(sr.ReadLine().ToString()); }

        sr.Close();
        return a;
    }

タイルを描画するためのコード:

    public void DrawTiles(SpriteBatch sp, GraphicsDeviceManager gdm)
    {
        for(int i = 0; i < matrix.GetLength(0); i++)
            for(int j = 0; j < matrix.GetLength(1); j++)
            {
                if (i == 1)
                {
                    sp.Draw(tile, 
                            new Rectangle(j * (gdm.PreferredBackBufferWidth / 3),//matrix.GetLength(1),
                                          i * (gdm.PreferredBackBufferWidth / 3),//matrix.GetLength(0),
                                          gdm.PreferredBackBufferWidth / matrix.GetLength(1),
                                          gdm.PreferredBackBufferHeight / matrix.GetLength(0)),
                            Color.White);
                }
            }
    }

しかし、その結果、画面の下部から約 40 ピクセル上に描画されます。

GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height(Width) を試しましたが、同じ結果が得られました。そして、(理論的には)幅/列と高さ/行である必要がある計算された数値を入力すると、必要なものが得られます。したがって、GoogleとStack Overflowで長い間これに固執しているため、提案は非常に高く評価されます。

4

1 に答える 1

0

これは、動作するはずの Draw コードの修正版です。

public void DrawTiles(SpriteBatch sp, GraphicsDeviceManager gdm)
{ 
    //You would typically pre-compute these in a load function
    int tileWidth = gdm.PreferredBackBufferWidth / matrix.GetLength(0);
    int tileHeight = gdm.PreferredBackBufferWidth / matrix.GetLength(1);

    //Loop through all tiles
    for(int i = 0; i < matrix.GetLength(0); i++)
    {
        for(int j = 0; j < matrix.GetLength(1); j++)
        {
            //If tile value is not 0
            if (matrix[i,j] != 0)
            {
                 sp.Draw(tile, new Rectangle(i * tileWidth, j * tileHeight, tileWidth, tileHeight), Color.White);
            }
        }
  }
}
于 2013-02-13T11:58:15.343 に答える