В моем 2D изометрическом движке у меня есть следующие классы:
`maps(variable)/layers(variable)/cubes(variable)/sides(6)/points(4)/coordinates(3)`
sides
содержит 4 points
(1 point
= 1 coordinate
(х, у,Folers:
assets/numTexture/numLight.png
Я вычисляю с помощью numTexture и numLight число, которое является textureNumberEntry (я загрузил все numLight.png (текстуры) в массив).
Но текстурирование уходит неправильно
Я определяю мои координаты кубов в классе слоя:
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. ....
И функция display () для отображения карты:
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();
}
Прокрутите этот, чтобы увидеть комментарии и ярлыки
Проблемы:
sf::VertexArray
,Примечание: класс как карты / слои / кубы / и т. Д. … это только данные.
Изображения текстур (numLIght), которые должны отображаться на экране, выглядят так:
РЕДАКТИРОВАТЬ: Текстуры работают, когда изображение только цвет, без деталей:
Я больше не знаю, что не так с моим кодом. Может быть, я перекодирую функцию display () …
Похоже, что координаты текстуры могут быть вне текстуры.
Если функция 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);
Квадратные точки не обязательно должны совпадать с координатами текстуры, поскольку координаты текстуры будут растягиваться до каждой квадратной точки. Если вам нужно изменить точку в одной из квадратных точек, это может выглядеть так.
ДО
ПОСЛЕ (версия 2 изменена на 200 300)
Нам не нужно менять координаты текстуры вообще, только положения вершин.
Я не уверен, что это именно то, что здесь происходит, так как я не вижу, что такое pointPosition, но это мое лучшее предположение.
Кроме того, попытка рисовать вне текстуры может привести к тому, что пиксели границы изображения будут растянуты (возможно, то, что происходит в вашем примере), и иногда вы даже можете отображать данные из другой информации в видеопамяти в результате перехода за пределами памяти вашей текстуры.
Других решений пока нет …