Autor Wątek: Lot rakiety a blitowanie tla  (Przeczytany 1599 razy)

Offline norbi123

  • Użytkownik

# Kwiecień 14, 2011, 21:19:22
Może mi ktoś powiedzieć w jaki sposób najlepiej zaprogramować lot rakiety przez caly ekran. Dodam ze robie platformowke cos na styl mario. Chodzi mi o to ze uzywam zawsze cos w stylu

SDL_Rect offset;
offset.x=0;
do{
offset.y=JakasWysokosc;
SDL_BlitSurface(rakieta,NULL,background,&offset); // ladowanie rakiety na danych wspolrzednych
SDL_BlitSurface(screen,NULL,background,NULL); // ladowanie tla
SDL_Flip (background);
offset.x++; // przesuniecie rakiety o piksel
}while(offset.x<SCREEN_WIDTH);

i wszystko ladnie udaje ze niby rakieta leci od lewej do prawej ale nie wydaje mi sie to byc najlepszym rozwiazaniem. W jaki sposób moge uniezaleznic lot rakiety od ladowania tla poniewaz jezeli usunał bym linijke "ladowanie tla" widac "smuge" po ladowaniu na kolejnych pikselach rakiety. Nie przeszkadzało by mi to tak bardzo gdyby nie to ze problem sie robi gdy chce zaladowac kilka elementow w jednym momencie (postac, wrog, rakieta) i dla kazdego musze blitowac na nowo background zeby zlikwidowac smuge.

Drugie moje pytanie dotyczy tego w jaki sposob moge np przesowac sie moja postacia a w tym samym momencie zeby w moja strone leciala rakieta. Problem ktorego nie rozumiem polega na tym ze np gdy nacisne "s" postac wykonuje skok(blituje ja parabola po kolejnych pikselach) co zajmuje chwile i w tym momencie moja rakieta nie zmienia polozenia a chcialbym zeby w czasie skoku przelatywala pod postacia. Z góry dzieki za pomoc.

Offline Mr. Spam

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

Offline Anonim

  • Użytkownik
    • Anonim's Page!

# Kwiecień 14, 2011, 21:24:30
Double Buffering?

Offline Xirdus

  • Redaktor

# Kwiecień 14, 2011, 21:38:12
Pomijając już to, że taka pętla jest kompletnie nieprzydatna jeśli chcesz coś więcej niż animację, oraz że słowo "offset" znaczy coś innego niż to do czego tej struktury używasz, to chyba źle masz kolejność rysowania.

Najpierw blituj background na screen, potem obiekty (również na screen, nie na background) w kolejności od najbardziej zakrytego do najbardziej wierzchniego.

Offline norbi123

  • Użytkownik

# Kwiecień 14, 2011, 22:50:25
Xirdus:
No dobra ale to w jakis sposob mam wykonac skok? bo z tego co napisales zrozumialem ze mam wrzuci wszystko na screen i potem blitowac screen na background i dac flipa tylko w jaki sposob rozwiazuje to przelot rakiet pod postacia w czasie skoku?

Anonim:
z tym Double Bufferingiem rozumiem ze chodzi ci o dodanie SDL_DOUBLEBUF przy ustawianiu SDL_SetVideoMode tylko jak to wykorzystac w moim przykladzie (moze jakis przyklad latwego uzycia)? bo nie potrafie znalezc nic madrego w googlu

Offline Anonim

  • Użytkownik
    • Anonim's Page!

# Kwiecień 14, 2011, 22:59:04
Hm, nie wiem czy w SDL'u to dokładnie tak funkcjonuje, ale tworzysz sobie bitmapkę 'bufor', czyścisz na początku pętli, wrzucasz na niego wszystkie obiekty w poprawnej kolejności, po czym blitujesz na ekran.
Chociaż szczerze mówiąc nie wiem dokładnie o co Ci chodzi :)
Pzdr
-A

Offline Minus

  • Użytkownik

# Kwiecień 14, 2011, 23:01:18
Wyobraź sobie iż blitując jakąkolwiek bitmapę na powierzchnię 'screen', jest ona koordynowana od lewego-górnego rogu do prawego-dolnego względem powierzchni 'screen'. Zatem aby wykonać tzw. scrolling, musisz uwzględnić także pozycję kamery, mniej więcej coś takiego:
Kod: (cpp) [Zaznacz]
SDL_Rect dest = { x - view_x, y - view_y, 0, 0 }// Gdzie view_x/view_y odpowiada za pozycję kamery

Offline Xirdus

  • Redaktor

# Kwiecień 14, 2011, 23:05:18
@Anonim
Okno w SDLu ma już zaimplementowany double buffering - wszystkie blity idą do bufora, a funkcja Flip() wyświetla całość na ekran.

Offline Anonim

  • Użytkownik
    • Anonim's Page!

# Kwiecień 14, 2011, 23:18:57
Dobrze wiedzieć, dzięki :)

Offline norbi123

  • Użytkownik

# Kwiecień 14, 2011, 23:24:28
dzieki za odpowiedzi teraz mam pytanko czy tylko na pewno dobrze to rozumiem. czyli jezeli mam "w tej mojej grze" klase bohatera ktory skok wykonuje poprzez wywolanie dwoch metod
void Gravity(int xbg, int width)
{
SDL_Rect back;
SDL_Rect back2;
back.x=-xbg;
back.y=0;
back2.x=xbg+width;
back2.y=0;
if(position.y<(SCREEN_HEIGHT-80))
{
do
{
position.y+=5;
position.x+=2;
SDL_BlitSurface(screen,&back,background,NULL);
SDL_BlitSurface(screen,NULL,background,&back2);
SDL_BlitSurface(player,&player1[frame],background,&position);
SDL_Flip(background);
}while(position.y!=(SCREEN_HEIGHT-80));
}

}
void Skok(int xbg, int width)
{
SDL_Rect back;
SDL_Rect back2;
back.x=-xbg;
back.y=0;
back2.x=xbg+width;
back2.y=0;
for(int i=80;i<200;i+=5)
{
position.x+=2;
if(position.x + 100 > SCREEN_WIDTH)
{
position.x-=20;
position.y=SCREEN_HEIGHT-80;
SDL_BlitSurface(screen,&back,background,NULL);
SDL_BlitSurface(screen2,NULL,background,&back2);
SDL_BlitSurface(player,&player1[frame],background,&position);
SDL_Flip(background);
}
position.y=SCREEN_HEIGHT-i;
SDL_BlitSurface(screen,&back,background,NULL);
SDL_BlitSurface(screen2,NULL,background,&back2);
SDL_BlitSurface(player,&player1[frame],background,&position);
SDL_Flip(background);
}

}

oraz klase rakieta ktora ma leciec od prawej do lewej (dodam do niej pozniej kolizje z bohaterem), ktora na szybko napisana zeby spawdzic jak to dziala wyglada tak
void Draw()
{
xR=SCREEN_WIDTH;
yR=SCREEN_HEIGHT-40;
do{
rock.x=xR;
rock.y=yR;
SDL_BlitSurface(rocket,NULL,background,&rock);
SDL_Flip(background);
xR--;
}while(xR>=0);
}


to mam rozumiec ze mam sobie zrobic petle w ktorej przesune o 1piksel bohatera metoda skok() zblituje go na screen nastepnie wywolam metode Draw() klasy rakieta i takze przesune o 1 piksel rakiete, zblituje ja na screen i na koniec blituje screen na background i daje Flip... i tak w kolko? Oczywiscie powyzsze metody sie do tego nie nadaja ale chodzi mi o sposob w jaki to wykonac

Offline Anonim

  • Użytkownik
    • Anonim's Page!

# Kwiecień 14, 2011, 23:26:33
Wyświetlaj w jednej funkcji, poza tym przy animacji (grawitacji?) nie powinieneś mieć osobnego rysowania...

Offline Xirdus

  • Redaktor

# Kwiecień 14, 2011, 23:36:34
Przesuwanie bohatera i wyświetlanie zrób w całkowicie osobnych, niezależnych od siebie fragmentach kodu. Najlepiej zastosuj pętlę czasu rzeczywistego (tutaj masz artykuł ją opisujący).

Offline Next

  • Użytkownik

# Kwiecień 14, 2011, 23:58:47
Norbi polecam tą stronkę  http://www.lazyfoo.net/SDL_tutorials/index.php sporo możesz się nauczyć.
I tak jak @Xirdus wspomniał użyj pętli czasu rzeczywistego.

Offline norbi123

  • Użytkownik

# Kwiecień 15, 2011, 00:05:51
Next: dzieki znam juz i właśnie ją przerabiam, a o tej petli czasu rzeczywistego zaraz poczytam

Mam jeszcze pytanie dotyczace trybu pelnoekranowego. Czy jest mozliwe skalowanie okna gry? chodzi mi o rozciaganie okna albo przelaczenie z trybu okienkowego na tryb pelno ekranowy. chodzi mi o jakas automatyzacje bo jakiegos case z wyborem rozdzielczosci i powieleniem calosci ze zmianami oczywiscie da sie napisac ale masa przy tym pracy.
« Ostatnia zmiana: Kwiecień 15, 2011, 00:10:20 wysłana przez norbi123 »

Offline Next

  • Użytkownik

# Kwiecień 15, 2011, 07:51:01
W tym może ci pomóc biblioteka SDL_gfx link->http://www.ferzkopp.net/joomla/content/view/19/14/