› Foros › PC › Software libre
#include "SDL.H"
int SDL_Init(Uint32 flags);
int error;
error=SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO);
if(error!=0)
{
printf("Fallo al inicializar SDL");
return -1;
}
SDL_Surface *SDL_SetVideoMode(int ancho, int alto, int bpp, Uint32 flags);
int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);
SDL_FillRect( MiSurface, NULL, SDL_MapRGB(MiSurface->format,255,0,0) );
SDL_UpdateRect(MiSurface,initX,initY,finX,finY);
void SDL_Quit(void);
Escrito originalmente por Rurouni
Te importaria que lo pusiera en pseudo??? Con colorines y demás... te abriria una cuenta de colaborador y lo puedes modificar a tu gusto.
Uint32 SDL_MapRGB(SDL_PixelFormat *fmt, Uint8 r, Uint8 g, Uint8 b);
/*Inicializo las SDL y consigo el valor de un color.
No hay detección de errores.
*/
SDL_Surface *vga; /* Nuestro puntero a la pantalla */
Uint32 colorcito32; /* Almacenaremos nuestro colorcito aquí */
Uint32 colorcito8; /* Otro colorcito */
SDL_Init(SDL_INIT_VIDEO); /* Arrancamos las SDL */
vga=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE); /* Ponemos un modo de 32 bits */
colorcito32=SDL_MapRGB(vga->format,255,0,0,0); /* Consigo el color rojo en esta surface */;
/* Ahora cambio el modo de video a un modo paletizado */
vga=SDL_SetVideoMode(640,480,8,SDL_HWPALLETE); /* Ponemos un modo de 8 bits (paletizado)*/
colorcito8=SDL_MapRGB(vga->format,255,0,0,0); /* Consigo el color rojo en esta surface */;
SDL_Quit(); /* Saliendo..... */
printf("El color rojo en 32 bits es :%d, y en 8 bits:%d\n", colorcito32,colorcito8);
typedef struct SDL_Surface {
Uint32 flags; /* Read-only */
SDL_PixelFormat *format; /* Read-only */
int w, h; /* Read-only */
Uint16 pitch; /* Read-only */
void *pixels; /* Read-write */
/* clipping information */
SDL_Rect clip_rect; /* Read-only */
/* Reference count -- used when freeing surface */
int refcount; /* Read-mostly */
/* This structure also contains private fields not shown here */
} SDL_Surface;
if ( SDL_MUSTLOCK(screen) )
{
if ( SDL_LockSurface(screen) < 0 )
{
fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
return;
}
}
/* Hacemos lo que queramos con screen->pixels[] */
if ( SDL_MUSTLOCK(screen) )
{
SDL_UnlockSurface(screen);
}
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to set */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->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;
}
}
Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to retrieve */
Uint8 *p = (Uint8 *) surface->pixels + y * surface->pitch + x * bpp;
switch (bpp)
{
case 1:
return *p;
case 2:
return *(Uint16 *) p;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] << 16 | p[1] << 8 | p[2];
else
return p[0] | p[1] << 8 | p[2] << 16;
case 4:
return *(Uint32 *) p;
default:
return 0; /* shouldn't happen, but avoids warnings */
}
}
int SDL_SetPalette(SDL_Surface *surface, int flags, SDL_Color *colors, int firstcolor, int ncolors);
SDL_Color colors[256]; /* La paleta */
for(i=0;i<255;i++) /* Apaño una paleta que vaya degradándose */
{
colors[i].r=i; /* De negro */
colors[i].g=i; /* a blanco*/
colors[i].b=i;
}
typedef struct{
Uint8 r;
Uint8 g;
Uint8 b;
Uint8 unused;
} SDL_Color;
#include <stdio.h>
#include <conio.h>
#include "SDL.H"
#define MAX_STARS 500
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel);
struct star_Struct
{
int x;
int y;
int z;
};
int main( int argc, char* argv[] )
{
/*Declaro las variables de nuestro programa */
SDL_Surface *vga; /* Como siempre */
SDL_Color colors[256]; /* La paleta */
struct star_Struct stars[MAX_STARS]; /*Nuestro array de estrellitas */
/* Variables utiles */
int i;
int xpos,ypos;
int vel=1;
SDL_Init(SDL_INIT_VIDEO); /*Arranco las sdl */
vga=SDL_SetVideoMode(640,480,8,SDL_HWPALETTE); /*Pongo modo paletizado */
for(i=0;i<255;i++) /* Apaño una paleta que vaya degradándose */
{
colors[i].r=i; /* De negro */
colors[i].g=i; /* a blanco*/
colors[i].b=i;
}
/* Le digo a SDL, que la Surface vga va a utilzar la paleta que acabo de crear */
SDL_SetPalette(vga, SDL_LOGPAL|SDL_PHYSPAL, colors, 0, 256);
/* Inicio las estrellas */;
for(i=0;i<MAX_STARS;i++)
{
stars[i].x=(rand()%640)-320; /* Valores entre -320 y 320 */
stars[i].y=(rand()%480)-240; /* Valores entre -240 y 240 */
stars[i].z=rand()%256+1;
}
while(!kbhit() ) /*mientras no toque ninguna tecla */
{
for( i=0;i<MAX_STARS;i++)
{
if(stars[i].z>vel) /*Si puedo restar vel a las z*/
stars[i].z-=vel;
else
{
stars[i].z=rand()%256+1; /*Si no puedo es que tengo que crear una nueva */
stars[i].x=(rand()%640)-320;
stars[i].y=(rand()%480)-240;
}
/*Formulita mágica para pasar de 3d a 2d */
xpos=(256* stars[i].x/stars[i].z)+320;
ypos=(256* stars[i].y/stars[i].z)+240;
/*Si la posición final se sale de los bordes tengo que crear una nueva */
if(xpos<0 || xpos> 639 || ypos <0 || ypos >479)
{
stars[i].x=(rand()%640)-320;
stars[i].y=(rand()%480)-240;
stars[i].z=rand()%256+1;
}
else
{ /*Sino,pongo un pixel con el color de la z. A mayor z, más blanco*/
putpixel(vga,xpos,ypos,stars[i].z);
}
}
SDL_UpdateRect(vga,0,0,0,0);
SDL_FillRect(vga,NULL,SDL_MapRGB(vga->format,0,0,0) );
}
return 1;
}
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to set */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->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;
}
}
Escrito originalmente por billyberjas
mmm, en bindows es en el conio.h, pero en linus.......
si te da problemas el kbhit(), usa while(2), es un bucle infinito, así q tendrás que matar el proceso o cerrar la ventanita o apagar el ordenador, o algo parecido
Escrito originalmente por escufi
pues esa no es (stdlib) , y el apaño ese q me has dicho esta bien , sino fuese pq al cerrar la ventanita.... como q no se lo toma muy bien me parece q no descarga de memoria los recursos.
Escrito originalmente por escufi
A ver si alguien sabe q libreria es.... SergioX?
SDL_Surface *SDL_LoadBMP(const char *file);
SDL_Surface *imagen1;
imagen1=SDL_LoadBMP("prueba.bmp");
if(imagen1==NULL)
{
printf("la cagamos al abrir\n");
return -1;
}
else
{
printf("Fichero cargado sin problemas");
}
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
SDL_BlitSurface(imagen1,NULL,vga,NULL); /* Bliteo la imagen */
SDL_UpdateRect(vga,0,0,0,0); /* Actualizo la pantalla */
[B]Nombre[/B]
[I]SDL_Rect [/I] -- Define un área rectangular
[B]Definición de la estructura[/B]
typedef struct{
Sint16 x, y;
Uint16 w, h;
} SDL_Rect;
[B]Datos de la estructura[/B]
x, y Posición de la coordenada superior izquierda del rectángulo.
w, h El ancho (w) y el alto(h) del rectángulo.
[B]Descripción[/B]
Una SDL_Rect define un área rectangular de pixels. Es usado por SDL_BlitSurface para definir regiones de blitting y por varias funciones de video.
SDL_Rect rectadestino;
rectadestino.x=150;
rectadestino.y=50;
SDL_BlitSurface(imagen1,NULL,vga,&rectadestino);
SDL_UpdateRect(vga,0,0,0,0);
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key);
SDL_SetColorKey(imagen1,SDL_SRCCOLORKEY | SDL_RLEACCEL,SDL_MapRGB(imagen1->format,255,255,255) );
int SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha);
SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface);
SDL_Surface *SDL_DisplayFormatAlpha(SDL_Surface *surface);
SDL_Surface *imagenmala,imagenbuena;
imagenmala=SDL_LoadBMP("prueba.bmp");
imagenbuena=SDL_DisplayFormat(imagenmala);
Escrito originalmente por Rurouni
solo falta escoger que cable cortar: el rojo o el azul...
#include "SDL.H"
int main( int argc, char* argv[] ) { }
#include <stdio.h>
void main(void)
{
int a,b,suma;
printf("Introduce dos enteros (separados por comas):"); //imprimo comentario
scanf( "%d,%d" ,&a, &b); //recibo los numeros
suma=a+b; //los sumo
printf("\n La suma de los numeritos es :%d ", suma); //muestro resultado
printf("\n\nGracias por confiar en nosotros "); //Comentario de Salida
}// fin del main
typedef union{
Uint8 type; //tipo de evento
SDL_ActiveEvent active; //evento de activación (de ventana,foco,etc...)
SDL_KeyboardEvent key; //evento de teclado (tecla pulsada, tecla soltada,etc...)
SDL_MouseMotionEvent motion; // evento de movimiento de ratón
SDL_MouseButtonEvent button; // evento de pulsación de botones de raton
SDL_JoyAxisEvent jaxis; // evento de movimiento del joystick
SDL_JoyBallEvent jball; // evento de movimiento del ¿trackball? del joystick
SDL_JoyHatEvent jhat; //evento de pulsación de los ¿hats? del joystick
SDL_JoyButtonEvent jbutton; //evento de pulsación de los botones del joystick
SDL_ResizeEvent resize; // evento de redefinición de tamaño de la aplicación (resize)
SDL_ExposeEvent expose; // evento de exposición de ventana ( alguna ventana se ha puesto encima de nosotros)
SDL_QuitEvent quit; // evento de .... salida...pues claro...;)
SDL_UserEvent user; //evento de usuario, éstos los lanzamos nosotros, ¿como mola,eh ? XD
SDL_SywWMEvent syswm; //evento del manejador de Ventanas ( nos pelearemos nostros mismos con los eventos de nuestro SO)
} SDL_Event;
SDL_Event evento;
int salir=0;
while(!salir) //mientras que no tenga que salir del programa
{
while(dame_evento(&evento)!=0) //mientras que haya un evento en la cola pendiente para ser procesado.
{
switch(evento.type) //miramos de que típo es el evento que nos ha llegado
{
case SDL_SDL_MOUSEMOTION: // es un evento de ratón, en concreto un evento de movimiento
//, oseasé un SDL_MouseMotionEvent, definido en la unión SDL_Event // como [I]motion[/I]
printf("Estás moviendo el ratón en las coordenadas x:%d,y:%d\n",evento.motion.x,evento.motion.y);
break; //salimos del case MOUSEMOTION
case SDL_QUIT: //nos llega un evento de salir del programa, por lo que saldremos del programa
salir=1;
break;
default:
printf("no sé que evento és....\n");
break;
} //fin del switch
} //fin del while (evento)
//si ésto fuera un programa normal, podríamos hacer cosas mientras no haya eventos pendientes :)
} //fin del while(!salir)
printf("Programa terminado\n");
int heroex,heroey;
int salir=0;
SDL_Event evento;
while(!salir) //mientras no haya que salir
{
while(SDL_PollEvent(&evento)!=0) //mientras haya algún evento en la cola
{
switch (evento.type)
{
case SDL_KEYDOWN: //entramos jústo donde queremos, cuando pulsen una tecla.
//entramos en otro switch para saber qué tecla hemos pulsado (buscad en la doc las keysims)
switch(evento.key.keysym.sym)
{
case SDLK_LEFT: //ha pulsado el cursor izquierdo
heroex--;
break;
case SDLK_RIGHT: //ha pulsado el cursor derecho
heroex++;
break;
case SDLK_UP: //arriba
heroey--;
break;
case SDLK_DOWN: //abajo
heroey++;
break;
case SDLK_ESC: //ha pulsado la tecla ESCAPE .... ¿Por qué? ¿No le gusta? ;)
salir=1;
break;
} //fin del switch de los keysyms
break; //fin del case SDL_KEYDOWN
case SDL_QUIT: //si es un evento de salida
salir=1;
break;
default:
printf("No sé que narices me estás contando, pero ya lo tratará nuestro gestor de ventanas :)\n");
} //fin del switch de eventos
} //fin del while (SDL_PollEvent() )
dibuja_heroe (heroex,heroey); //dibuja a nuestro héroe en las coordenadas que queramos
SDL_UpdateRect(.....) //Actualiza pantalla
} //fin del while(!salir)
int heroex,heroey;
int salir=0;
SDL_Event evento;
Uint8 *teclas; //nuestro array de teclas
while(!salir)
{
SDL_PumpEvents(); //actualizamos eventos
teclas=SDL_GetKeyState(NULL); // recogemos el estado actual de las teclas en el array teclas.
if(teclas[SDLK_LEFT]) heroex--; //pa la izquierda
else if(teclas[SDLK_RIGHT]) heroex++; //pa la derecha
if(teclas[SDLK_UP]) heroey--; //parriba
else if(teclas[SDLK_DOWN] ) heroey++; pabajo
if(teclas[SDLK_ESC]) salir=1; //ha pulsado ESC
if(SDL_PeepEvents(NULL, 1, SDL_GETEVENT, SDL_QUIT)>=1) //si hay algun evento en la cola que sea SDL_QUIT
salir=1; //pues salgo.
dibuja_heroe (heroex,heroey); //dibuja a nuestro héroe en las coordenadas que queramos
SDL_UpdateRect(.....) //Actualiza pantalla
}
Hitcrasher escribió:tengo una duda muy importante. Tened en cuenta que soy novato novatisimo.
Por mas ke busco solo encuentro SDL_loke sea, pero en ningun lado encuentro ¿ke son las sdl???
FuckingFreaky escribió:Holas...
Sus reiréis de mí porque soy muy novato, pero... se puede utilizar las SDL en un juego programado bajo C++?