Autor Wątek: Wykrywanie 'spotykania sie' obiektow w serwerze MMO.  (Przeczytany 3835 razy)

Offline Esidar

  • Użytkownik

# Sierpień 25, 2008, 01:48:13
na ktorych kaflach w 100% nie widac juz postaci.

Po pierwsze, nie wyznaczasz na których kaflach widać postać, tylko odwrotnie; co widzi gracz z danego kafla. Współrzędne kafla na którym stoi postać jest prosto wyznaczyć:
int kafel_x = PlayerPositionX / KafelWidth;
int kafel_y = PlayerPositionY / KafelHeight;
Nie przejmujesz się zupełnie tym czy gracz stoi całkowicie na kaflu czy na granicy dwóch kafli.

Mając współrzędne kafla, sprawdzasz listy obiektów które gracz widzi lub z którymi może kolidować. Robisz to tak jak narysowałeś, czyli dla kafli 3x3 wokół postaci sprawdzasz zbiory obiektów i testujesz kolizję/widoczność dla danego gracza.

Nie musisz wyznaczać zbiorów które nie zawierają elementów współnych. Jeżeli jakiś obiekt stoi na granicy dwóch kafli to taki obiekt dodajesz do tego kafla w którym jest środek obiektu i nie przejmujesz się tym, że na kaflu obok jest też fragment tego obiektu.

Jeżeli chcesz uniknąć wyskakiwania obiektów "z nieba", to powiększasz obszar widoczności z 3x3 do 5x5 lub 7x7 jak chcesz.

Co do sposobu przechowywania listy obiektów w kaflach, używaj list linked:
class RuchomyObiekt
{
    RuchomyObiekt* next;
    RuchomyObiekt* prev;
};

class Kafel
{
   RuchomyObiekt* lista_obiektów_w_kaflu;
};

Gdy obiekt sie porusza i zmienia kafel w którym się znajduje, to usuwasz go z poprzedniej listy i dodajesz do nowej.

Zaletą wkomponowania pól "next" i "prev" w obiekt, jest duża wydajność przy usuwaniu/dodawaniu (zmiana 2 zmiennych) oraz unikasz ciągłej realokacji pamięci jaką byś miał przy zastosowaniu std::set lub std::map.
« Ostatnia zmiana: Sierpień 25, 2008, 01:50:25 wysłana przez Esidar »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych