Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Projektowanie]Renderowanie obiektów w płaskim świecie
Forum PHP.pl > Inne > Hydepark
daniel1302
Witam, dostałem zlecenie zaprojektowania gry 2d(w Canvas/JS) gry która może być rozbudowana, więc pomyślałem, że napisze silnik który będę mógł wykorzystać w innych projektach, jako, że Canvas ostatnio staje się coraz popularniejszy.

Zrobiłem już trochę ale mam problem:
Gra jest uruchomiona w pętli(pętla uruchamia się z częstotliwością 8-64 Hz, zależnie od tego jak ustawimy.
Aktualnie przy odświeżeniu przerysowuję wszystko. I tutaj pojawia się moje pytanie.

Funkcja odpowiadająca za przerysowanie wygląda mniej więcej tak:

  1. windowContext.drawImage(
  2. for (oId in objects)
  3. {
  4. obj = objects[oId];
  5. textures[obj.get('texture')],
  6. obj.get('sx'),
  7. obj.get('sy'),
  8. obj.get('swidth'),
  9. obj.get('sheight'),
  10. obj.get('dx'),
  11. obj.get('dy'),
  12. obj.get('dwidth'),
  13. obj.get('dheight')
  14. );//Rysuj obiekt
  15. }

i wykonuje sie ona 2^n razy na sekundę z przedziału od 8-64.


Aktualnie przerysowywane są wszystkie obiekty narazie jest ich około 200(prosty świat i bohater który może się poruszać[tylko poruszać]), ale co jeśli będzie ich 5000 przy dużym świecie, wtedy zajdzie potrzeba filtrowania który obiekt jest na ekranie.
I tutaj pytanie jak to zrobić? Myślałem nad czymś takim:
PSEUDO KOD:
  1. JEŚLI (OBIEKT.X należy do <POŁOZENIE_EKRANU.X-200; POŁOZENIE_EKRANU.X+200> LUB OBIEKT.Y należy do <POŁOZENIE_EKRANU.Y-100; POŁOZENIE_EKRANU.Y+100> )
  2. RYSUJ OBIEKT



I co z kolizjami. Nie chodzi mi o to jak sprawdzać kolizje bo zaimplementowałem 2 podstawowe algorytmy(Przybliżenie kołem i przybliżenie prostokątem). Jednak mam wachanie kiedy sprawdzać kolizje.
Do sprawdzania kolizji mam funkcję:
collision_id = DefineCollisionTest(Obiekt1, Obiekt2, Options)
i umożliwiłem zdefiniowanie kolizji pomiędzy obiektem1 a obiektem2, dodatkowo mogę zdefiniować do jakiej grupy ma należeć dany obiekt. I tym samym w pętli sprawdzam przy renderowaniu czy wystąpiła kolizja i wykonuje jakiś kod. który definiuje sobie(w sumie to nie myślałem gdzie) ale np w collision_id.callback;
1) Przy przerysowaniu dla aktualnie renderowanych obiektów wtedy sprawdzam raz w pętli.
2) Przy Updacie obiektu(sprawdzam raz dla obiektu ale daje mi to pewność, że gdy np kolizja wystąpi z obiektem 12021 a ja sprawdzam w tym czasie już kilka obiektów dalej. to zwróci kolizje natychmiast. Ale to jest kilka, kilkanaście pętli dodatkowych sprawdzających to samo co podczas rysowania(tylko nie rysujących), a znowu nawet 15fps nie powinno pozwolić na spostrzeżenie błędów.
sazian
Witam,
poczytaj artykuły na tej stronie http://www.unit1.pl/224,idx
powinny cię zainteresować artykuły z serii "Wędrowanie w świecie 2D", "Giganty świata 2D" oraz być może "Góry i doliny świata 2D".
Tak wiem że to zupełnie inny język i inna technologia ale chodzi samą "ideje" i teorie która dla js będzie bardzo podobna
daniel1302
Dziękuje za linka przeglądnąłem z grubsza te artykuły i bardzo ciekawe, Jeśli ktoś znajdzie temat to dorzucam swoje:

http://lazyfoo.net/SDL_tutorials/index.php
http://informatyka.wroc.pl/


Te strony są naprawdę godne polecenia, całą wiedzę o tworzeniu gier zdobyłem z nich.


Jeśli ktoś miałby inne godne polecenia strony to proszę o podanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.