Autor Wątek: Obiektowosc - co bedzie obiektem itp...  (Przeczytany 10286 razy)

zerlo

  • Gość
# Maj 01, 2007, 16:10:50
Moriturius:
Z tego co zrozumialem to mam dac metode rysujaca do SGfx. Wszystkie oHero maja byc rysowane ( wiem, ze nazwa nie oddaje, ze ma byc ich kilka ), a wiec to one sa tym "Renderable". Role display menagera spelnia chyba vector_obj, bo tam sa przechowywane obiekty, ktore sa potem rysowane. Czyzby SMain to zle miejsce na to? Ale nie jestem pewien czy o to chodzi...

Nameczanin:
Teraz wszystko jest rysowane tak samo, ale w przyszlosci to sie zmieni, a wiec musze utworzyc metode draw dla oHero. Dzieki za ta uwage.
Czyli SGfx powinno miec osobny wektor z rysowanymi obiektami. Rozumiem idee. Planowalem ten kod dla gier typu pong, tetris, arkanoid itp., wiec nie pomyslalem, ze w razie bardziej zaawansowanych projektow moze byc potrzeba rysowania wybranych obiektow ( szkoda tracic czas na draw tego, czego nie widac ).

Dzieki waszym postom zrozumialem, ze SMain to chyba zle miejsce na zarzadzanie obiektami jak jednostki. Zastanawiam sie, czy nie byloby lepiej stworzyc  SObjManager, ktory by tworzyl, usuwal, podejmowal decyzje, co ma zostac narysowane.

SMain = SGame

Nowy podzial obowiazkow:
SGame: tworzenie, zarzadzanie i usuwanie podsystemami; glowna petla gry
SGfx: tworzenie, zarzadzanie i usuwanie grafik; petla rysujaca obiekty
SObjManager: tworzenie, zarzadanie i usuwanie obiektow; podejmowanie decyzji, ktore maja byc rysowane i przekazanie wektora z nimi (rysowanymi) do SGfx; sprawdzanie kolizji
cDraw: klasa abstrakcyjna reprezentujaca obiekty, ktore moga byc rysowane; wektor wskaznikow na nia jest w SGfx
cUnit: klasa abstrakcyjna jednostki ( to czym mozna sterowac ); cDaw to bazowa dla niej; wektor wskaznikow na nia jest w SObjManager
cName: konkretna jednostka; cUnit to bazowa; wektor wskaznikow na nia jest w SGfx

Wyszlo mi dziedziczenie cDraw <- cUnit <- cName. Dodatkowo wektor wskaznikow na klase cUnit bedzie musial byc, przed przekazaniem z SObjManager do SGfx, rzutowany na pointery na typ cDraw.

Czy to rozwiazanie bedzie sie sprawdzac?

Offline Mr. Spam

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

Offline Moriturius

  • Użytkownik

# Maj 01, 2007, 16:25:17
@zerlo: wasnie chodizlo mi o to, zeby vector_obj zastąpić DisplayManagerem z prawdziwego zdarzenia ;) vector przechowuje tylko dane, a display manager ma nimi jeszcze dodatkowo zarządzać i wywoływać metodę draw SGfx'a dla każdego przechowywanego obiektu `Renderable`.

Wtedy w głównej pętli rysowania walnie się coś takiego na przyklad:
displayManager->drawObjects();

zerlo

  • Gość
# Maj 01, 2007, 16:29:40
A nie lepiej nie rozdzielac display manager i SGfx? Obj manager bedzie wybieral wlasciwie obiekty i przekazywal je do SGfx ( rzutuje wskaznik na klase bazowa, aby pasowala do wektora w SGfx ). 

Glowna petla gry:
//obsluga klawiatury, ruch itp. dla kazdego obiektu
SObjManager->move();
//wybieranie obiektow, ktore trzeba rysowac i przekazanie ich do SGfx ( po uprzednim rzutowaniu z cUnit* na cDraw* );
SObjManager->setWektor();
SGfx->drawObjects();

SGfx::drawObjects():
for ( int i = 0; i < objekty_do_rysowania.size(); ++i )
{
 rysuj( wektor_spritow[ objekty_do_rysowania[ i ]->sprHandle ],  objekty_do_rysowania->get_x(),  objekty_do_rysowania->get_y() )
}

SObjHandle::setWektor():
vector< cUnit* > obiekty_do_rysowania
for ( int i = 0; i < obj.size(); ++i )
{
 if ( obj[i].warunki_wyswietlania ) obiekty_do_rysowania.push_back( obj[ i ] );
}
//rzutowanie cUnit* na cDraw*
pGfx->set_vector( obiekty_do_rysowania )
« Ostatnia zmiana: Maj 01, 2007, 16:42:43 wysłana przez zerlo »

Offline Moriturius

  • Użytkownik

# Maj 01, 2007, 16:55:30
Chodziło mi raczej o napisanie czegoś w stylu Irrlichtowym, że tak to ujmę:

Co ważniejsze fragmenty 1. tutoriala[1] żeby zobrazować o co mi chodzi:
IrrlichtDevice *device =
createDevice(EDT_SOFTWARE, dimension2d<s32>(512, 384), 16,
false, false, false, 0);

ISceneManager* smgr = device->getSceneManager();

/*...*/

IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2");
IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );

/*...*/

smgr->drawAll();

Tuaj rolę naszego DisplayManagera spełnia ISceneManager.

EDIT: lista wskaźników na obiekty ma być wewnątrz klasy DisplayManager
__________________
[1] http://irrlicht.sourceforge.net/tut001.html

zerlo

  • Gość
# Maj 01, 2007, 17:11:18
Czyli lista obiektow ma byc przechowywana w SGfx, a nie w SObjManager? W takim razie po co mi to SObjManager? Mam zlaczyc SGfx i SObjManager? To podejrzane. :/ Chyba wiekszy porzadek jest jak sa osobno, a do SGfx zostaje przekazany gotowy wektor obiektow utworzony przez SObjManager.

Offline nameczanin

  • Użytkownik
    • devlog

# Maj 01, 2007, 17:14:24
jezeli kazdy obiekt ma sie sam rysowac, to do czego tak bardzo konkretnie jest SGfx? No chyba ze juz tylk odo efektow itd. ale np. taki skybox to tez swego rodzaju obiekt itd. Ja bym polaczyl to z objmanagerem, ale to tez zaleznie od projektu [jakie to obiekty sa, co maja i co moga].

zerlo

  • Gość
# Maj 01, 2007, 17:17:05
SGfx: tworzenie, zarzadzanie i usuwanie grafik; petla wywolujaca metody rysujace obiektow zapisanych w wektorze ( obiekty ), ktory jest tworzony przez SObjManager ( bo on ma dostep do obiektow i moze sprawdzic, ktore trzeba rysowac itp ). Po to jest SGfx to jakby manager sprite'ow.

SObjManager - zarzadza obiektami, sprawdza kolizje, wybiera te, ktore trzeba rysowac
SGfx - zarzadza grafika, odbiera wektor obiektow, ktore trzeba narysowc od SObjManager

EDIT: Tak, juz jestem bardzo blisko. Mam u mnie SGfx to juz przechowywanie spritow  i display manager ( kontrolowany przez SObjManager ).
« Ostatnia zmiana: Maj 01, 2007, 17:21:45 wysłana przez zerlo »

Offline nameczanin

  • Użytkownik
    • devlog

# Maj 01, 2007, 17:19:40
wroc, pomylilem sie. Polaczylbym z display managarem. Ale widze, ze juz prawie wiesz czego chcesz :) Powodzenia w dalszym kodowaniu.

Offline Moriturius

  • Użytkownik

# Maj 01, 2007, 17:25:06
SGfx: tworzenie, zarzadzanie i usuwanie grafik; petla wywolujaca metody rysujace obiektow zapisanych w wektorze ( obiekty ), ktory jest tworzony przez SObjManager ( bo on ma dostep do obiektow i moze sprawdzic, ktore trzeba rysowac itp ). Po to jest SGfx to jakby manager sprite'ow.

SObjManager - zarzadza obiektami, sprawdza kolizje, wybiera te, ktore trzeba rysowac
SGfx - zarzadza grafika, odbiera wektor obiektow, ktore trzeba narysowc od SObjManager

EDIT: Tak, juz jestem bardzo blisko. Mam u mnie SGfx to juz przechowywanie spritow  i display manager ( kontrolowany przez SObjManager ).

przy takiej organizacj to po prostu zrobiłbym jakiś Mediator do którego SObjManager podawałby listę obiektów do wyświetlenia, a on z kolei podawałby tą listę do SGfx.

Takie jest przynajmniej wg. mnie najprostsze i najszybsze wyjście z tej sytuacji :)

zerlo

  • Gość
# Maj 01, 2007, 17:28:07
Mediator? Czy mediatorem moze byc metoda? Bo nie rozumiem. Ja myslalem tak:
SObjManager ma wskaznik na SGfx, a SGfx ma metode ustawiajaca wektor. ObjManager wywoluje ja i podaje w arumencie wektor z odpowiednimi obiektami. Tak bedzie dobrze?

Offline Moriturius

  • Użytkownik

# Maj 01, 2007, 17:32:06
robiąc sobie autoreklamę dam linka do mojego skromnego arta o wzorcach projektowania:
http://doscorp.neostrada.pl/docs/wzorce_projektowania.pdf - poczyaj o wzorcu Mediator.

i moze google pomoze: http://www.google.pl/search?hl=pl&q=design+pattern+mediator&btnG=Szukaj&lr=

zerlo

  • Gość
# Maj 01, 2007, 17:37:50
Mysle, ze juz wiecej problemow nie bedzie. Dzieki wielkie wszystkim! TYSM!
Pozdrawiam
  zerlo

*logout*

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Maj 02, 2007, 12:49:34
zerlo: Najlepiej żeby każdy oHero sam siebie potrafił odrysować. Żeby to zrobić potrzebuje oczywiście używać funkcji rysujących, a te posiada klasa SGfx. SGfx to jest jednak chyba tzw. singleton, czyli klasa której istnieje zawsze jeden i tylko jeden obiekt. Nic nie stoi więc na przeszkodzie, żeby każdy miał do tego obiektu dostęp, na przykład przez globalną zmienną wskaźnikową - jakiś:

SGfx *g_Gfx;

Offline Moriturius

  • Użytkownik

# Maj 03, 2007, 22:31:38
mi sie jakoś globalne zmienne wskaźnikowe nie widzą.
nie wiem, ale wizja takowego mnie przeraża :D

chociaż... każdy działający sposób jest dobry [ ale niektóre są lepsze ;) ]

[OT]
to tak jak mawiał mój nauczyciel od gitarki odnośnie grania solówek: "Wiesz, są 3 rodzaje dźwięków. Te zupełnie nie w tonacji, te dobre i te lepsze" :)
[/OT]

Offline pawelad

  • Użytkownik
    • strona domowa

# Czerwiec 20, 2007, 02:50:42
Device, input , manager tego i tamtego to singleton. hermetyzacja tworzenia  obiektow, wszystko np w jednej klasie. Wszystko na abstrakcjach, obiekty budowane  przez skladanie, jedna wspolna klasa obiektow np IEntity. Dokladasz do tego wedle uznania mniej lub wiecej wzorcow np obserwatow, iterator, factory itp. Cala mapa to albo struktura sekwencyjna( dupa  dla np 1mln obiektow ) lub drzewiasta( lepiej, octree, bsp co chcesz ). Kluczowy dla wydajnosci jest algorytm wyznaczania widzialnytch( boundboxy), reszta to bzdety. Masz widzialne, gora kilkaset, piszesz render, ja w tym miejscu na razie wysiadam. Wyswietlanie nawet najprostrzych obiektow w liczbe kilku tys u mnie  wysiada, ale czytalem ze dla  dx9 tak jest. Wymiatacze niech dorzuca bardziej sensownych porad, doswiadczen, co jest wazne a co mniej.