Autor Wątek: Pozostałości po spiricie i SDL_Delay()  (Przeczytany 1235 razy)

Offline ace4ur

  • Użytkownik

# Kwiecień 30, 2011, 18:37:48
Witam uczę się SDL z tutka Lazy Foo jestem aktualnie w 4 tutku(2 dzień nauki) chciałem sprawdzić czy opanowałem już te zagadnienia w tych tutorialach i zrobiłem coś takiego.

Mam 3 obrazy .png które wrzucam na ekran i wyświetlam w pętli tak by wyszła animacja ;p
Oraz daną animacją można poruszać.

I tu jest problem:
1. Kiedy poruszamy się w prawo (RIGHT,RIGHT-UP,RIGHT-DOWN) na ekranie pozostaje noga wcześniejszego obrazka. Zamazuje ją najechaniem animacją na nią :P
2.SDL_Delay blokuje zdarzenia(eventy) jak klikniecie X myszka w pętli z sprawdzaniem eventu.
Czy znacie jakiś sposób by zdarzenia rozpatrywane były osobno?
Tak by wyświetlanie na ekranie,wstrzymywanie (SDL_Delay) nie miało wpływu na zdarzenia.
Może jakaś osobna pętla lub coś?

Kod:
#include <SDL.h>
#include <SDL_image.h>
#include <string>
using namespace std;
SDL_Surface *Screen = NULL;
Uint8 *keystate = SDL_GetKeyState( NULL );
// **************************************
// **************************************
SDL_Surface *load_image(string filename)
{
SDL_Surface *loaded_image = IMG_Load( filename.c_str() );
SDL_Surface *optomized_image = NULL;

if(loaded_image != 0)
{
optomized_image = SDL_DisplayFormat(loaded_image);
SDL_FreeSurface(loaded_image);
}
return optomized_image;
}
// **************************************
// **************************************
bool Init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
return false;
}
Screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);

if(Screen == 0)
{
return false;
}

SDL_WM_SetCaption("Aplikacja SDL",0);

return true;
}
// **************************************
void apply_image(int x,int y,SDL_Surface *source,SDL_Surface *Destination)
{
SDL_Rect pozycja;
pozycja.x = x;
pozycja.y = y;
SDL_BlitSurface(source,0,Destination,&pozycja);
}
// **************************************
int main(int argc,char *args[] )
{

SDL_Surface *image = NULL;
Init();

bool quit = false;
SDL_Event event;
int x = 50;
int y = 50;
while(quit == false)
{
while(SDL_PollEvent(&event) )
{
if(event.type == SDL_QUIT)
{
quit = true;
}
}
if(keystate[SDLK_RIGHT] )
x+=20;
if(keystate[SDLK_LEFT] )
x-=20;
if(keystate[SDLK_UP] )
y-=20;
if(keystate[SDLK_DOWN] )
y+=20;



image = load_image("ludek0.png");
apply_image(x,y,image,Screen);
SDL_Flip(Screen);
SDL_Delay(100);

image = load_image("ludek1.png");
apply_image(x,y,image,Screen);
SDL_Flip(Screen);
SDL_Delay(100);

image = load_image("ludek2.png");
apply_image(x,y,image,Screen);
SDL_Flip(Screen);
SDL_Delay(100);
}
SDL_FreeSurface(image);
SDL_Quit();
return 0;



}
Pliki do odpalenia: (ludki)
http://www.sendspace.pl/file/57f499c3120612b5ec7386b - 7z

Czy te "resztki" animacji mogą by spowodowane tym że naklejam animacje i przesuwam ją w PRAWO i tło(czarne) ludzików nie zasłania tych wcześniejszych?
Kombinowałem już umieścić naklejanie na ekran i ładowanie pliku w inne miejsce pętli ale nie skutkowało.

« Ostatnia zmiana: Kwiecień 30, 2011, 18:42:07 wysłana przez ace4ur »

Offline Mr. Spam

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

Offline Tolyar

  • Użytkownik

# Kwiecień 30, 2011, 18:54:08
Ad 1. Masz pozostałości po poprzednim obrazku, bo nie czyścisz ekranu. Zobacz sobie działanie funkcji SDL_FillRect() którą możesz "zamalować" cały ekran jednym kolorem albo SDL_UpdateRect().

A tak w ogóle to bezwzględnie wyrzuć wczytywanie obrazków z pętli głównej, bo można to zrobić raz, zanim ją zaczniesz.

Ad 2. Tak znamy - wątki, ale tutaj nie musisz akurat używać SDL_Delay(). Wystarczy np. nie przesuwać obrazków jeśli nie mineło np. x milisekud.

Offline Lerhes

  • Użytkownik

# Kwiecień 30, 2011, 18:57:51
Olaboga, nie rób w taki sposób animacji... czytaj dalej ten tutorial... w lekcji 20 masz wszystko opisane.
W pętli głównej delay? bez sensu..
Lerhes

Offline ace4ur

  • Użytkownik

# Kwiecień 30, 2011, 18:59:14
Ok posprawdzam te funkcje.

Nie wczytywać obrazków w funkcji głównej? To jak to można zrobić efektywnie?
Wczytać do tablicy te 3 obrazki? Czy stworzyć 3 surface i raz załadować i z nich zbierać? Możliwości jest sporo ale niestety nie ogarniam jeszcze tego.

Co do 2. SDL_Delay chodziło mi tutaj o przerwę między zmianą obrazków bo są 3 obrazki i bez przerwy za szybko machają rękoma.
Tolyar chyba zrozumiałeś, że co SDL_Delay(x) zmieniam położenie obrazka a tak nie jest.

__
@Lerhes:
Wiem, że dalej w tym tutku są animacje,wątki i inne ciekawostki jednak jak już napisałem próbuje zrobić taką animacje używając tego co znam w danej chwili tak dla treningu.

Offline Tolyar

  • Użytkownik

# Kwiecień 30, 2011, 19:06:48
Na początek tablica może być, ale znowu - jeśli animacji będziesz miał dużo, to wczytywanie i przechowywanie tego będzie udręką.

SDL_Delay() wstrzymujesz pętlę główną i siłą rzeczy wstrzymujesz animacji.

A tak w ogóle to zmasakrowałeś to...
Zrób coś w ten deseń:

-wczytanie obrazków,
-pętla główna:
  -sprawdź, czy należy przesunąć obrazek,
  -wyświetl odpowiednia klatke
  -sprawdz, czy nalezy zmienic numer klatki, bo upłynęło wystarczająco dużo czasu (funkcja SDL_GetTicks())
  -dopiero na końcu SDL_Flip()
wywal SDL_Delay()


Offline Lerhes

  • Użytkownik

# Kwiecień 30, 2011, 19:24:35
Cytuj
Wiem, że dalej w tym tutku są animacje,wątki i inne ciekawostki jednak jak już napisałem próbuje zrobić taką animacje używając tego co znam w danej chwili tak dla treningu.
Nie zrozumiałeś, więc napiszę Ci prosto z mostu:
Wiesz za mało do tej chwili i robisz to bez sensu i głupio (chodzi o animację). Masz za mało wiedzy i nie zrobisz ich teraz tak jak powinny być. Tym bardziej mnie to dziwi, jak nieco dalej masz poprawie to przedstawione.
Może wykorzystuj w praktyce / dla testów tę wiedzę z tutoriala którą już zdobyłeś?
Mógłbym Ci tu napisać co i jak, ale nadal nie rozumiem po co (jak bardzo chcesz, to mogę to zrobić). Czytaj dalej i ucz się dalej. GL!
Lerhes

Offline ace4ur

  • Użytkownik

# Kwiecień 30, 2011, 19:45:00
Jak to po co?
By sobie utrwalić to... Przeczytam raz,drugi przepisze z tutka.
Do tego wole sobie jeszcze pokombinować samemu coś zrobić dla siebie. Nawet jeśli to ma być bezsensowny programik.

Wiem, że jeszcze mało wiem w końcu dopiero zaczynam :D
Mam nadzieje że niedługo będę wstanie napisać mała gierkę !
Nie chce żeby przypadkiem jakaś kłótnia się rozpoczęła.

Dzięki za życzenie powodzenia ;p

Offline Lerhes

  • Użytkownik

# Kwiecień 30, 2011, 21:11:25
Bardzo dobrze robisz! Utrwalenie sobie wiedzy którą zdobyłeś w tutorialu na własnych przykładach to naprawdę dobra praktyka. Ale moje "po co" odnosiło się do animacji: po co "utrwalasz" wiedzę której nie zdobyłeś?
Cztery pierwsze lekcje to inicjalizowanie SDL, wczytywanie obrazków i ich rysowanie oraz przetwarzanie komunikatów. Tego się nauczyłeś i to utrwalaj. Zresztą, szczerze mówiąc, nie za bardzo jest co utrwalać. Więc ciśnij tutorial dalej.
(Ewentualnie, jeżeli po prostu chcesz zrobić coś na własną rękę -> i samemu zaimplementować sobie animacje, bo to też dobry trening -> wymyślanie samemu rzeczy (nawet takich, które już ktoś dawno opracował) to do boju -> ale nie pytaj o to na forum, bo to bez sensu. Albo sam, albo korzystasz z czegoś gotowego. Tak przynajmniej mi się wydaje. Więc ja Ci mówię wprost: ten Delay to zły pomysł. O dobrym albo przeczytaj w tutorialu, albo pogłówkuj jeszcze).
:)
Lerhes