Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    9

    Problema con programma con le SDL

    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:

    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
    Non capisco quindi perche' mi dia di nuovo tali problemi e dove possa aver sbagliato.
    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?

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Hai qualche problema col Devcpp
    Quel programma è oggettivamente obsoleto e orrendo. Usa visual studio 2010 express, è gratis
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    9
    Avevo provato Visual Studio 2008 tempo fa ed oltre ad essere pesante oltremodo,
    ha un' interfaccia grafica impostata in modo completamente diversa dagli ide open-source,
    ci vuole quindi un corso a parte per impararlo, mi serve qualche cosa di piu' facile utilizzo.
    Che ne dici di code:block per winxp? Puo' andar bene per le SDL o mi puo' dare problemi?

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    9
    Ho installato code::blocks e le SDL.
    Sto' creando il progettino di cui sopra consistente nel gioco del Tetris.
    Appena do' New | Project | SDL mi appare una finestra in cui inserisco il titolo e percorso del
    progetto poi mi chiede di inserire i percorsi degli header e delle lib delle SDL.
    Una volta fatto questo mi chiede di inserire le variabili d' ambiente quindi le cflags
    ed lflags ma non so' di cosa devo mettere.
    Se conosci code::blocks mi daresti una mano?
    Grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.