2015-11-22 7 views
14

В моем 2D изометрического двигателе, у меня есть следующие классы:SF :: Texture применяется неправильно

`maps(variable)/layers(variable)/cubes(variable)/sides(6)/points(4)/coordinates(3)` 

enter image description here

  • Каждого sides содержит (1 point = 1 coordinate (x, y, z)).
  • Каждый кубик содержит 6 сторон.
  • Я могу создать карту с размером, который я хочу с кубами (то же самое, размер я хочу).

Folers:

assets/numTexture/numLight.png 

Я calcule с numTexture и numLight числовой который является самым textureNumberEntry (я загружен все numLight.png (текстуры) в массиве).

Но текстурирования gones неправильно:

enter image description here

Я определяю свои координаты кубов в классе слоя:

for(int J = 0; J < mapSize; J++) 
{ 
    for(int I = 0; I < mapSize; I++) 
    { 
     x = (J - I) * (cubeSize/2); 
     y = (J + I) * (cubeSize/4); 

     c = new cube(cubeSize, x, y, z, I, J); 
     cs.push_back(*c); 
    } 
} 

В side.cpp, у меня есть переключатель на sideType (если это верхний, левый и т. д. ... я иначе определяю координаты своих точек). У меня есть 6 из них для каждого кубов (только данные здесь) Как это:

switch(typeSide) 
     { 
      case 0://DOWN_SIDE 
       light = 0; 

       tmp_x = x + (size/2); 
       tmp_y = y + (size/2); 
       p0 = new point(tmp_x, tmp_y, tmp_z); 

       tmp_x = x + size; 
       tmp_y = y + (3 * (size/4)); 
       p1 = new point(tmp_x, tmp_y, tmp_z); 

       tmp_x = x + (size/2); 
       tmp_y = y + size; 
       p2 = new point(tmp_x, tmp_y, tmp_z); 

       tmp_x = x; 
       tmp_y = y + (3 * (size/4)); 
       p3 = new point(tmp_x, tmp_y, tmp_z); 
       break; 

//ETC. .... 

И функция дисплея() для отображения карты:

void GRAPHICS_HANDLER::display() 
{ 
    x = 0; 
    y = 0; 

    if(maps.size() > 0 && maps[0].layers().size() > 0)//If there is any map and layers to display 
    { 
     for(int l = 0; l <= getCurrentLayerID(); l++)//FOR EACH LAYER, WE STOP TO THE CURRENT EDITED LAYER 
     { 
      for(unsigned int c = 0; c < maps[currentMapID].layers()[l].cubes().size(); c++)//FOR EACH CUBES 
      { 
       if(maps[currentMapID].layers()[l].cubes()[c].getFlat())//If flat mode is enabled: to draw texture like grass, etc...(cf. screen): We draw only one side 
       { 
        for(unsigned int p = 0; p < 4; p++)//FOR EACH POINTS 
        { 
//--------------------------------------------------------------------------------------LOAD MAP-----------------------------------------------------------------------------------------------------------// 
//--------------------------------------------------------------------------CUBE CLICK DETECTION::TEXTURE CHANGE--------------------------------------------------// 
         if(cubeClicked || brushMode && currentSelectedCube > -1 && currentSelectedCube < maps[currentMapID].layers()[maps[currentMapID].currentLayerId()].cubes().size()) 
         { 
          maps[currentMapID].layers()[maps[currentMapID].currentLayerId()].cubes()[currentSelectedCube].setTexture(currentSelectedTexture); 

          if(!brushMode) 
           cubeClicked = false; 
         } 
//--------------------------------------------------------------------------CUBE CLICK DETECTION::TEXTURE CHANGE--------------------------------------------------// 
//--------------------------------------------------------------------------------------CURSOR - NOT WORKING-----------------------------------------------------------------------------------------------------------------// 
         //... 
//--------------------------------------------------------------------------------------CURSOR - NOT WORKING-----------------------------------------------------------------------------------------------------------------*/ 

         if(enableOffset) 
         { 
          x = maps[currentMapID].layers()[l].cubes()[c].sides()[0]->pointPosition(p)[0] + offsetLeft;//it's like doing something like point[p].x + offset left 
          y = maps[currentMapID].layers()[l].cubes()[c].sides()[0]->pointPosition(p)[1] + offsetTop; 
         } 
         else 
         { 
          x = maps[currentMapID].layers()[l].cubes()[c].sides()[0]->pointPosition(p)[0];//it's like doing something like point[p].x + offset left 
          y = maps[currentMapID].layers()[l].cubes()[c].sides()[0]->pointPosition(p)[1]; 
         } 

         points[p].position = sf::Vector2f(x, y); 
         points[p].texCoords = sf::Vector2f(x, y); 

//--------------------------------------------------------------------------------------GRID-----------------------------------------------------------------------------------------------------------------// 
         //GRID DISPLAY //MISS AN EDGE . 
         isoGrid[p].position = points[p].position; 
         isoGrid[p].color = sf::Color(195, 195, 195, gridOpacity); 
//--------------------------------------------------------------------------------------GRID-----------------------------------------------------------------------------------------------------------------// 

         maps[currentMapID].layers()[l].cubes()[c].sides()[0]->setLight(5); 
         textureEntryNumber = (maps[currentMapID].layers()[l].cubes()[c].sides()[0]->getTexture() - 1) * 9 + (maps[currentMapID].layers()[l].cubes()[c].sides()[0]->getLight() - 1);//WRONG 
//--------------------------------------------------------------------------------------GRID-----------------------------------------------------------------------------------------------------------------// 
//--------------------------------------------------------------------------------------LOAD MAP-----------------------------------------------------------------------------------------------------------// 
        } 
//--------------------------------------------------------------------------------------DISPLAY MAP-----------------------------------------------------------------------------------------------------------// 
        if(grid && maps[currentMapID].layers()[l].cubes()[c].sides()[0]->getTexture() <= 1)//IF GRID = TRUE OR TEXTURE LESS OR EQUAL TO 1 => DISPLAY GRID 
        { 
         if(l == maps[currentMapID].currentLayerId()) 
         { 
          window->draw(isoGrid); 
         } 
        } 
        else if(maps[currentMapID].layers()[l].cubes()[c].sides()[0]->getTexture() > 1)//IF THERE IS ANY TEXTURE TO DISPLAY(>1) => DISPLAY TEXTURE 
        { 
         window->draw(points, &textures[textureEntryNumber]); 
        } 
//--------------------------------------------------------------------------------------DISPLAY MAP-----------------------------------------------------------------------------------------------------------// 
       } 
       else 
       { 
        for(unsigned int s = 0; s < 6; s++)//FOR EACH SIDES(side number will always be 6, no need to make this dynamic 
        { 
         for(unsigned int p = 0; p < 4; p++)//FOR EACH POINTS 
         { 
//--------------------------------------------------------------------------------------LOAD MAP-----------------------------------------------------------------------------------------------------------// 
//--------------------------------------------------------------------------CUBE CLICK DETECTION::TEXTURE CHANGE--------------------------------------------------// 
          if(cubeClicked || brushMode && currentSelectedCube > -1 && currentSelectedCube < maps[currentMapID].layers()[maps[currentMapID].currentLayerId()].cubes().size()) 
          { 
           maps[currentMapID].layers()[maps[currentMapID].currentLayerId()].cubes()[currentSelectedCube].setTexture(currentSelectedTexture); 

           if(flatMode) 
            maps[currentMapID].layers()[maps[currentMapID].currentLayerId()].cubes()[currentSelectedCube].setFlat(true); 
           else 
            maps[currentMapID].layers()[maps[currentMapID].currentLayerId()].cubes()[currentSelectedCube].setFlat(false); 


           if(!brushMode) 
            cubeClicked = false; 
          } 
//--------------------------------------------------------------------------CUBE CLICK DETECTION::TEXTURE CHANGE--------------------------------------------------// 
//--------------------------------------------------------------------------------------CURSOR - NOT WORKING-----------------------------------------------------------------------------------------------------------------// 
          //... 
//--------------------------------------------------------------------------------------CURSOR - NOT WORKING-----------------------------------------------------------------------------------------------------------------*/ 

          if(enableOffset) 
          { 
           x = maps[currentMapID].layers()[l].cubes()[c].sides()[s]->pointPosition(p)[0] + offsetLeft;//it's like doing something like point[p].x + offset left 
           y = maps[currentMapID].layers()[l].cubes()[c].sides()[s]->pointPosition(p)[1] + offsetTop; 
          } 
          else 
          { 
           x = maps[currentMapID].layers()[l].cubes()[c].sides()[s]->pointPosition(p)[0];//it's like doing something like point[p].x + offset left 
           y = maps[currentMapID].layers()[l].cubes()[c].sides()[s]->pointPosition(p)[1]; 
          } 

          points[p].position = sf::Vector2f(x, y); 
          points[p].texCoords = sf::Vector2f(x, y); 

//--------------------------------------------------------------------------------------GRID-----------------------------------------------------------------------------------------------------------------// 
          //GRID DISPLAY //MISS AN EDGE 
          if(s ==3) 
          { 
           isoGrid[p].position = points[p].position; 
           isoGrid[p].color = sf::Color(195, 195, 195, gridOpacity); 
          } 
//--------------------------------------------------------------------------------------GRID-----------------------------------------------------------------------------------------------------------------// 

          textureEntryNumber = (maps[currentMapID].layers()[l].cubes()[c].sides()[s]->getTexture() - 1) * 9 + (maps[currentMapID].layers()[l].cubes()[c].sides()[s]->getLight() - 1);//WRONG 
//--------------------------------------------------------------------------------------GRID-----------------------------------------------------------------------------------------------------------------// 
//--------------------------------------------------------------------------------------LOAD MAP-----------------------------------------------------------------------------------------------------------// 
         } 
//--------------------------------------------------------------------------------------DISPLAY MAP-----------------------------------------------------------------------------------------------------------// 
         if(grid && maps[currentMapID].layers()[l].cubes()[c].sides()[s]->getTexture() <= 1)//IF GRID = TRUE OR TEXTURE LESS OR EQUAL TO 1 => DISPLAY GRID 
         { 
          if(l == maps[currentMapID].currentLayerId()) 
          { 
           window->draw(isoGrid); 
          } 
         } 
         else if(maps[currentMapID].layers()[l].cubes()[c].sides()[s]->getTexture() > 1)//IF THERE IS ANY TEXTURE TO DISPLAY(>1) => DISPLAY TEXTURE 
         { 
          window->draw(points, &textures[textureEntryNumber]); 
         } 
//--------------------------------------------------------------------------------------DISPLAY MAP-----------------------------------------------------------------------------------------------------------// 
        } 
       } 
      } 
     } 
    } 

    window->display(); 
} 

Scroll это один, чтобы увидеть комментарии, и этикетки

Проблемы:

  • Текстура расширяется только при текстуре с деталями, без проблем с одной цветной текстурой (возможно, с вершиной, даже с разных sf::VertexArray.

Примечание: класс, такой как карты/слои/кубы/и т. Д. ... это только данные.

текстуры (numLIght) изображения, которые должны быть отображены в экране выглядят следующим образом: enter image description hereenter image description hereenter image description here

EDIT: Текстуры работают, когда картина только цвет, без подробностей:

enter image description here

Я больше не знаю, что не так с моим кодом.Возможно, я перекодирую дисплей функции() ...

+1

Как установить координаты текстуры? И загрузка одной и той же текстуры снова и снова плоха, но не должна вызывать этого. – Lukas

+0

@ Lukas Я отредактировал свое сообщение о том, как я установил координаты и как я отображаю все это. Загрузка его снова и снова может привести к задержкам? – Madz

+0

@ Lukas Спасибо вам, я решил проблему с задержками, теперь я понимаю, почему загрузка текстур снова и снова была неправильной благодаря :). Но это не решило проблему текстуры, оно может исходить из вершины? возможно, некоторые моменты объединены вместе, поскольку кубы имеют некоторые одинаковые точки из-за изометрического вида? – Madz

ответ

3

Похоже, что координаты текстуры могут быть вне текстуры.

Если функция pointPosition относится к точкам p0, p1, p2 и p3 в side.cpp, то это также похоже на то, что вы используете эти точки в качестве координат текстуры.

Подумайте, как вы можете создать 2D-квадрата

//Create a VertexArray as quads. 
sf::VertexArray vertices; 
vertices.setPrimitiveType(sf::Quads); 
vertices.resize(4); 

//The square position values (same as sf::Vertex::position). 
sf::Vector2f v0 = sf::Vector2f(10, 10); 
sf::Vector2f v1 = sf::Vector2f(200, 10); 
sf::Vector2f v2 = sf::Vector2f(200, 200); 
sf::Vector2f v3 = sf::Vector2f(10, 200); 

//The texture coordinates (same as sf::Vertex::texCoords). 
sf::Vector2f tv0 = sf::Vector2f(0,     0    ); 
sf::Vector2f tv1 = sf::Vector2f(0+tex.getSize().x, 0    ); 
sf::Vector2f tv2 = sf::Vector2f(0+tex.getSize().x, tex.getSize().y); 
sf::Vector2f tv3 = sf::Vector2f(0,     tex.getSize().y); 

//Put them in vertices. 
vertices[0] = sf::Vertex(v0,tv0); 
vertices[1] = sf::Vertex(v1,tv1); 
vertices[2] = sf::Vertex(v2,tv2); 
vertices[3] = sf::Vertex(v3,tv3); 

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

ПЕРЕД

enter image description here

ПОСЛЕ (v2 изменено на 200,300)

enter image description here

Нам не нужно, чтобы изменить координаты текстуры на всех, только позиции вершин.

Я не уверен, что это именно то, что происходит здесь, так как я не вижу, что такое pointPosition, но это мое лучшее предположение.

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

+0

Я переписываю свой движок, так как там было слишком много проблем. Я даже не знал, что нам не нужно менять координаты текстуры, спасибо за ваше время! – Madz

+0

Нет проблем. SFML также имеет хороший учебник на своем сайте для вершинных массивов, которые могут пригодиться: http://www.sfml-dev.org/tutorials/2.3/graphics-vertex-array.php – Ben