Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
rascal
Založen: 05. 06. 2008 Příspěvky: 5
|
Zaslal: 5. červen 2008, 18:12:40 Předmět: Pořadí vykreslování v SDL |
|
|
Zdravím, chtěl jsem se zeptat, mají snad surfacy v SDL nějakou vlastnost, která určuje pořadí při blittingu a tudíž co bude nakonec vidět navrchu? Protože já si myslel, že to záleží jen na pořadí volání blitting funkcí a na vrchu je prostě to, co se vykreslí jako poslední. Ale tady to prostě nefunguje:
kód: |
if(temp.layer1 != 0) m_Surfaces[temp.layer1].Draw(m * TILE_SIZE - (int)m_fFineX, n * TILE_SIZE - (int)m_fFineY, m_Screen);
if(temp.layer2 != 0) m_Surfaces[temp.layer2].Draw(m * TILE_SIZE - (int)m_fFineX, n * TILE_SIZE - (int)m_fFineY, m_Screen);
m_Surfaces[1].Draw(9 * TILE_SIZE, 6 * TILE_SIZE, m_Screen);
if(temp.layer3 != 0) m_Surfaces[temp.layer3].Draw(m * TILE_SIZE - (int)m_fFineX, n * TILE_SIZE - (int)m_fFineY, m_Screen);
|
Snažím se napsat si jednoduchý engine zobrazující scrollující mapu složenou z jednotlivých dlaždiček. Mapa je pole, každá buňka má 3 vrstvy. První dvě vrstvy se mají zobrazit pod hráčem (to jsou ty první dvě vykreslení), pak je vykreslena postava hráče a až na ní třetí vrstva (poslední vykreslení). Samotný blitting probíhá v mnou napsané třídě Surface. Problém je, že postava hráče se pořád objevuje navrchu. Už nevím, čím by to mohlo být, nejspíš nějaká blbost. Netušíte někdo, kde je zakopaný pes? V případě potřeby můžu poslat celý zdroják. |
|
Návrat nahoru |
|
|
ladik-BigBoss
Založen: 28. 07. 2007 Příspěvky: 162
|
Zaslal: 5. červen 2008, 18:44:32 Předmět: |
|
|
mas tam asi nejakou chybu, protoze to co blitujes jako posledni bude skutecne nahore. je to maliruv algoritmus. nemas tu zadnou pamet hloubky.
zkus si ke kazdemu blitu dat printf/cout s indentifikaci a pak se mrkni v jakem poradi to kreslis.
btw nevim proc hned pises na forum?
tohle sis prece mohl overit kdyz by sis dal 2 blity a podle toho by ses zaridil. ale ty hned musis psat vykresleni levelu ve 3 vrstvach a pak se divit... |
|
Návrat nahoru |
|
|
rascal
Založen: 05. 06. 2008 Příspěvky: 5
|
Zaslal: 5. červen 2008, 22:31:04 Předmět: |
|
|
Do fóra to píšu, protože že se mi nedaří přijít na příčinu problému a strávil jsem nad tím hodně času, to mi věř. Dokonce i když dám vykreslení postavy na první místo a mapa by ji tedy logicky měla zakrýt, nestane se to a postava pořád zůstává nahoře. Vůbec to nechápu, tak jsem prostě chtěl zkusit, jestli někoho zkušenějšího nenapadne čím by to mohlo být. |
|
Návrat nahoru |
|
|
ladik-BigBoss
Založen: 28. 07. 2007 Příspěvky: 162
|
Zaslal: 6. červen 2008, 19:03:13 Předmět: |
|
|
pastni sem m_Surface.Draw() |
|
Návrat nahoru |
|
|
rascal
Založen: 05. 06. 2008 Příspěvky: 5
|
Zaslal: 7. červen 2008, 21:11:42 Předmět: |
|
|
kód: |
void Surface::Draw(int x, int y, SDL_Surface * dest)
{
if(m_Surface != NULL)
{
SDL_Rect rect;
rect.x = x;
rect.y = y;
SDL_BlitSurface(m_Surface, NULL, dest, &rect);
}
}
|
m_Surfaces z předchozího úseku je pole, které uchovává objekty typu Surface. Tohle je funkce Draw třídy Surface, která má členskou proměnnou m_Surface a to je normální SDL_Surface. |
|
Návrat nahoru |
|
|
ladik-BigBoss
Založen: 28. 07. 2007 Příspěvky: 162
|
Zaslal: 10. červen 2008, 23:31:58 Předmět: |
|
|
nemel bys nastavovat i cleny 'w' a 'h' u SDL_Rect?
promennou rect mas neicializovanou, takze w a h muzou mit nepredvidatelnou hodnotu.
btw tvoje trida Surface je nejaka divna.
proc x,y urcujes pri draw?
nemel by to snad mit Surface jako cleny?
jinak mi prijde zbytecne SDL_Surface obalovat vlastnim Surface.
mozna jenom obalit blit funkci, ktera tam prida rect, ale cela trida je jak delo na vrabce. kdyz to chces objektove tak spis delej tridy jako GameObject... nebo tak neco kde spojis pozici, herni smysl a grafiku v jedno |
|
Návrat nahoru |
|
|
rascal
Založen: 05. 06. 2008 Příspěvky: 5
|
Zaslal: 11. červen 2008, 09:30:23 Předmět: |
|
|
Jenom jsem chtěl, aby Surface dokázalo vykreslit samo sebe, proto jsem ho dal do samostatné třídy. Proměnné pozice v ní původně byly, ale pak mi přišlo že je lepší je předávat až do funkce vykreslování, protože nemám samostatnou instanci Surface pro každé políčko, ale jen tolik, kolik existuje různých objektů které mohou být na mapě. Jinak stejně jsem chtěl Surface předělat na Sprite, aby rovnou automaticky řídila animace, tohle je jen takový zárodek... Ale nejspíš to zahodím a začnu od znova, už jsem se poučil a vím co udělat jinak. Jenom mi pořád nejde na rozum to vykreslování... |
|
Návrat nahoru |
|
|
Dynamite Dan
Založen: 26. 08. 2008 Příspěvky: 8
|
Zaslal: 26. srpen 2008, 09:05:28 Předmět: |
|
|
No to bylo tedy dílo prokousat se vstupním testem do tohoto fóra. Např. pokud jsem ve fóru nováček, zaregistrovat se a počkat, až si mě někdo všimne je odpověď špatná. Správná odpověď je: založit thread o věcech, na kterých právě pracuji. Pokud vám to nedochází, neprostudovali jste si dostatečně FAQ. Na které ovšem nefunguje odkaz.
Na rascalův dotaz jsem už odpovídal na www.builder.cz, ale žádná reakce. Kopíruju odpověď sem.
==================================
Datum: 25. 06. 2008 17:49
Blituje se pomocí SDL_BlitSurface(). Když blitneš surface A do C a pak B do C, tak v C podle mě B vždy překryje A.
Chyb se tam může udělat plno, z hlavy mě napadá:
1. v jednom z těch Tvých surfaců nedopatřením nic nemáš
2. zdrojový surface má nastavenou 100% průhlednost
3. v souboru s obrázkem, ze kterého pochází zdrojový surface, je nějaká (asi 100%) průhlednost
4. spletl sis surfacy a např. blituješ z cíle do zdroje
5. ve svém programu máš logickou chybu a např. na některý z těch blitů nikdy nedojde
6. řekl bych, že se mohou objevit i problémy s konverzí barev, když zdrojový surface není přesně toho samého typu, co cílový
7. omylem blituješ jiný výřez (např. jenom pravý dolní roh místo celé obrazovky)
8. něco mi říká, že struktury SDL_Rect musíš poctivě znova naplnit před každým blitem
9. po všech blitech se snad musí updatovat fyzická obrazovka
Kdyžtak pošli zdroják. |
|
Návrat nahoru |
|
|
|