Problemas con el SDL_DisplayFormatAlpha

Problemas con el SDL_DisplayFormatAlpha

Notapor DrioN » Sab Jun 19, 2010 10:27 pm

Hola a todos soy nuevo en el foro e intentando iniciarme en el desarrollo de videojuegos, estoy con C++ y SDL.

Mi idea es hacer un sistemita de iluminacion pero no puedo hacerlo, ayer encontre un codigo en este lugar que modificaba el color de los pixel y como lo que habia intentado hacer no funciono intente usar parte de ese codigo, pero me tira error en el momento en que uso el SDL_DisplayFormatAlpha les dejo en codigo para que lo vean y si pueden ayudarme les estare agradecido.

Código: Seleccionar todo
SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,SDL_HWSURFACE|SDL_DOUBLEBUF);

void put_pixel(SDL_Surface *_ima, int x, int y, Uint32 pixel)
{
   int bpp = _ima->format->BytesPerPixel;
   Uint8 *p = (Uint8 *)_ima->pixels + y * _ima->pitch + x*bpp;

   switch (bpp)
   {
      case 1:
         *p = pixel;
         break;

      case 2:
         *(Uint16 *)p = pixel;
         break;

      case 3:
         if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
         {
            p[0]=(pixel >> 16) & 0xff;
            p[1]=(pixel >> 8) & 0xff;
            p[2]=pixel & 0xff;
         }
         else
         {
            p[0]=pixel & 0xff;
            p[1]=(pixel >> 8) & 0xff;
            p[2]=(pixel >> 16) & 0xff;
         }
         break;

      case 4:
         *(Uint32 *) p = pixel;
         break;
   }
}

void get_pixel_color (SDL_Surface * imagen, int x, int y, SDL_Color * color)
{
   int bpp = imagen->format->BytesPerPixel;
   Uint8 *p = (Uint8 *)imagen->pixels + y * imagen->pitch + x * bpp;

   SDL_GetRGBA (* (Uint32 *) p, imagen->format,
         &(color->r),
         &(color->g),
         &(color->b),
         &(color->unused)
         );
}

void set_pixel_color (SDL_Surface * imagen, int x, int y, SDL_Color * color)
{
   Uint32 pixel;

   pixel = SDL_MapRGBA (imagen->format, color->r, color->g, color->b,
         color->unused);

   put_pixel (imagen, x, y, pixel);
}

void ini_mi (int m[640][480],int x){  //Inicializa la matris que tendra los valores de transaprencia en cada parte.
    int i,j;
    for (j=0;j<640;j++){
        for(i=0;i<480>Aca me tira Fallo de Segmento
    SDL_Color color;
    color.r = 0;
    color.g = 0;
    color.b = 0;

    if (SDL_MUSTLOCK (mi))
   {
      if (SDL_LockSurface (mi) < 0)
         return NULL;
   }

    for (j=0;j<640;j++){
        for(i=0;i<480;i++){
            color.unused = m[j][i];
            set_pixel_color (dst,j,i,&color);
        }
    }

    if (SDL_MUSTLOCK (mi))
        SDL_UnlockSurface (mi);

   return dst;
}


Esta es el .h que estoy haciendo, la funcion iluminar recibe un PNG. Desde ya muchas gracias.
DrioN
 
Mensajes: 4
Registrado: Sab Jun 19, 2010 9:43 pm

Notapor Juanxo » Sab Jun 19, 2010 11:13 pm

Buenas Drion:

Parece que te falta algo de codigo, ademas no veo donde cierran las llaves de este for:

Código: Seleccionar todo
for (j=0;j<640;j++){
        for(i=0;i<480>Aca me tira Fallo de Segmento
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor DrioN » Dom Jun 20, 2010 12:31 am

Perdon, tienen razon me falta codigo aca les pongo la parte que se superpuso.

Código: Seleccionar todo
void ini_mi (int m[640][480],int x){  //Inicializa la matris que tendra los valores de transaprencia en cada parte.
    int i,j;
    for (j=0;j<640;j++){
        for(i=0;i<480;i++)
        {
            m[j][i]=x;
        }
    }
}
DrioN
 
Mensajes: 4
Registrado: Sab Jun 19, 2010 9:43 pm

Notapor DrioN » Dom Jun 20, 2010 12:33 am

Aca lo otro
Código: Seleccionar todo

SDL_Surface *iluminar (int m[640][480], SDL_Surface *mi){ //Funcion que modifica la imagen asignandole la transparencia a cada pixel
    int i,j;
    SDL_Surface *dst= SDL_DisplayFormatAlpha (mi);  //------->Aca me tira Fallo de Segmento
    SDL_Color color;
    color.r = 0;
    color.g = 0;
    color.b = 0;

    if (SDL_MUSTLOCK (mi))
   {
      if (SDL_LockSurface (mi) < 0)
         return NULL;
   }

    for (j=0;j<640;j++){
        for(i=0;i<480;i++){
            color.unused = m[j][i];
            set_pixel_color (dst,j,i,&color);
        }
    }

    if (SDL_MUSTLOCK (mi))
        SDL_UnlockSurface (mi);

   return dst;
}
DrioN
 
Mensajes: 4
Registrado: Sab Jun 19, 2010 9:43 pm

Notapor Geo » Dom Jun 20, 2010 12:56 am

Pon código que se pueda compilar y ejecutar, para facilitar que recibas ayuda :).
La causa de un fallo de segmentación puede ser muy fácil o muy difícil de encontrar, si no podemos reproducir las condiciones bajo las que ejecutas se complica encontrarlo.
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Notapor DrioN » Dom Jun 20, 2010 1:15 am

Aca esta el main simplemente carga una imagen.

Código: Seleccionar todo
#include <iostream>
#include <SDL>
#include <SDL_image>
using namespace std;
#include <extra>


int main ( int argc, char** argv )
{
    int m[640][480];

    SDL_Surface *oscuridad;
    SDL_Rect rfondo;

    rfondo.x =0;
    rfondo.y =0;

    ini_mi(m,128);

    oscuridad = IMG_Load ("sombra.PNG");

    if ( SDL_Init( SDL_INIT_VIDEO )  < 0 )
    {
        printf( "Unable to init SDL: %s\n", SDL_GetError() );
        return 1;
    }

    atexit(SDL_Quit);

    bool done = false;
    while (!done)
    {

        SDL_Event event;
        while (SDL_PollEvent(&event))
        {

            switch (event.type)
            {
            case SDL_QUIT:
                done = true;
                break;

            case SDL_KEYDOWN:
                {
                    if (event.key.keysym.sym == SDLK_ESCAPE)
                        done = true;
                    break;
                }
            }
        }

        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));

        oscuridad = iluminar(m,oscuridad);

        SDL_BlitSurface (oscuridad,NULL,screen,&rfondo);


        SDL_Flip(screen);

    }


    printf("Exited cleanly\n");
    return 0;
}


Que es a la que le quiero dar una transparencia a cada pixel, en realidad quiro que sea distinta en cada uno pero para probar le asigno la misma a todos
DrioN
 
Mensajes: 4
Registrado: Sab Jun 19, 2010 9:43 pm

Notapor Juanxo » Dom Jun 20, 2010 3:00 am

buenas drinor:

Intenta lo siguiente:
En el main, primero inicializa todo (SDL_Init, etc)
Despues cargas la imagen y despues iluminas.

No hace falta que ilumines cada frame, ya que no cambia ninguna condicion de m. Hazlo despues de cargar la imagen y listo

El problema quizas se deba a la SDL_Surface* screen.
Lo que pasa es que te has creado una variable global. En vez de eso, prueba a ponerla en el main despues de inicializar el video.
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor Geo » Lun Jun 21, 2010 6:03 pm

  1. Asegúrate que hayas cargado correctamente la imagen sombra.PNG.
  2. SDL_SetVideoMode debería ser llamada después de la inicialización de SDL. Por tanto, screen puede ser una variable global, pero no inicializarla al momento de su declaración.
  3. Como Juanxo ya apuntó, si no vas a modificar el valor de transparencia de la imagen, con configurarlo una vez basta.
  4. Si vas a asignar el mismo valor de transparencia a toda la imagen, utiliza SDL_SetAlpha.
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México


Volver a Videojuegos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado