SDL insertar imagenes [lenjuage C]

JORGE BA-K

Bovino de alcurnia
#1
Hola amigos tengo una duda al estar en este codigo;

HTML:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#include <windows.h>

/*
 PLEASE NOTE: the program will require SDL.dll which is located in
              dev-c++'s dll directory. You have to copy it to you
              program's home directory or the path.
 */

/* The screen surface */
SDL_Surface *screen = NULL;


/* This function draws to the screen; replace this with your own code! */
static void
draw ()
{
    static int direction = 0;
    static int value = 0;
    static int which = 0;
    SDL_Rect rect;
    Uint32 color;

    /* Create a black background */
    color = SDL_MapRGB (screen->format, 0, 0, 0);
    SDL_FillRect (screen, NULL, color);

    /* Determine which color the layer should have */
    if (direction == 0)
    {
        value += 2;
        if (value >= 256)
        {
            value = 255;
            direction = 1;
        }
    }
    else
    {
        value -= 2;
        if (value <= 5)
        {
            value = 0;
            direction = 0;
            which++;
            if (which == 5)
                which = 0;
        }
    }

    /* Draw a layer with variable color */
    switch (which)
    {
      case 0:
          color = SDL_MapRGB (screen->format, value, 0, 0);
          break;
      case 1:
          color = SDL_MapRGB (screen->format, 0, value, 0);
          break;
      case 2:
          color = SDL_MapRGB (screen->format, 0, 0, value);
          break;
      case 3:
          color = SDL_MapRGB (screen->format, value, value, value);
          break;
      case 4:
          color = SDL_MapRGB (screen->format, value, 0, value);
          break;
    }

    rect.w = screen->w / 2;
    rect.h = screen->h / 2;
    rect.x = (screen->w / 2) - (rect.w / 2);
    rect.y = (screen->h / 2) - (rect.h / 2);
    SDL_FillRect (screen, &rect, color);


    /* Make sure everything is displayed on screen */
    SDL_Flip (screen);
    /* Don't run too fast */
    SDL_Delay (3);
}


int
main (int argc, char *argv[])
{
    char *msg;
    int done;

    /* Initialize SDL */
    if (SDL_Init (SDL_INIT_VIDEO) < 0)
    {
        sprintf (msg, "Couldn't initialize SDL: %s\n", SDL_GetError ());
        MessageBox (0, msg, "Error", MB_ICONHAND); 
        free (msg);
        exit (1);
    }
    atexit (SDL_Quit);

    /* Set 640x480 16-bits video mode */
    screen = SDL_SetVideoMode (640, 480, 16, SDL_SWSURFACE | SDL_DOUBLEBUF);
    if (screen == NULL)
    {
        sprintf (msg, "Couldn't set 640x480x16 video mode: %s\n",
          SDL_GetError ());
        MessageBox (0, msg, "Error", MB_ICONHAND); 
        free (msg);
        exit (2);
    }
    SDL_WM_SetCaption ("BIENVENDOS A INTERACTIVO COBAY", NULL);

    done = 0;
    while (!done)
    {
        SDL_Event event;

        /* Check for events */
        while (SDL_PollEvent (&event))
        {
            switch (event.type)
            {
            case SDL_KEYDOWN:
                break;
            case SDL_QUIT:
                done = 1;
                break;
            default:
                break;
            }
        }

        /* Draw to screen */
        draw ();
    }

    return 0;
}
en que linea se le insertar alguna funcion o no se?. para agregarle una imagen, ando programando en SDL con DevC++ y estoy en mis inicios:metal:
 
#3
Si te refieres a cargar una imagen desde archivo puedes utilizar la función:

SDL_LoadBMP("Path");

donde el "Path" se refiere a donde esta la ubicación de la imagen, después guardas esa imagen cargada en una Estructura de tipo SDL_Surface quedando de la siguiente forma:

SDL_Surface* imagen = SDL_LoadBMP("Path");

después para mostrar la imagen en pantalla, si tu pantalla se llama por ejemplo "screen" entonces pordrías hacer algo como esto:

SDL_Rect rectangulo;
rectangulo.x = 0;
rectangulo.y = 0;
rectangulo.w = imagen->w;
rectangulo.h = imagen->h;

o bien puedes usar directamente:

SDL_Rect rectangulo = {0, 0, imagen->w, imagen->h};

despues bastaría con "dibujar en el buffer" la imagen:

SDL_BlitSurface(imagen, NULL, screen, &rectangulo);

y por último tienes que "vaciar el buffer" a la pantalla:

SDL_Flip(screen); // Si estas utlizando HWSURFACE o bien
SDL_UpdateRect(screen, 0, 0, 0, 0); // Si estas usando SWSURFACE

espero te haya servido

si tienes mas dudas pregunta
 
#5
Sería IMG_Load("Path"); // en vez de SDL_LoadBMP("Path");

La diferencia radica en que el SDL_LoadBMP(); como su nombre lo dice solo carga imagenes de formato .bmp

y la otra función carga distintos tipos conocidos de formatos de imágenes: .jpg .png etc
 

JORGE BA-K

Bovino de alcurnia
#7
Si te refieres a cargar una imagen desde archivo puedes utilizar la función:

SDL_LoadBMP("Path");

donde el "Path" se refiere a donde esta la ubicación de la imagen, después guardas esa imagen cargada en una Estructura de tipo SDL_Surface quedando de la siguiente forma:

SDL_Surface* imagen = SDL_LoadBMP("Path");

después para mostrar la imagen en pantalla, si tu pantalla se llama por ejemplo "screen" entonces pordrías hacer algo como esto:

SDL_Rect rectangulo;
rectangulo.x = 0;
rectangulo.y = 0;
rectangulo.w = imagen->w;
rectangulo.h = imagen->h;

o bien puedes usar directamente:

SDL_Rect rectangulo = {0, 0, imagen->w, imagen->h};

despues bastaría con "dibujar en el buffer" la imagen:

SDL_BlitSurface(imagen, NULL, screen, &rectangulo);

y por último tienes que "vaciar el buffer" a la pantalla:

SDL_Flip(screen); // Si estas utlizando HWSURFACE o bien
SDL_UpdateRect(screen, 0, 0, 0, 0); // Si estas usando SWSURFACE

espero te haya servido

si tienes mas dudas pregunta

oye amigo mi codigo a quedado asi :

HTML:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#include <windows.h>


int main (int argc, char *argv[]) {

IMG_Load("C:/User/Jorge/Desktop/sari.jpg")



SDL_Rect rectangulo = {0, 0, imagen->w, imagen->h};


SDL_BlitSurface(imagen, NULL, screen, &rectangulo);


SDL_UpdateRect(screen, 0, 0, 0, 0); 
}
pero salen errores

In function `int SDL_main(int, char**)':
expected `;' before "SDL_Rect"
`IMG_Load' was not declared in this scope
`screen' was not declared in this scope
`imagen' was not declared in this scope
`rectangulo' was not declared in this scope

saludos
 
#8
Bueno primero que nada si decidiste usar la función IMG_Load
tienes que tomar en cuenta que tienes la librería de SDL_image.h agregada y si estas usando Dev-cpp deberías agregar al linker lo siguiente:

-lSDL_image

para que te reconozca dicha librería

Vi el código pero en el solo estas leyendo la imagen y mostrándola, pero no tienes pantalla (ventana) en cual mostrarla
 
#9
Cheka este codigo aqui te explico como funciona paso a paso:




#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{

SDL_Surface* pantalla; // Para almacenar la pantalla
SDL_Surface* imagen; // Para almacenar la imagen
SDL_Rect rectangulo; // Para dibujar el rectangulo de la imagen
SDL_Event event; // Para el control de salida del programa
int salida=0; // Vale 1 si se termina el programa, y 0 si el programa sigue


// Inicializa el SDL
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
fprintf(stderr, "Error al iniciar SDL");
exit(1);
}


// Guarda la ventana en la variable pantalla
pantalla = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

// Guarda la imagen en la variable imagen
//Si no tienes SDL_image.h utiliza esto: SDL_LoadBMP("cb.bmp");
imagen = IMG_Load("cb.jpg");

// Indica el area rectangular donde se dibujara la imagen
rectangulo.x = 0;
rectangulo.y = 0;
rectangulo.w = imagen->w;
rectangulo.h = imagen->h;


// Dibuja la imagen en "buffer"
SDL_BlitSurface(imagen, NULL, pantalla, &rectangulo);

// Dibuja en pantalla lo que esta en el "buffer"
SDL_Flip(pantalla);

// Controla la salida del progarma
while(salida == 0)
{

while(SDL_PollEvent(&event))
{
if(event.type==SDL_QUIT)
salida = 1;

}

}
return 0;
}
 

JORGE BA-K

Bovino de alcurnia
#10
Cheka este codigo aqui te explico como funciona paso a paso:




#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{

SDL_Surface* pantalla; // Para almacenar la pantalla
SDL_Surface* imagen; // Para almacenar la imagen
SDL_Rect rectangulo; // Para dibujar el rectangulo de la imagen
SDL_Event event; // Para el control de salida del programa
int salida=0; // Vale 1 si se termina el programa, y 0 si el programa sigue


// Inicializa el SDL
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
fprintf(stderr, "Error al iniciar SDL");
exit(1);
}


// Guarda la ventana en la variable pantalla
pantalla = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

// Guarda la imagen en la variable imagen
//Si no tienes SDL_image.h utiliza esto: SDL_LoadBMP("cb.bmp");
imagen = IMG_Load("cb.jpg");

// Indica el area rectangular donde se dibujara la imagen
rectangulo.x = 0;
rectangulo.y = 0;
rectangulo.w = imagen->w;
rectangulo.h = imagen->h;


// Dibuja la imagen en "buffer"
SDL_BlitSurface(imagen, NULL, pantalla, &rectangulo);

// Dibuja en pantalla lo que esta en el "buffer"
SDL_Flip(pantalla);

// Controla la salida del progarma
while(salida == 0)
{

while(SDL_PollEvent(&event))
{
if(event.type==SDL_QUIT)
salida = 1;

}

}
return 0;
}
Ya esta funcionando al 100 amigo.. gracias :metal::metal::metal: y mas.!!!....

cuanto te debo?...



solo que tengo una duda mas amigo... tengo un codigo aparte que no es SDL... cuando abro este SDL no puedo cerrarlo y hacer que se abra el otro codigo normal o viceversa?


saludos y gracias
 
#11
solo puedes interactuar con la ventana que creaste.

Si te refieres a utilizar la consola para otras tareas, no tengo idea de como se hace o si se puede hacer (al menos no con SDL)

espero te haya ayudado
 

JORGE BA-K

Bovino de alcurnia
#12
solo puedes interactuar con la ventana que creaste.

Si te refieres a utilizar la consola para otras tareas, no tengo idea de como se hace o si se puede hacer (al menos no con SDL)

espero te haya ayudado

ok amigo gracias... :metal::metal: buscare la forma de abrir con un SYSTEM("ruta"); aver si abre....




Ya lo hice.. no paso nada no abre el .exe:mota:


saludos
 
Arriba