• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Otwarta mapa - SFML - teoria

0 głosów
637 wizyt
pytanie zadane 25 września 2016 w C i C++ przez Gracjan Pasik Obywatel (1,810 p.)
Cześć, mam pytanie natury czysto teoretycznej.

Chcę zrobić dosyć dużą grę 2D. Wykorzystam do tego SFML, ponieważ znam go najlepiej i z tego co wiem jest obecnie najlepszy jeżeli chodzi o gry 2D w C++.

Chciałbym, aby gra była bardzo wydajna, jednak zanim zacznę kodować pierwsze linie muszę wszystko dobrze zaplanować. Tutaj mam problem z mapą, ponieważ chcę aby była otwarta, więc co za tym idzie bardzo duża. Nie wiem teraz czy powinienem standardowo wyrenderować całą na raz (co wydaje mi się kiepskim pomysłem, bo zajęłoby to bardzo dużo czasu i zasobów), czy jest jakiś sposób aby renderować tylko fragment, ten który jest najbliżej (a może twórcy SFML to przewidzieli i dzieje się tak automatycznie?).

Mam nadzieję, że ktoś z was zna odpowiedź :)

2 odpowiedzi

+1 głos
odpowiedź 25 września 2016 przez Dash Nałogowiec (29,650 p.)

Robiłem kiedyś coś takiego, mapa była ogromna i rozwiązałem to tak: 

Najpierw dzielisz mapę na chunki. Jeden chunk powinien być wielkości obszaru który wyświetla twoje view. Jeżeli masz mapę 6000x4000, a wyświetlasz na raz obszar o rozmiarze 600x400, mapa może składać się ze 100 chunków. 

Na raz wyświetlasz tylko 9 chunków(X), ten na którym stoi gracz(0) i po jednym w każdą stronę (lewo, prawo, góra, dół, skosy). Klasa chunk ma funkcję draw, który rysuje ten konkretny skrawek mapy. (ASCII nr1). 

Gdy gracz przejdzie na sąsiedni chunk (ASCII 2), usuwasz trzy najdalsze chunki (U) i doczytujesz kolejny kawałek drogi dla postaci tworząc trzy nowe chunki (D). W taki sposób możesz streamować mapę z pliku, i nigdy nie będziesz rysować więcej niż 9 chunków terenu. 

XXX  UXXD  
X0X  UX0D
XXX  UXXD  

 

 

0 głosów
odpowiedź 25 września 2016 przez katolik6 Dyskutant (8,140 p.)
Nie wiem, czy to przewidzieli, ale dałoby się sprawdzić. A co do własnoręcznej implementacji: Jak ta mapa ma być zrobiona? Coś jak rimworld, czy darkwood, czy jeszcze inaczej?
komentarz 25 września 2016 przez katolik6 Dyskutant (8,140 p.)
Sprawdzić, czy obiekt jest na ekranie jest łatwo, tylko musisz tą mapę podzielić na mniejsze elementy. A potem if((element.getPosition().x+element.getGlobalBounds().width>0)&&(/*itd*/)) window.draw(element);
komentarz 25 września 2016 przez katolik6 Dyskutant (8,140 p.)
Najwydajniej będzie robić ją z elementów tej samej wielkości, bo będziesz mógł podmienić element.getGlobalBounds().width na stałą wartość ewentualnie *k jeśli chcesz ją skalować.

Podobne pytania

0 głosów
5 odpowiedzi 1,397 wizyt
pytanie zadane 28 kwietnia 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)
0 głosów
0 odpowiedzi 311 wizyt
pytanie zadane 30 lipca 2018 w C i C++ przez HitMan Użytkownik (850 p.)
0 głosów
2 odpowiedzi 1,134 wizyt
pytanie zadane 17 kwietnia 2017 w C i C++ przez fatalFOx Początkujący (300 p.)

93,754 zapytań

142,715 odpowiedzi

323,360 komentarzy

63,348 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...