Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[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
Autor Wiadomość
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=Load
http://www.kekkai.org/roger/sdl/rwops/rwops.html


Dla tego kto rozwiąże mój problem czeka skromna nagroda ;)
P-67811
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ą.
P-67812
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:

C/C++
bitmap:= SDL_LoadBMP_RW( rw, 1 ); // --> Automatically frees the RWops struct for us
SDL_FreeRW( rw ); // --> Use this function to *free an SDL_RWops structure allocated by SDL_AllocRW(). *
Wycinek kodu ze strony którą podałeś:

C/C++
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 ); // Automatically frees the RWops struct for us

// Do something with img...
P-67859
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.
P-68097
« 1 »
  Strona 1 z 1