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

SFML i mapa.

VPS Starter Arubacloud
0 głosów
726 wizyt
pytanie zadane 28 kwietnia 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)
Piszę grę platformową w SFML i pytanie moje pada. Jak renderować mapę ?

Chcę mieć ją sporą. Czy mam stworzyć jeden duży obrazek 2000x2000 px, żeby był on "spory" i renderować go przez cały poziom gry, czy obrać jakiś inny patent na mapę (tło) ?

5 odpowiedzi

+1 głos
odpowiedź 28 kwietnia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Ale o co ci w końcu chodzi: o wyświetlanie poziomu, czy jego tła?
komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)
Tła, czyli obrazek w tle.
komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)
Probowałem renderować zwykły png 1920x1680 i klasą view zmniejszać "obraz wyświetlany" ale na postaci, którą poruszałem powstawał efekt pixelizacji :/
komentarz 28 kwietnia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Tło najlepiej generować z powtarzających się w pętli segmentów, których pozycja jest uzależniona od pozycji kamery (sf::View).

Temat nie jest taki prosty, bo tło może się składać z jednego zapętlonego elementu lub paru warstw i w tych różnych przypadkach panują różne zasady - po dołożeniu efektu paralaksy sprawa jeszcze bardziej się komplikuje.

Jakbyś napisał konkretnie, jaki efekt chcesz osiągnąć, to może mógłbym ci bardziej pomóc.

komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)

1. Chcę stworzyć mapę (to jest tylko tło, obrazek .png), bo platformy na których będzie się poruszała postać trzymam w vectorze.

2. I żeby ta "mapa" była spora, żebym przechodził w prawo, jak np. w Mario. 

Bo mając grafike .png 1600x1000 To ja już jak przemieszcze postać w prawo to mi się grafika kończy XD

https://zapodaj.net/fa1717cb762ef.png.html

komentarz 28 kwietnia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Tło powinno być zbudowane z takich elementów, aby przejścia pomiędzy nimi były niezauważalne - nie wiem, czy twoja grafika spełnia to kryterium.

Cała zasada polega na tym, że przy ruchu kamery poruszamy także tło (czyli wszystkie widoczne segmenty) - jeśli zaczyna brakować któregoś z elementów i tworzy się "dziura", to dodajemy kolejny w odpowiednim miejscu.

Możesz to zrobić na bazie kontenera, do którego będziesz dodawał dynamicznie kolejne segmenty.
komentarz 28 kwietnia 2016 przez Łukasz Wasilewski Mądrala (5,190 p.)
Jemu chodzi by tło było statyczne.
komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)
Tak chodziło mi o tło statyczne (grafika .png), wczytywane do sf::Texture i rysowane przez okno.
+1 głos
odpowiedź 28 kwietnia 2016 przez Łukasz Wasilewski Mądrala (5,190 p.)

Siema. 

Jeżeli chcesz osiągnąć efekt taki jak dałeś w komentarzu to mogę dać Ci pomysł.

1. Na początek przygotuj sobie grafikę tła w kilku rozdzielczościach. Wklep sobie taki kod: 

// Display the list of all the video modes available for fullscreen
std::vector<sf::VideoMode> modes = sf::VideoMode::getFullscreenModes();
for (std::size_t i = 0; i < modes.size(); ++i)
{
    sf::VideoMode mode = modes[i];
    std::cout << "Mode #" << i << ": "
              << mode.width << "x" << mode.height << " - "
              << mode.bitsPerPixel << " bpp" << std::endl;
}

A w konsoli wypisze Ci możliwe rozdzielczości SFMLa, przygotuj te kilka grafik, nie muszą być wszystkie, ale te najpopularniejsze.

2. W zależności od ilości grafik które przygotowałeś zrób sobie tablicę textur (sf::Textures backgrouds[ilosc]);

3. Przyda się także wskaźnik na teksturę: (sf::Textures *currentBg) 

4. Sprawdź w jakiej rozdzielczości ktoś włącza grę i nadaj wskaźnikowi odpowiednią teksturę (currentBg = &backgrounds[k])

5. Ustaw teskturze pozycje 0, 0

6. Przed każdym rysowaniem tekstury ustaw jej pozycję na: 

vector2f(view.getCenter().x - (szerokoscOkna / 2), view.getCenter().y - (wysokoscOkna / 2));

//oczywiscie view to nazwa Twojego obiektu klasy sf::View, a szerokość okna możesz zamienić na szerokość i wysokość tekstury jeśli nie pominąłeś punktów 1 i 2

Problem pojawi się przy zoomie, ale na początek powinien Ci wystarczyć, jeśli będziesz używał zooma, to wtedy Twoja wiedza pozwoli Ci na wymyślenie efektywniejszego sposobu. 

Możesz pominąć punkty 1 - 3 jeśli gra będzie odpalana w jednej rozdzielczości.

Pozdrawiam! :)

komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)
Tak, gra będzie odpalana w 1 rozdzielczości ale fajnie, że odpowiedziałeś, dzięki, przyda się nie tylko mi ;)
komentarz 28 kwietnia 2016 przez Łukasz Wasilewski Mądrala (5,190 p.)
Spoko, jedna rozdzielczość jeszcze bardziej ułatwia sprawę. pomijasz punkty 1-4, u mnie się sprawdza. Jak będziesz miał pytania to uderzaj nawet na priv. ^^
+1 głos
odpowiedź 30 kwietnia 2016 przez JojololomenPL Bywalec (2,580 p.)

Nauczyłem się tego stąd.

0 głosów
odpowiedź 28 kwietnia 2016 przez pewolt Mądrala (5,790 p.)
Możesz wczytać do pamięci całą mape i potem wyświetlaćjej fragmenty albo mozesz też renderować cały obraz na różnych koordynatach.

Polecam tą pierwsza metode.
komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)
Jak duża może być owa mapa ? I mając na myśli wyświetlać jej fragmenty to masz na myśli użycie klasy view ?
komentarz 28 kwietnia 2016 przez pewolt Mądrala (5,790 p.)
Nie znam SFML wiec zabardzo nie wiem jak to wygląda z poziomu kodu.

Co do rozmiau mapy to moze ona byc obojetna. A o wyświetlanie mapy to chodzi mi o to ze można wyciąć z całego obrazu kwadrat i go wyrenderować. Rozumiesz?
komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)
Rozumiem, ale też słabo to wychodzi bo po takiej operacji postać którą poruszam ma efekt pixelizacji i nie wygląda jak trzeba XD
1
komentarz 28 kwietnia 2016 przez pewolt Mądrala (5,790 p.)

To troche jak tworzenie animacji, moge Ci podać link o tym tylko ze do SDL.

link

komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)
Dzięki, coś pomoże :D
0 głosów
odpowiedź 28 kwietnia 2016 przez criss Mędrzec (172,590 p.)
Jeden wielki obrazek to raczej nie najlepszy pomysł, nie dosyć, że musisz wczytywać to coś, to i tak się może okazać za małe. Raczej polecam ci zrobić sobie tzw. tileset. Zbiór kwadracików najlepiej w jednym pliku graficznym, a na każdym inny kafelek który będzie się powtarzał na twojej mapie. Jakieś cegły, trawa, ziemia itd..
komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)
Mapa załóżmy 1000x1000 i kwadraciki 10x10 wypełnione określoną grafiką ?
komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)
Pewnie źle to zrozumiałem :/
komentarz 28 kwietnia 2016 przez criss Mędrzec (172,590 p.)
Nie wiem czy dobrze zrozumiałeś.. Mapa jest nieograniczona bo kwadracik możesz sobie ustawić gdzie ci się podoba przecież.

Jeśli poszczególne kafelki będą narysowane tak, że będąc obok siebie jakoś spójnie się łączą, to można w prosty sposób tworzyć ładnie wyglądające losowe lub nie mapki.
komentarz 28 kwietnia 2016 przez Munvik Dyskutant (9,350 p.)
Tak zrozumiałem, dzięki ;)

Podobne pytania

0 głosów
2 odpowiedzi 447 wizyt
pytanie zadane 25 września 2016 w C i C++ przez Gracjan Pasik Obywatel (1,810 p.)
0 głosów
2 odpowiedzi 729 wizyt
pytanie zadane 17 kwietnia 2017 w C i C++ przez fatalFOx Początkujący (300 p.)
0 głosów
0 odpowiedzi 219 wizyt
pytanie zadane 30 lipca 2018 w C i C++ przez HitMan Użytkownik (850 p.)

92,843 zapytań

141,782 odpowiedzi

320,858 komentarzy

62,174 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...