Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Projektowanie]Renderowanie obiektów w płaskim świecie
daniel1302
post
Post #1





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 04:51