Map 如何使用文本文件中的矩阵在xna 4中制作地图
我试图通过逐行阅读文本文件来制作地图(因为我找不到如何逐字阅读)。所以我制作了一个map00.txt,看起来像“33000000111”(每个数字是一行,前两行是列数和行数,所以我加载到的矩阵看起来像 000 000 111 ).现在我应该在底部画3块瓷砖(1=画瓷砖)。我通过在矩阵*窗口高度(宽度)/矩阵行(列)数的位置绘制平铺来实现。 问题:我无法获得当前窗口宽度和高度的正确参数 装载瓷砖的代码:Map 如何使用文本文件中的矩阵在xna 4中制作地图,map,matrix,xna,2d,tile,Map,Matrix,Xna,2d,Tile,我试图通过逐行阅读文本文件来制作地图(因为我找不到如何逐字阅读)。所以我制作了一个map00.txt,看起来像“33000000111”(每个数字是一行,前两行是列数和行数,所以我加载到的矩阵看起来像 000 000 111 ).现在我应该在底部画3块瓷砖(1=画瓷砖)。我通过在矩阵*窗口高度(宽度)/矩阵行(列)数的位置绘制平铺来实现。 问题:我无法获得当前窗口宽度和高度的正确参数 装载瓷砖的代码: public int[,] LoadMatrix(string path)
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);
}
}
}
public int[,]LoadMatrix(字符串路径)
{
StreamReader sr=新的StreamReader(路径);
int[,]a=new int[int.Parse(sr.ReadLine().ToString()),
int.Parse(sr.ReadLine().ToString())];
for(int i=0;i
绘制瓷砖的代码:
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);
}
}
}
public void DrawTiles(SpriteBatch sp、GraphicsDeviceManager gdm)
{
对于(int i=0;i
但结果是,它们被绘制在屏幕底部上方约40像素处
我尝试了GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height(Width),但得到了相同的结果。当我把(理论上)应该是宽度/列和高度/行的计算数字放进去时,我得到了我想要的。因此,任何建议都将是非常宝贵的,因为我在google和Stack Overflow上对此已经有很长一段时间了。这里是一个重新编写的绘图代码版本,应该可以使用:
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);
}
}
}
}
public void DrawTiles(SpriteBatch sp、GraphicsDeviceManager gdm)
{
//您通常会在加载函数中预先计算这些值
int tileWidth=gdm.PreferredBackBufferWidth/matrix.GetLength(0);
int tileHeight=gdm.PreferredBackBufferWidth/matrix.GetLength(1);
//在所有瓷砖中循环
对于(int i=0;i
是否要指定gdm.PreferredBackBufferHeight/3
作为矩形的y坐标(而不是…Width
)。为什么有“if(i==1)”?