[Delphi / SDL] Pobieranie bitmapy z zasobów aplikacji lub z komponentu TImage do SDL_Surface (koniecznie obejrzyj gameplay:) )
Ostatnio zmodyfikowano 2012-10-31 22:54
cycku Temat założony przez niniejszego użytkownika |
[Delphi / SDL] Pobieranie bitmapy z zasobów aplikacji lub z komponentu TImage do SDL_Surface (koniecznie obejrzyj gameplay:) ) » 2012-10-28 14:21:09 Napisałem całkiem fajną grę w Turbo Delphi (gameplay - http://videobam.com/FKaFz). Wyświetlanie grafiki 2D z wykorzystaniem TForm.Canvas działało zbyt wolno więc postanowiłem skorzystać z SDL (Simple DirectMedia Layer). Ale do rzeczy: Mój problem polega na tym iż nie mogę znaleźć sposobu jak załadować bitmapę z zasobów aplikacji/bitmapy umieszczonej w TImage.Picture.Bitmap. //Oto jak wygląda procedura wczytania pliku do SDL_Surface (bardzo proste i działa): bitmap: PSDL_Surface; //warstwa w SDL ... bitmap:=(SDL_LoadBMP('BITMAPA.BMP')); //tak wygląda procedura załadowania
//Kiedy natomiast chcę wczytać bitmapę z TImage.Picture.Bitmap powstają błędy typu access violation, wiem że procedura jest błędna. Oto jak wygląda owa procedura: (przykład w jaki sposób umieściłem to w kodzie)
var a:TBitmap; rw : PSDL_RWops; bitmap : PSDL_Surface begin a:=TBitmap.Create; a:=image1.Picture.Bitmap;
rw:=SDL_RWFromConstMem(a,sizeof(a));//załadowanie bitmapy z pamięci (z TBitmap a) bitmap:=SDL_LoadBMP_RW(rw, 1);//wklejanie załadowanej bitmapy na SDL_Surface SDL_FreeRW(rw);
...
Informacje które mogą pomóc na których się opierałem (kod w języku C): http://www.libsdl.org/cgi/docwiki.cgi/SDL_RWFromConstMem?action=Loadhttp://www.kekkai.org/roger/sdl/rwops/rwops.htmlDla tego kto rozwiąże mój problem czeka skromna nagroda ;) |
|
DejaVu |
» 2012-10-28 14:26:54 Sugerowałbym zadać to pytanie na 4programmers.net - oni pierwotnie zaczynali od języka Delphi i z pewnością jest tam znacznie więcej osób, które wspomniany język znają. |
|
cyklopek11 |
» 2012-10-28 21:57:58 W Delphi na razie raczkuję na czworakach, a raczej pełzam ale czy nie zwalniasz czasami dwukrotnie zasobów: bitmap:= SDL_LoadBMP_RW( rw, 1 ); SDL_FreeRW( rw );
Wycinek kodu ze strony którą podałeś: char bitmap[] = { 66, 77, 86, 2, 0, 0, 0, 0... } SDL_RWops * rw; SDL_Surface * img;
rw = SDL_RWFromConstMem( bitmap, sizeof( bitmap ) ); img = SDL_LoadBMP_RW( rw, 1 );
|
|
cycku Temat założony przez niniejszego użytkownika |
» 2012-10-31 22:54:52 Dosyć banalne rozwiązanie problemu (mogłem użyć wcześniej swojego umysłu i trochę posiedzieć nad tematem... ): var a:Tbitmap; rw : PSDL_RWops; sstream : TMemoryStream; bitmap:PSDL_Surface; begin sStream:=TMemoryStream.Create; a:=image1.Picture.Bitmap; a.SaveToStream(sStream); sStream.Position := 0; rw:=SDL_RWFromMem(sstream.Memory,sstream.Size); bitmap:=SDL_LoadBMP_RW(rw, 1);
Cały problem polegał na tym by zawartość bitmapy (a/Image1.Picture.Bitmap) przenieść do strumienia (sStream), dalej - strumień załadować do PSDL_RWops(rw) które to jest nakładane na PSDL_Surface(bitmap). Zagadnienie można wykorzystać w momencie kiedy używając SDL nie chcemy korzystać z zewnętrznych plików graficznych. Dziękuję wszystkim którzy chcieli pomóc. |
|
« 1 » |