2D-игра на основе плитки, показывает ли разрывы между спрайтами плитки, когда я увеличиваю камеру? - PullRequest
1 голос
/ 28 мая 2011

Я использую метод D3DXSPRITE, чтобы рисовать плитки карты на экране, я просто добавил функцию масштабирования, которая увеличивает масштаб, когда вы удерживаете стрелку вверх, но заметил, что теперь вы можете видеть промежутки между плитками, вот некоторые снимки экрана

нормальный размер (32x32) на плитку

enter image description here

увеличено (вы можете видеть белые промежутки между плитками)

enter image description here

уменьшено (даже хуже!)

enter image description here

Вот фрагмент кода, с которым я перевожу и масштабирую мир.

D3DXMATRIX matScale, matPos;

D3DXMatrixScaling(&matScale, zoom_, zoom_, 0.0f);
D3DXMatrixTranslation(&matPos, xpos_, ypos_, 0.0f);

device_->SetTransform(D3DTS_WORLD, &(matPos * matScale));

А это мой рисунок карты (плитки находятся в векторе вектора плиток ... а я еще не выбрал)

LayerInfo *p_linfo = NULL;
  RECT rect = {0};
  D3DXVECTOR3 pos;
  pos.x = 0.0f;
  pos.y = 0.0f;
  pos.z = 0.0f;

  for (short y = 0; 
    y < BottomTile(); ++y)
  {
    for (short x = 0; 
          x < RightTile(); ++x)
    {
      for (int i = 0; i < TILE_LAYER_COUNT; ++i)
      {
        p_linfo = tile_grid_[y][x].Layer(i);

        if (p_linfo->Visible())
        {
          p_linfo->GetTextureRect(&rect);

          sprite_batch->Draw(
            p_engine_->GetTexture(p_linfo->texture_id), 
            &rect, NULL, &pos, 0xFFFFFFFF);
        }
      }
      pos.x += p_engine_->TileWidth();
    }
    pos.x = 0;
    pos.y += p_engine_->TileHeight();
  }

Ответы [ 5 ]

4 голосов
/ 28 мая 2011

Ваши индексы текстур неверны. 0,0,32,32 не является правильным значением - оно должно быть 0,0,31,31. Начиная с нуля индекс в вашем текстурном атласе 256 пикселей даст значения от 0 до 255, а не от 0 до 256, а текстура 32x32 должна дать 0,0,31,31. В этом случае цвет неправильных пикселей зависит от цвета следующей текстуры справа и снизу.

0 голосов
/ 18 июня 2016

После долгого поиска и тестирования решений для людей я обнаружил, что эти правила - самые полные правила, которые я когда-либо читал.

pixel-perfect-2d с официального сайта Unity

плюс с моим собственным опытом я обнаружил, что если спрайт PPI ​​равен 72 (например), вы должны попытаться использовать больше PPI для этого изображения (96 может быть илибольше). Это на самом деле делает спрайт более плотным и не оставляет места для белых пробелов.

0 голосов
/ 15 февраля 2014

У меня также была похожая проблема с наложением текстур. Для меня сработало изменение режима адреса текстуры в описании состояния сэмплера; Режим адресации текстуры используется для управления тем, что direct3d делает с координатами текстуры вне диапазона ([0.0f, 1.0f]): я изменил члены ADDRESS_U, ADDRESS_V, ADDRESS_W на D3D11_TEXTURE_ADDRESS_CLAMP, который в основном ограничивает все значения вне диапазона для координаты текстуры в диапазоне [0.0f, 1.0f].

0 голосов
/ 28 мая 2011

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

Я так думаю.

0 голосов
/ 28 мая 2011

Добро пожаловать в мир с плавающей точкой. Эти пробелы существуют из-за несовершенства использования чисел с плавающей запятой.

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

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

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

...