Salve ho compilato il seguente sorgente fatto con le SDL sotto winxp
trovato in un tutorial che serve a riempire con dei pixel colorati lo schermo:
codice:#include <stdio.h> #include <stdlib.h> #include <SDL/SDL.h> void Put_Pixel(SDL_Surface *surface, int x, int y, Uint8 R, Uint8 G, Uint8 B); void Draw_Screen(SDL_Surface *screen, int color); #define DIM_H 800 #define DIM_V 600 #define main SDL_main //int main(int argc, char *argv[]) extern C_LINKAGE int SDL_main(int argc, char *argv[]) { // si inizializza il sistema video if( SDL_Init(SDL_INIT_VIDEO) <0 ) { // SDL_GetError() ritorna una descrizione dell'errore printf("Errore init SDL: %s\n", SDL_GetError()); return 1; } // all'uscita del programma esegui SDL_Quit per risistemare le cose atexit(SDL_Quit); //dichiariamo un puntatore ad una superficie ed un int a 32 bit per i flag necessari SDL_Surface *screen; Uint32 flags; //SDL_VideoInfo da informazioni sulla scheda video const SDL_VideoInfo *info_hw; //otteniamo le informazioni sul video info_hw=SDL_GetVideoInfo(); //verifichiamo se possiamo creare una superficie hardware, altrimenti software if ( info_hw->hw_available ) flags = SDL_HWSURFACE; else flags = SDL_SWSURFACE; //aggiungiamo il buffer doppio flags|=SDL_DOUBLEBUF; // per rendere disegnabile la Superficie bisogna utilizzare SDL_SetVideoMode if(!( screen = SDL_SetVideoMode(DIM_H, DIM_V, 0,flags) )) { printf("Problemi con il settaggio dello schermo: %s\n", SDL_GetError()); return 1; } //variabile per il ciclo principale int done=0; //indice del colore 0 rosso, 1 verde , 2 blu int color=0; //dichiariamo una struttura SDL_Event SDL_Event event; //game loop, ovvero il loop che viene eseguito finche` non si esce while(!done) { // SDL_WaitEvent attende il prossimo evento SDL_WaitEvent(&event); //premendo la x della finestra col mouse si esce if ( event.type == SDL_QUIT ) done = 1; if ( event.type == SDL_KEYDOWN ) { //ma si esce anche premendo Esc if ( event.key.keysym.sym == SDLK_ESCAPE ) done = 1; //premendo la freccia GIU` ci spostiamo al colore precendete if( event.key.keysym.sym == SDLK_DOWN) { //se abbiamo raggiunto l'inizio degli indici torniamo all'ultimo if(!color) color=2; else color--; } //premendo la freccia SU ci spostiamo al prossimo colore if( event.key.keysym.sym == SDLK_UP) { //se abbiamo raggiunto la fine degli indici torniamo a 0 if(color==2) color=0; else color++; } //premendo spazio si passa dalla modalita` schermo intero alla modalita` //finestra e viceversa if ( event.key.keysym.sym == SDLK_SPACE ) { flags^=SDL_FULLSCREEN; screen = SDL_SetVideoMode(DIM_H, DIM_V, 0,flags); } } //coloriamo lo schermo Draw_Screen(screen,color); //SDL_Flip disegna il buffer direttamente sullo schermo SDL_Flip(screen); } return 0; } //disegna un pixel sullo schermo puntato da screen alle coordinate (x,y) con colori R,G,B void Put_Pixel(SDL_Surface *surface, int x, int y,Uint8 R, Uint8 G, Uint8 B) { //restituisce la mappatura di un colore RGB in base ai bpp (alla definizione) Uint32 color = SDL_MapRGB(surface->format, R, G, B); //byte per pixel int bpp = surface->format->BytesPerPixel; //pixel della superficie da colorare Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; //verifichiamo il numero di byte usati per la nostra superficie switch (bpp) { case 1: // 1 byte => 8-bpp *p = color; break; case 2: // 2 byte => 16-bpp *(Uint16 *)p = color; break; case 3: // 3 byte => 24-bpp if(SDL_BYTEORDER == SDL_BIG_ENDIAN) { p[0] = (color >> 16) & 0xff; p[1] = (color >> 8) & 0xff; p[2] = color & 0xff; } else { p[0] = color & 0xff; p[1] = (color >> 8) & 0xff; p[2] = (color >> 16) & 0xff; } break; case 4: // 4 byte => 32-bpp *(Uint32 *)p = color; break; } } // esegue la colorazione dello schermo void Draw_Screen(SDL_Surface *screen, int color) { int l_c[3]={0,0,0}; int col; if(color==0) l_c[0]=1; else if(color==1) l_c[1]=1; else if(color==2) l_c[2]=1; //blocchiamo lo schermo se necessario if ( SDL_MUSTLOCK(screen) ) SDL_LockSurface(screen); //disegnamo i pixel sul buffer screen precedentemente creato int y, x; for(y=0;y<DIM_V;y++) { for(x=0;x<DIM_H;x++) { col=(x/4)+25; Put_Pixel(screen, x,y,col*l_c[0],col*l_c[1],col*l_c[2]); } } //sblocchiamo lo schermo se necessario if ( SDL_MUSTLOCK(screen) ) SDL_UnlockSurface(screen); }
Utilizzo DEVc++ per compilare e dopo aver inserito i seguenti parametri di linking:
codice:-lmingw32-gcc -lsdlmain -lsdl
compilo ed ottengo:
Non capisco quindi perche' mi dia di nuovo tali problemi e dove possa aver sbagliato.codice:Compiler: Default compiler Building Makefile: "C:\Documents and Settings\admin\Desktop\Tetris\Makefile.win" Executing make... make.exe -f "C:\Documents and Settings\admin\Desktop\Tetris\Makefile.win" all mingw32-gcc.exe main.o -o "Tetris.exe" -L"C:/Dev-Cpp/lib" -lmingw32-gcc -lsdlmain -lsdl C:\Dev-Cpp\Bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lmingw32-gcc collect2: ld returned 1 exit status make.exe: *** [Tetris.exe] Error 1 Execution terminated
Sono nuovo delle SDL e sto' cercando un tutorial piu' di base che mi spieghi i dettagli
che mi servono ma e' difficile trovarlo in italiano.
Nessuno mi puo' dare una mano a capire perche' continua a darmi errori di linking?![]()

Rispondi quotando
