
/* GIMP RGB C-Source image dump (tierra_agrietada.c) */
static const struct {
guint width;
guint height;
guint bytes_per_pixel; /* 3:RGB, 4:RGBA */
guint8 pixel_data[100 * 100 * 3 + 1];
} tierra_agrietada = {
100, 100, 3,
"\200U+\200U+\200U+U+\0\200U+\377\324\252\377\324\252\324\252\252\324\252"
"\252\324\252\200\324\252\200\324\252\200\324\252\200\324\252\200\324\252"
"\200\324\252\252\324\252\252\324\252\252\324\252\252\324\252\200\324\252"
"\200\324\252\200\324\252\200\324\252\200\324\252\252\252\200\200\324\252"
"\200\324\252\200\252\200\200\252\200\200\324\252\200\324\252\200\324\252"
"\200\324\252\200\324\324\252\324\252\200\324\252\200\324\252\200\324\252"
"\200\324\252\200\252\252\200\324\252\200\324\252\200\324\252\200\324\252"
"\200\324\252\200\324\252\200\252\200U\324\252\200\324\252\200\252\200U\252"
[...]
lacabra25 escribió:Hola, me descargue gimp para hacer los dibujos para mis juegos, y vi que la imagen se podia guardar con formato .c, de forma que define una estructura y crea una variable para guardar la imagen, supongo que cada byte del array de los pixels, se correspondera con el byte de cada canal de un pixel, pero aun asy no se como pasar la imagen a una superficie SDL, ¿dibujo pixel a pixel la superficie pasando como valores de rojo, verde y azul al color del pixel cada byte del array?,
lacabra25 escribió:¿como identifico en que posicion esta cada byte de cada canal de cada pixel?, para esta ultima pregunta se me ocurrio que como el array mide ancho(o alto, no se seguro) X alto(o ancho, no se seguro) X canales + 1 podria identificar la posicion del pixel en las coordenadas (x; Y) de la siguiente forma (x * 3) + (y * alto * 3) + canal pero no estoy seguro si esto funcionaria.
Geo escribió:Una es crear una Surface y luego copiar pixel a pixel, pero no es nada eficiente. La alternativa sería copiar el bloque de memoria completo a una SDL_Surface o mejor utilizar SDL_CreateRGBSurfaceFrom.
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
static const struct {
int w;
int h;
int bpp; /* 3:RGB, 4:RGBA */
Uint8 pixels[100 * 100 * 3 + 1];
} tierra_agrietada = {
100, 100, 3,
"\200U+\200U+\200U+U+\0\200U+\377\324\252\377\324\252\324\252\252\324\252"
"\252\324\252\200\324\252\200\324\252\200\324\252\200\324\252\200\324\252"
"\252\200\324\252\200\252\200U\252\200U\324\252\200\324\252\200\324\252\200"
"\324\200U\252\200U\252U+\200U+\200U+\200U+\377\252\200\377\324\252\377\252"
"\252\324\252\200\252\200U\200U+\200U+\200U+\252\200U\377\324\252\377\324"
"\252\324\252\200\324\252\200\252\252\200\252\200U\252\200U\200U+\200U+\200"
"+\0\200+\0\200U+\252\200U\324\252\200\324\252\200\324\252\200",
};
int main(int argc, char *argv[]){
SDL_Surface *pantalla, *imagen;
SDL_Rect dest;
/* Iniciando SDL*/
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("EGI - No fue posible iniciar SDL, error: %s\n",SDL_GetError());
exit(1);
}
/* Iniciando modo de video*/
pantalla = SDL_SetVideoMode(200,200,24,SDL_SWSURFACE| SDL_DOUBLEBUF);
if (pantalla == NULL) {
printf("EIV - No se puede inicializar el modo de video 457x457 24 Bits en la memoria de video con doble buffer, error: %s\n",SDL_GetError());
exit(1);
}
imagen= SDL_CreateRGBSurfaceFrom(&tierra_agrietada.pixels, 100, 100, 3, 400, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);
if(imagen != NULL){
/*mostramos la imagen en la pantalla centrada si es mas pequeña que la pantalla*/
dest.x = 0;
dest.y = 0;
dest.w = 100;
dest.h = 100;
SDL_BlitSurface(imagen, NULL, pantalla, &dest);
if(SDL_Flip(pantalla) == -1){
SDL_UpdateRect(pantalla, 0, 0, pantalla->w, pantalla->h);
}
printf("Imagen mostrada\n");
}
else{
printf("Imagen NULL\n");
}
SDL_Delay(4000);
return 0;
}
imagen = SDL_CreateRGBSurfaceFrom(
&tierra_agrietada.pixels,
tierra_agrietada.width,
tierra_agrietada.height,
tierra_agrietada.bytes_per_pixel * 8, // 1 byte = 8 bits => bits por pixel = bytes por pixel * 8
tierra_agrietada.width * tierra_agrietada.bytes_per_pixel, // scanline = ancho * bytes por pixel
0x000000ff, 0x0000ff00, 0x00ff0000, 0
);
lacabra25 escribió:Gracias Geo, ahora funciona perfectamente, no estaria mal tener algun ejemplo de imagenes dentro del propio codigo del programa en la seccion de ejemplos.
lacabra25 escribió:¿La inversa de esto, como se hace, como de la superficie sacan el codigo en C necesario para hacer una superficie a partir de el?, se que gimp lo hace y todo eso, y no creo que haciendolo gimp me ponga yo a hacerlo, pero es por curiosidad y por aprender más sobre las superficies, c y sdl.
lacabra25 escribió:No entiendo la ultima linea, sobre Glib de gimp, ¿a que te refieres exactamente?, si he usado algo de Glib de Gimp, la verdad es que no me he enterado de que lo he usado.
Geo escribió:. Si nadie se ofrece, con gusto me hago un tiempo para escribir un ejemplo
.
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
static const struct {
int w;
int h;
int bpp; /* 3:RGB, 4:RGBA */
Uint8 pixels[100 * 100 * 3 + 1];
} tierra_agrietada = {
100, 100, 3,
"\200U+\200U+\200U+U+\0\200U+\377\324\252\377\324\252\324\252\252\324\252"
"\252\324\252\200\324\252\200\324\252\200\324\252\200\324\252\200\324\252"
"\200\324\252\252\324\252\252\324\252\252\324\252\252\324\252\200\324\252"
"\200\324\252\200\324\252\200\324\252\200\324\252\252\252\200\200\324\252"
"\200\324\252\200\252\200\200\252\200\200\324\252\200\324\252\200\324\252"
"\200\324\252\200\324\324\252\324\252\200\324\252\200\324\252\200\324\252"
"\200\324\252\200\252\252\200\324\252\200\324\252\200\324\252\200\324\252"
"\200\324\252\200\324\252\200\252\200U\324\252\200\324\252\200\252\200U\252"
"\200U\324\200\200\324\252\200\324\252\200\324\252\200\324\252\200\324\252"
[...]
lacabra25 escribió:Y ¿con lo interesante que es esa funcion para no tener que distribuir junto con el programa un monton de archivos de imagen, sino todo junto en el .exe; como es que en ningun manual de SDL (o por lo menos de los que yo llevo leidos) aparece esta funcion?
hugoruscitti escribió:En todo caso se puede usar una biblioteca para colocar todos los
recursos en un archivo bajo compresión (como hacen Quake,
Doom o similares). Usando SDL resulta sencillo usar zziplib [1]
Como programador de juegos tu principal objetivo es hacer el juego, no
me gustaría ver que abandones esto por dedicar todo tu tiempo
a detalles menores.
[1] - http://zziplib.sourceforge.net/
Volver a Sobre las bibliotecas multimedia
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado