Monogame C#:我怎样才能创建一个固定的图像网格以均匀地适合每个单元格?
Monogame C#: How can I go about creating a fixed grid of images that fit uniformly in each cell?
我想创建一个分成多个单元格的网格,这些单元格将包含 图像,它们不会改变它们的尺寸,但会均匀地适合每个单元格网格。我过去的尝试没有实现这个概念,因为最后一次尝试只使用了一个应用于对象位置的向量列表;我想知道您将如何在网格上实现这些单元格,然后在每个单元格中放置一个图像,确保图像不适应单元格的尺寸。
//Previous vector attempt
public int _screenHeight;
public int _screenWidth;
_screenWidth = GraphicsDevice.PresentationParameters.BackBufferWidth;
_screenHeight = GraphicsDevice.PresentationParameters.BackBufferHeight;
public List<Vector2> generateGrid(int _rows, int _cols)
{
// Example list
List<Vector2> gridPoints = new List<Vector2>();
int rows = _rows;
int cols = _cols;
int units_x = _screenWidth / rows;
int units_y = _screenHeight / cols;
for (int i = 0; i < _cols; i++)
for (int j = 0; j < _rows; j++)
gridPoints.Add(new Vector2(0 + units_x * j, 0 + units_y * i));
// returns the vector points
return gridPoints;
}
我目前的理论
- 创建一个单元格class,它通过绘制事件中的基本划分在定义的点将两个矩形(单元格和图像)嵌套在一起。
THEORY EXAMPLE
一旦你有了网格,你只需要将内部图像放在你的单元格的中心。
最简单的方法是使用偏移量。根据您的示例图像,您需要将其沿 X 轴居中。
这意味着您的 X 偏移量将是
int offsetX = (cellWidth - imageWidth) / 2;
从那里您可以通过迭代网格来使用网格点(假设点 0,0 是左上角)放置图像。
Vector2 imagePoition = new Vector2(gridPoints[i].X + offsetX, gridPoints[i].Y);
如果需要沿 Y 轴对齐,请对单元格高度和图像高度执行相同操作
您在上一次尝试(post 中的尝试)中的直觉与您想要实现的目标非常接近。您找到 Vector2
个位置的逻辑是正确的。
因为您已经有了网格点的坐标,您可以将 Texture2D
放在每个网格点位置上。
通过这样做,每个 Texture2D
的左上角将位于您分配给它的网格单元格的左上角。
您也不必担心 Texture2D
s 调整大小以适合网格单元格。每当您绘制它们时,它们将使用您提供的图像文件的尺寸绘制。
即如果您将 153x45px
图像分配给 Texture2D
,那么在绘制时它的大小仍将是 153x45
像素。 (也就是说,除非您更改了它的 scale
,但我假设您没有。)
如果你想让Texture2D
在网格单元格的左上角而不是,那么你必须偏移(X,Y)
坐标按您希望移动的像素的数量。
例如将 Texture2D
向下移动 15 个像素并向右移动 30 个像素需要您将其原始位置更新 (X + 15, Y + 30)
。
我想创建一个分成多个单元格的网格,这些单元格将包含 图像,它们不会改变它们的尺寸,但会均匀地适合每个单元格网格。我过去的尝试没有实现这个概念,因为最后一次尝试只使用了一个应用于对象位置的向量列表;我想知道您将如何在网格上实现这些单元格,然后在每个单元格中放置一个图像,确保图像不适应单元格的尺寸。
//Previous vector attempt
public int _screenHeight;
public int _screenWidth;
_screenWidth = GraphicsDevice.PresentationParameters.BackBufferWidth;
_screenHeight = GraphicsDevice.PresentationParameters.BackBufferHeight;
public List<Vector2> generateGrid(int _rows, int _cols)
{
// Example list
List<Vector2> gridPoints = new List<Vector2>();
int rows = _rows;
int cols = _cols;
int units_x = _screenWidth / rows;
int units_y = _screenHeight / cols;
for (int i = 0; i < _cols; i++)
for (int j = 0; j < _rows; j++)
gridPoints.Add(new Vector2(0 + units_x * j, 0 + units_y * i));
// returns the vector points
return gridPoints;
}
我目前的理论
- 创建一个单元格class,它通过绘制事件中的基本划分在定义的点将两个矩形(单元格和图像)嵌套在一起。
THEORY EXAMPLE
一旦你有了网格,你只需要将内部图像放在你的单元格的中心。 最简单的方法是使用偏移量。根据您的示例图像,您需要将其沿 X 轴居中。
这意味着您的 X 偏移量将是
int offsetX = (cellWidth - imageWidth) / 2;
从那里您可以通过迭代网格来使用网格点(假设点 0,0 是左上角)放置图像。
Vector2 imagePoition = new Vector2(gridPoints[i].X + offsetX, gridPoints[i].Y);
如果需要沿 Y 轴对齐,请对单元格高度和图像高度执行相同操作
您在上一次尝试(post 中的尝试)中的直觉与您想要实现的目标非常接近。您找到 Vector2
个位置的逻辑是正确的。
因为您已经有了网格点的坐标,您可以将 Texture2D
放在每个网格点位置上。
通过这样做,每个 Texture2D
的左上角将位于您分配给它的网格单元格的左上角。
您也不必担心 Texture2D
s 调整大小以适合网格单元格。每当您绘制它们时,它们将使用您提供的图像文件的尺寸绘制。
即如果您将 153x45px
图像分配给 Texture2D
,那么在绘制时它的大小仍将是 153x45
像素。 (也就是说,除非您更改了它的 scale
,但我假设您没有。)
如果你想让Texture2D
在网格单元格的左上角而不是,那么你必须偏移(X,Y)
坐标按您希望移动的像素的数量。
例如将 Texture2D
向下移动 15 个像素并向右移动 30 个像素需要您将其原始位置更新 (X + 15, Y + 30)
。