Monogame C #: как я могу создать фиксированную сетку изображений, которые равномерно помещаются в каждую ячейку? - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу создать сетку, которая разделена на ячейки, эти ячейки будут содержать изображений , которые не изменяют свои размеры, но будут равномерно вписываться в каждую ячейку сетки.Мои прошлые попытки не реализовывали эту концепцию, поскольку в последней попытке использовался только список векторов, который был применен к позиции объекта;Мне было интересно, как вы будете реализовывать эти ячейки в сетке, а затем размещать изображение внутри каждой ячейки, следя за тем, чтобы изображения не меняли размеры ячеек.

//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;
    }

Моя теория намомент

  • Создайте класс ячеек, который объединяет два прямоугольника (ячейка и изображение) вместе в определенных точках путем базового деления в событии рисования.

ПРИМЕР ТЕОРИИ

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Ваша интуиция в вашей предыдущей попытке (той, что была в вашем посте) была очень близка к тому, чего вы хотели достичь.Ваша логика для нахождения позиций Vector2 была правильной.

Поскольку у вас уже есть координаты для ваших точек сетки, вы можете просто поставить Texture2D s на каждую позицию сетки.

Делаяпри этом каждый Texture2D будет иметь свой левый верхний угол в левом верхнем углу ячейки сетки, которой вы его назначили.

Вам также не нужно беспокоиться о изменении размера Texture2D допоместите ячейки сетки.Всякий раз, когда вы рисуете их, они будут нарисованы с использованием размеров файла изображения, который вы им предоставили.

Т.е. если вы присвоили 153x45px изображение для Texture2D, тогда оно все равно будет 153x45 пикселейв размере, когда он нарисован.(То есть, если вы не изменили его scale, но я предполагаю, что вы этого не сделали.)

Если вы хотите, чтобы Texture2D был , а не на верхнемлевый угол ячейки сетки, тогда вы должны сместить (X,Y) координаты на величину пикселей , для которой вы хотите, чтобы это было смещено.

Например, смещение a Texture2D на 15 пикселей вниз и 30 пикселей вправо потребует обновления исходной позиции на (X + 15, Y + 30).

0 голосов
/ 14 декабря 2018

Когда у вас есть сетка, вам просто нужно поместить внутреннее изображение по центру в вашей ячейке.Самый простой подход - использовать смещение.В соответствии с вашим примером изображения вам нужно центрировать его вдоль оси X.

Это означает, что ваше смещение X будет

int offsetX = (cellWidth - imageWidth) / 2;

Оттуда вы можете размещать изображения, используя точки сетки.(при условии, что точка 0,0 - это верхний левый угол) путем итерации по вашей сетке.

Vector2 imagePoition = new Vector2(gridPoints[i].X + offsetX, gridPoints[i].Y);

Если вам нужно выровнять ее по оси Y, проделайте то же самое с высотой ячейки и высотой изображения

...