Problem z kolejnością wyświetlania

0

Witajcie, ostatnio postanowiłem zrobić silnik do gry, powiedzmy że z widokiem jak w Don't Starve. Cały widok ma opierać się na tym że jeżeli pozycja y obiektu jest większa od pozycji y gracza to wtedy obiekt przykrywa gracza (rysuję się później).
Jak to postanowiłem zrobić:

        if(obiekt.y + 270 > postac.y + postac.h)
        {
            postac.draw();
            obiekt.draw();
        }
        else
        {
            obiekt.draw();
            postac.draw();
        }

I to działo,
lecz problem nastąpił wtedy kiedy chciałem zrobić dwa obiekty które tak działają, zrobiłem to tak i kompletnie nie działało:

        if(obiekt.y + obiekt.h > postac.y + postac.h)
        {
            postac.draw();
            obiekt.draw();
        }
        else
        {
            obiekt.draw();
            postac.draw();
        }

        if(obiekt2.y + obiekt2.h > postac.y + postac.h)
        {
            postac.draw();
            obiekt2.draw();
        }
        else
        {
            obiekt2.draw();
            postac.draw();
        }

Ma ktoś pomysł jak to zrobić? Z góry dziękuję.

0

Co to znaczy "kompletnie nie działało"? Błędy kompilacji, wyjątek? A jak się kompiluje, to co program drukuje, co w ogóle się dzieje w pierwszym przypadku, który "działa", i co ma być porządanym outputem w drugim?

0

Cały program kompiluje się dobrze. Chodzi o działanie. Jeżeli dodam drugi obiekt, co w sumie jest logiczne, to cały system wyświetlania będzie działać tylko na drugi obiekt. Moje pytanie tutaj jest takie: w jaki sposób mam sprawić, aby to działało na każdej ilości obiektów

Jeżeli dodam drugi obiekt to w grze wygląda to tak:
screenshot-20190731172352.png

a postać (ta duża) powinna być przed drzewem i za tym ludkiem.

0

Nic nie wiem o grach i podana nazwa nic mi nie mówi ...
... ale dlaczego oczekiwanie zachowania trzeciego wymiaru (z) by nie umieścić w projekcie

0

Co by mi taki wymiar Z dał?

1

Jeśli masz dużo obiektów, których kolejność wyświetlania się zmienia zależnie od czegoś, to potrzebujesz po prostu sortowania.
Żeby jednak móc to zrobić, obiekty rożnego typu muszą mieć wspólna klasę bazową, która pozwala na wykonanie rysowania oraz pozwala na ustalenie relacji co jest bardziej z przodu.

0

Mam teraz nowy problem. Tak wygląda sortowanie:

        for( int i = 0; i < otoczenie.size(); i++ )
        {
            for( int j = 0; j < otoczenie.size() - 1; j++ )
            {
                if( otoczenie[j].y> otoczenie[j+1].y)
                    std::swap( otoczenie[j], otoczenie[j+1] );

            }
        }

screenshot-20190803105421.png
lecz jeżeli przekroczy górną granicę to już jest "nad" drzewem
screenshot-20190803105538.png

Chciałbym, aby był "nad" drzewem gdy przekroczy dolną granicę. Próbowałem zamienić tę pętlę:

if( otoczenie[j].y> otoczenie[j+1].y)
          std::swap( otoczenie[j], otoczenie[j+1] );

na to

if( otoczenie[j].y + otoczenie[j].h> otoczenie[j+1].y + otoczenie[j+1].h)
          std::swap( otoczenie[j], otoczenie[j+1] );

Niestety ten sposób sprawia, że postać jest zawsze pod drzewem. Co mam zrobić?

0

Używaj std::sort!
Do porównywania powinieneś używać pozycji stóp/korzeni.

0
std::sort(otoczenie.begin(), otoczenie.end(),
          [](const auto& a, const auto& b) {
               return a.getDept() < b.getDept();
          });
0

Ma ktoś pomysł jak to zrobić? Z góry dziękuję.

Owszem. Renderować grafikę w OpenGL albo Direct3D i polegać na buforze Z (każdy obiekt musi mieć określoną współrzędną z, nie szkodzi że gra jest 2D).
Będziesz miał sprawę kolejności rysowania załatwioną sprzętowo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1