Autor Wątek: SDL_FillRect - nie działa?  (Przeczytany 868 razy)

Offline magik6000

  • Użytkownik

# Kwiecień 04, 2011, 17:08:18
Witam. siedzę już ponad 4 miesiące nad większym projektem, i chyba tydzień nad tym błędem/bugiem/czymkolwiek.

kod:

void fer(SDL_Rect rct,int col){


int cr=0,cg=0,cb=0;

cr=pdc(col,65536);

col -= cr*65536;

cg=pdc(col,256);

col -= cg*256;

cb=col;

col -= cb;





cout <<"mkb rgb "<<cr<<" "<<cg<<" "<<cb<<" "<<cl<<" cr "<<rct.x<<" "<<rct.y<<" "<<rct.w<<" "<<rct.h<<endl;

tmp = SDL_CreateRGBSurface(rct.w,rct.h,32, rct.w*4, 0x00ff0000,0x0000ff00, 0x000000ff, 0xff000000);

cl = SDL_MapRGB(tmp->format, cr,cg,cb);

if(!tmp){
cout<<"scrs fail\n";
return;
}

SDL_Rect tr=srg(0,0,rct.w,rct.h);

if(SDL_FillRect(tmp, &tr, cl)==-1){
cout << "sdlfr fail\n";
return;
}

kw = SDL_DisplayFormat(tmp);

if(!kw){

cout << "kw DF fail\n";
return;

}

SDL_FreeSurface(tmp);

uo(kw,rct.x,rct.y,rct.w,rct.h);

SDL_FreeSurface(kw);



}


uo() - blituje na ekran;
srg(x,y,w,h) - tworzy SDL_Rect
pdc(x,y) - dzielenie bez reszty, i przecinka
wszystko kompiluje się bez warringów, nie ma wycieków pamięci,fps dobry, niby wszystko ok.
do funkcji dostarczony jest kolor r 200, b 200, g 200, i jest dobrze rozkodowany
na środku ekranu (dobra pozycja) wyświetla się czarny kwadrat i wszystko byłoby ok, gdyby nie to,
że ten kwadrat jest czarny(a nie lekko-biały)

Offline Mr. Spam

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

Offline Lerhes

  • Użytkownik

# Kwiecień 04, 2011, 17:35:26
kw to obiekt globalny SDL_Surface?

A przed tym przypisaniem:
kw = SDL_DisplayFormat(tmp);
Jest gdzieś zwalniany poprzedni obraz który zawiera? (podobnie wydaje mi się, że jest z tmp). Jak nie to jednak "pamięć Ci wycieka".

Co do problemu, faktycznie kolor się nie przepisuje. Nie wiem czemu tak się dzieje, ale pewnie właśnie z tego powodu, że ich formaty pikseli są niezgodne. Ale w czym problem? Robisz tak:
SDL_FreeSurface(tmp);

SDL_FillRect(kw, NULL, cl);  //Tu jest dodatek

uo(kw,rct.x,rct.y,rct.w,rct.h);

SDL_FreeSurface(kw);

I już masz to co chciałeś. To poprzednie wypełnienie możesz wyrzucić. W funkcji Fill możesz zmienić tego NULL na ten twój prostokąt Rect.

Btw: Ja nad tym się męczyłem dwa miesiące.... przestańcie pisać takie głupoty (nieprawdziwe).. jakby napisanie, że ktoś się z tym długo męczy coś zmieniało.
Lerhes

Offline magik6000

  • Użytkownik

# Kwiecień 04, 2011, 20:45:34
thx. w końcu działa :D