Otóż mam taki problem. Robię grę z użyciem biblioteki SFML. Poniższa funkcja ma za zadanie sprawdzać położenie pola na mapie względem innych pól tego typu, w celu zastosowania odpowiedniej tekstury.
int tilePosType(TileMap mapa, sf::Vector2f pos)
{
int type;
// 0 1-2-3
//
// 4 5-6-7
// | | | |
// 8 9-a-b
// | | | |
// c d-e-f
if((!sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 0;
else if((!sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 1;
else if((sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 2;
else if((sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 3;
else if((!sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 4;
else if((!sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 5;
else if((sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 6;
else if((sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 7;
else if((!sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 8;
else if((!sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 9;
else if((sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 10;
else if((sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 11;
else if((!sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 12;
else if((!sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 13;
else if((sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 14;
else if((sameTile(mapa, pos, sf::Vector2f(pos.x-1, pos.y)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x+1, pos.y)))&&
(sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y-1)))&&(!sameTile(mapa, pos, sf::Vector2f(pos.x, pos.y+1)))) type = 15;
else type = 0;
return type;
}
bool sameTile(TileMap mapa, sf::Vector2f pos1, sf::Vector2f pos2)
{
std::cout<<"raz ";
bool same = true;
if((pos1.x<0)||(pos1.x>=mapa.getSize().x)||(pos1.y<0)||(pos1.y>=mapa.getSize().y)||
(pos2.x<0)||(pos2.x>=mapa.getSize().x)||(pos2.y<0)||(pos2.y>=mapa.getSize().y)) gszyp = false;
else if(mapa.getTile(pos1).typeNr!=mapa.getTile(pos2).typeNr) gszyp = false;
std::cout<<"dwa"<<std::endl;
return same;
}
Widoczne w funkcji sameTile()
couty dodałem, żeby znaleźć miejsce crasha, no i właśnie.
Wyjście wygląda tak:
raz dwa
raz dwa
Po tym następuje crash.
Widać więc, że ta funkcja jest wywoływana dwa razy i wykonuje się w całości, a za to trzeci raz nawet nie zostaje wywołana. Odkryłem też, że sytuacja wygląda tak samo niezależnie od tego, co wstawię w trzeci warunek w pierwszym ifie. Próbowałem nawet dawać tam funkcję która nie robi nic poza wyświetleniem tekstu na ekranie i zwróceniem prawdy, tekst nie wyświetlił się.
Za to kiedy wywaliłem wywołanie sameTile()
funkcji z jednego z dwóch pierwszych warunków (obojętnie którego) to crash nastąpił dopiero po trzecim wykonaniu sameTile()
.
Problem nie leży też w tym, że zapisałem te ify w dwóch linijkach, kiedy wszystko jest w jednej, jest tak samo. (A robię tak bo kod jest dla mnie czytelniejszy kiedy nie muszę go przewijać na boki)