[#1] [C] Tablice wskaznikow
Oka, wiec sprawa jest taka. Sa 3 czesci kodu. Pierwsza to definicja tablicy wskaznikow. Przygotowuje 10 wskaznikow na przestrzen SDL do ktorej zaraz wczytam klatki animacji. Druga to wczytanie poszczegolnych klatek. Trzecia to funkcja ktora pokazuje po kolei obrazki. Problem jest taki ze wczytuje sie tylko pierwszy obrazek. Jak zrobic zeby do poszczegolnych komorek powczytywaly sie tez inne klatki?


[b]1)[/b]
SDL_Surface *post_pierwsza_stoi[10];

[b]2)[/b]
void load_PostMaster()
{
    post_pierwsza_stoi[0] = IMG_Load("gfx/post/master/1.jpeg");
    post_pierwsza_stoi[1] = IMG_Load("gfx/post/master/2.jpeg");
    post_pierwsza_stoi[2] = IMG_Load("gfx/post/master/3.jpeg");
    post_pierwsza_stoi[3] = IMG_Load("gfx/post/master/4.jpeg");
    post_pierwsza_stoi[4] = IMG_Load("gfx/post/master/5.jpeg");
    post_pierwsza_stoi[5] = IMG_Load("gfx/post/master/6.jpeg");
    post_pierwsza_stoi[6] = IMG_Load("gfx/post/master/7.jpeg");
    post_pierwsza_stoi[7] = IMG_Load("gfx/post/master/8.jpeg");
    post_pierwsza_stoi[8] = IMG_Load("gfx/post/master/9.jpeg");
    post_pierwsza_stoi[9] = IMG_Load("gfx/post/master/10.jpeg");
}

[b]3)[/b]
void anim_Animuj(Uint32 x, Uint32 y, Uint32 klatka)
{
    SDL_Rect dest; 
    dest.x = x;
    dest.y = y;
    dest.w =  post_pierwsza_stoi[klatka].w;
    dest.h =  post_pierwsza_stoi[klatka].h;
    SDL_SetAlpha( &post_pierwsza_stoi[klatka], SDL_SRCALPHA, 255);
    SDL_SetColorKey( &post_pierwsza_stoi[klatka], SDL_SRCCOLORKEY, SDL_MapRGB(post_pierwsza_stoi[klatka].format,255,0,255));
    SDL_BlitSurface( &post_pierwsza_stoi[klatka], NULL, screen, &dest); 
}


[#2] Re: [C] Tablice wskaznikow

@Lorak, post #1

Na pewno obrazki od 2 do 10 się nie wczytują? Sprawdzałeś czy są NULL?

[#3] Re: [C] Tablice wskaznikow

@Lorak, post #1

dest.w = post_pierwsza_stoi[klatka].w;
dest.h = post_pierwsza_stoi[klatka].h;

SDL_SetAlpha( &post_pierwsza_stoi[klatka], SDL_SRCALPHA, 255);
SDL_SetColorKey( &post_pierwsza_stoi[klatka], SDL_SRCCOLORKEY, SDL_MapRGB(post_pierwsza_stoi[klatka].format,255,0,255));
SDL_BlitSurface( &post_pierwsza_stoi[klatka], NULL, screen, &dest);

a to nie powinno być z
post_pierwsza_stoi[klatka]->w

i

SDL_SetAlpha(post_pierwsza_stoi[klatka], SDL_SRCALPHA, 255);

?



Ostatnia modyfikacja: 10.05.08 23:56
[#4] Re: [C] Tablice wskaznikow

@Lorak, post #1

Czy IMG_Load alokuje pamięć dla struktury SDL_Surface poprzez np. malloc() lub AllocMem() ?

post_pierwsza_stoi[klatka].w; - czy to się kompiluje? przecież post_pierwsza_stoi[klatka] jest wskaźnikiem.

&post_pierwsza_stoi[klatka] - czy na pewno ten argument funkcji jest prawidłowy?



Ostatnia modyfikacja: 11.05.08 07:28
[#5] Re: [C] Tablice wskaznikow

@MDW, post #2

Cholera wie. Tak mi sie wydaje bo jak wlasnie jakis obrazek sie nie wczytywal to byly takie objawy tzn wychodzilo od razu z programu. A nie moge sprawdzic czy sa NULL bo kompilator wywala blad:

" H:ProgramowanieSDLgfx.c In function `gfx_WyswietlObrazekTest': "
"162 H:ProgramowanieSDLgfx.c invalid operands to binary == "

Tzn wywala blad jak wpisze linijke:
if(post_pierwsza_stoi[klatka]==NULL) MessageBox(0,"Klatka to null","INFO",MB_OK | MB_ICONQUESTION)



Ostatnia modyfikacja: 13.05.08 22:37
[#6] Re: [C] Tablice wskaznikow

@rzookol, post #3

Jak wpisze tak jak mowisz czyli:

void gfx_WyswietlObrazekTest()
{
    int klatka = 0;
    
    SDL_Rect dest; 
    dest.x = 10; // współrzędna x na ekranie
    dest.y = 10; // współrzędna y na ekranie
    dest.w =  post_pierwsza_stoi[klatka]->w; // szerokość wklejanego obiektu
    dest.h =  post_pierwsza_stoi[klatka]->h; // wysokość wklejanego obiektu
    SDL_SetAlpha( post_pierwsza_stoi[klatka], SDL_SRCALPHA, 255); 
    SDL_SetColorKey( post_pierwsza_stoi[klatka], SDL_SRCCOLORKEY, SDL_MapRGB(post_pierwsza_stoi[klatka]->format,255,0,255));
    SDL_BlitSurface( post_pierwsza_stoi[klatka], NULL, screen, &dest); 
}


To kompilator sypie bledami:
gfx.c: In function `gfx_WyswietlObrazekTest':
gfx.c:167: error: invalid type argument of `->'
gfx.c:168: error: invalid type argument of `->'
gfx.c:169: error: incompatible type for argument 1 of `SDL_SetAlpha'
gfx.c:170: error: invalid type argument of `->'
gfx.c:170: error: incompatible type for argument 1 of `SDL_SetColorKey'
gfx.c:171: error: incompatible type for argument 1 of `SDL_UpperBlit'


Tez tak myslalem i w innej funkcji tam gdzie nie ma indeksu tablicy dziala normalnie


void gfx_WyswietlObrazek(Uint32 x, Uint32 y)
{
SDL_Rect dest;
dest.x = x; // współrzędna x na ekranie
dest.y = y; // współrzędna y na ekranie
dest.w = tlo_obrazek->w;
dest.h = tlo_obrazek->h;
SDL_SetAlpha( tlo_obrazek, SDL_SRCALPHA, 255);
SDL_SetColorKey( tlo_obrazek, SDL_SRCCOLORKEY, SDL_MapRGB(tlo_obrazek->format,255,0,255));
SDL_BlitSurface( tlo_obrazek, NULL, screen, &dest);
}

Nie wiem co jest grane wiec uprawiam tzw. partyzantke

[#7] Re: [C] Tablice wskaznikow

@Minniat, post #4

Czy IMG_Load alokuje pamięć dla struktury SDL_Surface poprzez np. malloc() lub AllocMem() ?
Nie wiem

post_pierwsza_stoi[klatka].w; - czy to się kompiluje? przecież post_pierwsza_stoi[klatka] jest wskaźnikiem.
Kompiluje sie

&post_pierwsza_stoi[klatka] - czy na pewno ten argument funkcji jest prawidłowy?
Nie wiem. Jak dodalem znak & to sie zaczelo kompilowac

[#8] Re: [C] Tablice wskaznikow

@Lorak, post #7

Problem jest taki ze wczytuje sie tylko pierwszy obrazek

Z podanych przez Ciebie odpowiedzi wnioskuję, że post_pierwsza_stoi nie jest tablicą wskaźników, a tablicą struktur! I prawdopodobnie przez to wczytuje się tylko pierwszy element struktury. Prosze jeszcze podaj zawartość struktury SDL_Surface z jakiegoś pliku .h. Poza tym czy IMG_Load zwraca strukturę czy wskaźnik do struktury?

Pozdrawiam



Ostatnia modyfikacja: 14.05.08 07:09
[#9] Re: [C] Tablice wskaznikow

@Minniat, post #8

IMG_Load zwraca wskaźnik, nikt sie nie bawi w przekazywanie struktur całościowo bo to strata na prędkosci

[#10] Re: [C] Tablice wskaznikow

@rzookol, post #9

Co do IMG_Load to oczywiście spodziewałem się tego. Chodzi o to, że z tego co napisał p. Lorak podaję w wątpliwość czy ta tablica wskaźników ne jest przypadkiem tablicą struktur. Dowód: post_pierwsza_stoi[klatka].w się kompiluje bez błędów oraz: &post_pierwsza_stoi[klatka] jeśli post_pierwsza_stoi jest strukturą to zwraca wskaźnik do struktury, jęśli jest jednak wskaźnikiem to zwraca adres do adresu w jakiejś strukturze (przykład &screen->ViewPort zwraca adres elementu, który jest zintegrowany ze strukturą Screen), a tu interesuje nas tylko wskaźnik do danych graficznych. Mam nadzieję, że coś pomogłem.

[#11] Re: [C] Tablice wskaznikow

@Minniat, post #8

Moze wyjasnie. Zeby stworzyc przestrzen dla jakiegos obrazka robi sie tak:

SDL_Surface *jakisobrazek;

czyli tworze wskaznik do struktury SDL_surface i pozniej wczytuje plik tak:

jakisobrazek = IMG_Load("gfx/back/scena1.png");

Wiec idac za ciosem zrobilem tablice takich wskaznikow w taki sposob:

SDL_Surface *post_pierwsza_stoi[10];

To jest w koncu tablica wskaznikow czy nie?

[#12] Re: [C] Tablice wskaznikow

@Lorak, post #11

To jest tablica wskaźników. Przynajmniej do tej pory zawsze była. :)

Ja bym się i tak upierał przy tym żeby sprawdzić czy po wczytanieu wskaźnik jest NULL czy nie. Takie rzeczy i tak się powinno robić. Przecież np. na Efice ;) może zabraknąć pamięci i coś się może nie wyczytać. Program musi o tym wiedzieć żeby jakoś na to zareagować. Po każdym alokowaniu pamięci czy wczytywaniu czegoś warto sprawdzić czy się to udało. Normalnie zrób to printf i zobacz. Bez tego to nawet nie wiemy czy obrazki się wczytały czy nie.

[#13] Re: [C] Tablice wskaznikow

@Lorak, post #1

Witam!

Sprawdź czy przypadkiem nie przykrywasz gdzieś post_pierwsza_stoi.
W trzeciej części nie używasz wskaźnika tylko strukturę ( zapis .w, .h, i &post_pierwsza_stoi ) i podejrzewam, że gdziesz zasłaniasz tą zmienną. Jeśli nie znajdzesz gdzie to jest zasłonięte i będziesz się podpierał tym, że jak zamienisz .w, .h na ->w, ->h to kompilator popierduje, to proponuje zrobić bardzo prosty przykładzik ( tak dla pewności ).

SDL_Surface* wielki_elektronik[1];

wielki_elektronik[0] = MG_Load( "WielkiElektronik.jpeg" );

if( NULL == wielki_elektronik[0] )
{
  //tu pokaż błąd
}

int h = wielki_elektronik[0]->h;


Oczywiście nazwa zmiennej wielki_elektronik została wylosowana i jest jak najbardziej przypadkowa.

[#14] Re: [C] Tablice wskaznikow

@asman, post #13

Sprawdź czy przypadkiem nie przykrywasz gdzieś post_pierwsza_stoi
Jeśli p. Asman ma rację to usuń duplikaty lub umieść definicję struktury wewnątrz funkcji i przekazuj jako parametry.

Ja zauważam jeszcze jedną rzecz: Dlaczego używasz nazw SDL_Surface zamiast struct SDL_Surface? Podaj za jaką nazwą stoi ten symbol, np jak systemowy UWORD używa tej nazwy jako unsigned short int...

SDL_Surface *post_pierwsza_stoi[10]; jest oczywiście tabelą wskaźników do struktury SDL_Surface, ale w funkcji nr 3 jest używana jako tabelą struktur SDL_Surface.

Pozdrawiam

[#15] Re: [C] Tablice wskaznikow

@Minniat, post #14

'SDL_Surface' jest zapewne zdefiniowana w plikach nagłówkowych jako typ za pomocą słowa kluczowego 'typedef'. W tym przypadku nie trzeba poprzedzać jej słowem 'struct'. Podobnie nie trzeba używać 'struct' jeżeli piszemy w C++.

[#16] Re: [C] Tablice wskaznikow

@MDW, post #12

No ja wlasnie chcialem to zrobic ale juz wczesniej pisalem ze nie moge bo kompilator wywala mi blad jak chcem sprawdzic. No chyba ze nie umiem sprawdzac czy to NULL. Funkcja sprawdzajaca wyglada tak:

void gfx_WyswietlObrazekTest()
{
int klatka = 0;
if(post_pierwsza_stoi[klatka]==NULL) fprintf( stderr, "Nie moge otworzyc obrazkan");

SDL_Rect dest;
dest.x = 10;
dest.y = 10;
dest.w = post_pierwsza_stoi[klatka].w;
dest.h = post_pierwsza_stoi[klatka].h;
SDL_SetAlpha( &post_pierwsza_stoi[klatka], SDL_SRCALPHA, 255);
SDL_SetColorKey( &post_pierwsza_stoi[klatka], SDL_SRCCOLORKEY, SDL_MapRGB(post_pierwsza_stoi[klatka].format,255,0,255));
SDL_BlitSurface( &post_pierwsza_stoi[klatka], NULL, screen, &dest);
}

Tam gdzie jest ten IF kompilator wyrzuca blad twierdzac:
gfx.c: In function `gfx_WyswietlObrazekTest':
gfx.c:177: error: invalid operands to binary ==

Jak sprawdzic czy te wskazniki to NULLE? Przyznam ze rzeczywiscie moze byc cos nie tak z reszta klatek. Po prostu mogly sie nie wczytac...

[#17] Re: [C] Tablice wskaznikow

@Lorak, post #16

if(!post_pierwsza_stoi[klatka]) fprintf( stderr, "Nie moge otworzyc obrazkan");

[#18] Re: [C] Tablice wskaznikow

@Lorak, post #1

O qqqqrde ale ze mnie amator. Zobaczcie jak wygladal moj plik naglowkowy:

(...)
extern SDL_Surface *screen;
extern TTF_Font *font;

extern SDL_Surface *tlo_obrazek;
extern SDL_Surface *tlo_front;
extern SDL_Surface *tlo_mid;
extern SDL_Surface *tlo_back;

extern SDL_Surface *post_pierwsza_stoi; <--------

void load_Wszystko();
void load_TloObrazek();
void load_TloPierwsze();
(...)

nie napisalem nawiasow kwadrotowych tam gdzie strzalka. teraz jest tak:

extern SDL_Surface *post_pierwsza_stoi[];

I tam gdzie byly odwolania do struktury to teraz juz kompilator zarzadal poprawnych symboli "->"


DODANO:
HAAAAAAAAHAHAHAAAA DZIALA!!!! Ludzik sie rusza. Troche jak kaleka ale juz wszystko gra. Dzieki za porady:D



Ostatnia modyfikacja: 15.05.08 00:27
[#19] Re: [C] Tablice wskaznikow

@MinisterQ, post #17

A tak tez juz wczesniej probowalem ale nie tu lezal blad.

Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem