.[ ČeskéHry.cz ].
Pořadí vykreslování v SDL

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
rascal



Založen: 05. 06. 2008
Příspěvky: 5

PříspěvekZaslal: 5. červen 2008, 18:12:40    Předmět: Pořadí vykreslování v SDL Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
ladik-BigBoss



Založen: 28. 07. 2007
Příspěvky: 162

PříspěvekZaslal: 5. červen 2008, 18:44:32    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
rascal



Založen: 05. 06. 2008
Příspěvky: 5

PříspěvekZaslal: 5. červen 2008, 22:31:04    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
ladik-BigBoss



Založen: 28. 07. 2007
Příspěvky: 162

PříspěvekZaslal: 6. červen 2008, 19:03:13    Předmět: Odpovědět s citátem

pastni sem m_Surface.Draw()
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
rascal



Založen: 05. 06. 2008
Příspěvky: 5

PříspěvekZaslal: 7. červen 2008, 21:11:42    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
ladik-BigBoss



Založen: 28. 07. 2007
Příspěvky: 162

PříspěvekZaslal: 10. červen 2008, 23:31:58    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
rascal



Založen: 05. 06. 2008
Příspěvky: 5

PříspěvekZaslal: 11. červen 2008, 09:30:23    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dynamite Dan



Založen: 26. 08. 2008
Příspěvky: 8

PříspěvekZaslal: 26. srpen 2008, 09:05:28    Předmět: Odpovědět s citátem

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. Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna