SDL Simple Direct Media Layer

2,024 views

Published on

2 Comments
3 Likes
Statistics
Notes
  • Muy BUeno, Very good. Very clear and quickly information about SDL. I m using in University in Argentina.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • SDL
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
2,024
On SlideShare
0
From Embeds
0
Number of Embeds
47
Actions
Shares
0
Downloads
0
Comments
2
Likes
3
Embeds 0
No embeds

No notes for slide

SDL Simple Direct Media Layer

  1. 1. SDL Simple Direct Media Layer Carlos Manzanas Navia (revisar)
  2. 2. SDL <ul><ul><ul><li>0. Introducción </li></ul></ul></ul><ul><ul><ul><li>1. Subsistemas: Primer vistazo </li></ul></ul></ul><ul><ul><ul><li>2. Video </li></ul></ul></ul><ul><ul><ul><li>3. Eventos y ventanas. </li></ul></ul></ul><ul><ul><ul><li>4. Audio y CDROM </li></ul></ul></ul><ul><ul><ul><li>5. Joysticks </li></ul></ul></ul><ul><ul><ul><li>6. Hilos (Threads) y Temporizadores. </li></ul></ul></ul><ul><ul><ul><li>7. Librería SDL_net </li></ul></ul></ul><ul><ul><ul><li>A. Referencias </li></ul></ul></ul>
  3. 3. 0 Introducción <ul><li>Conjunto de bibliotecas desarrolladas en C. </li></ul><ul><li>Funciones básicas para realizar dibujado en 2D, efectos de sonido y música, y carga y gestión de imágenes entre otras. </li></ul><ul><li>Características: </li></ul><ul><ul><li>Muy simple. </li></ul></ul><ul><ul><li>Multiplataforma. </li></ul></ul><ul><ul><li>Licencia GNU LGPL. </li></ul></ul><ul><li>- Versión actual 1.2 (depurando 1.3). </li></ul>
  4. 4. 1 Subsistemas: Primer vistazo Visión general <ul><li>SDL está formado por 7 subsistemas. </li></ul>Timers Threads CDROM Audio Joystick Manejador de eventos Video Temporizadores. Programación multi-hilo. Audio y datos de CDROM. Sonido. Control de mandos y joysticks. Control de eventos. Subsistema de video.
  5. 5. 1 Subsistemas: Primer vistazo Visión general
  6. 6. 1 Subsistemas: Primer vistazo Video <ul><li>Estructura principal: superficies (surfaces). </li></ul><ul><li>Además: </li></ul><ul><ul><li>rectángulos, colores, paletas de colores y overlays (para streaming de video). </li></ul></ul><ul><li>Soporta: </li></ul><ul><ul><li>Colores transparentes, alpha blending (superficies translúcidas) y RLE (Run Length Encoding). </li></ul></ul><ul><li>Funciones para cursores de ratón (algo pobres). </li></ul><ul><li>Permite modo ventana o pantalla completa. </li></ul>
  7. 7. 1 Subsistemas: Primer vistazo Manejador de eventos <ul><li>Permite trabajar con eventos en tiempo real. </li></ul><ul><li>Leer el estado del teclado o del ratón. </li></ul>
  8. 8. 1 Subsistemas: Primer vistazo Joystick <ul><li>Todo un subsistema sólo para este tipo de dispositivos. </li></ul><ul><li>Control de: </li></ul><ul><ul><li>Botones, ejes, elevadores, interruptores… </li></ul></ul><ul><li>Las entradas que genera son controladas por el manejador de eventos. </li></ul>
  9. 9. 1 Subsistemas: Primer vistazo CDROM <ul><li>Controla todo tipo de operaciones con el CDROM. </li></ul><ul><li>Abrir, cerrar, reproducir música, obtener información de un cd. </li></ul>
  10. 10. 1 Subsistemas: Primer vistazo Audio <ul><li>Encargado del control de sonido. </li></ul><ul><li>El subsistema más pobre. </li></ul><ul><li>Suele utilizarse la biblioteca SDL_Mixer. </li></ul>
  11. 11. 1 Subsistemas: Primer vistazo Threads <ul><li>Permite programar aplicaciones multi-hilo. </li></ul><ul><li>Semáforos, variables condicionales, mutexes (monitores simples). </li></ul>
  12. 12. 1 Subsistemas: Primer vistazo Temporizador <ul><li>Ofrece funciones para manejar el tiempo. </li></ul><ul><li>Control de ticks de reloj, llamadas periódicas a funciones, contadores… </li></ul>
  13. 13. 1 Subsistemas: Primer vistazo Inicialización
  14. 14. 1 Subsistemas: Primer vistazo Inicialización <ul><li>SDL_Init y SDL_InitSubSystem </li></ul><ul><li>Inicializa los subsistemas que se van a utilizar. </li></ul><ul><ul><li>flags: subsistemas que han de inicializarse. </li></ul></ul><ul><li>SDL_Init primera función a llamar. </li></ul>¿Hilos? ¿Eventos? No necesitan ser inicializados. Uint32 es un tipo de entero de tamaño independiente del sistema. Unsigned: Sin signo Signed: Con signo 8,16,32,64: tamaño en bits.
  15. 15. 1 Subsistemas: Primer vistazo Inicialización <ul><li>SDL_Init y SDL_InitSubSystem </li></ul><ul><li>Ambas funciones devuelven: </li></ul><ul><ul><li>0: todo correcto. </li></ul></ul><ul><ul><li>-1: algo ha ido mal. </li></ul></ul><ul><li>Con SDL_InitSubSystem puedes iniciar subsistemas posteriormente. </li></ul>
  16. 16. 1 Subsistemas: Primer vistazo Inicialización <ul><li>SDL_Quit y SDL_QuitSubSystem </li></ul><ul><ul><li>Generalmente se suele utilizar atexit(SDL_Quit) (funciones void). </li></ul></ul><ul><li>SDL_Quit cierra todos los subsistemas. </li></ul><ul><li>SDL_QuitSubSystem cierra uno (o varios) subsistemas. </li></ul><ul><ul><li>flags- Subsistemas a cerrar. </li></ul></ul>
  17. 17. 1 Subsistemas: Primer vistazo Inicialización <ul><li>SDL_WasInit y SDL_GetError </li></ul><ul><li>SDL_WasInit comprueba si uno o varios subsistemas se han iniciado. </li></ul><ul><ul><li>flags- subsistemas a comprobar. </li></ul></ul><ul><ul><li>Devuelve: </li></ul></ul><ul><ul><ul><li>0 subsistemas no iniciados. </li></ul></ul></ul><ul><ul><ul><li>IDsub subsistemas iniciados. </li></ul></ul></ul>
  18. 18. 1 Subsistemas: Primer vistazo Inicialización <ul><li>SDL_WasInit y SDL_GetError </li></ul><ul><li>SDL_GetError </li></ul><ul><ul><li>Si la llamada a una cualquier función de SDL falla y un valor de error es devuelto (ej: -1 en SDL_Init) se crea una cadena de caracteres en un buffer interno. </li></ul></ul><ul><ul><li>A este buffer se accede con SDL_GetError. </li></ul></ul>
  19. 19. 2 Video Intro <ul><li>7 estructuras distintas para el control de la pantalla. </li></ul><ul><ul><li>SDL_Rect: guarda el tamaño de un rectángulo. </li></ul></ul><ul><ul><li>SDL_Color: guarda información de un color independientemente del formato. </li></ul></ul><ul><ul><li>SDL_Palette: para el uso de paletas de colores. </li></ul></ul><ul><ul><li>SDL_PixelFormat: guarda diversos datos como los bpp, bits por canal o si se está en RGB o usando paletas. </li></ul></ul><ul><ul><li>SDL_Surface: Estructura principal que guarda un bloque rectangular de pixeles. </li></ul></ul><ul><ul><li>SDL_VideoInfo: para examinar las capacidades de un modo de video en particular. </li></ul></ul><ul><ul><li>SDL_Overlay: para streaming de video. </li></ul></ul>
  20. 20. 2 Video SDL_Rect <ul><li>Contiene un área rectangular (de lados horizontales y verticales) definida por un punto, el ancho y el alto. </li></ul><ul><ul><li>x,y: coordenadas del punto (-32768 a 32767). </li></ul></ul><ul><ul><li>w,h: ancho y alto (0 a 65535). </li></ul></ul><ul><li>Ventaja: mover un rectángulo con sólo cambiar x,y. </li></ul>
  21. 21. 2 Video SDL_Rect <ul><li>Sistema de coordenadas y aclaraciones. </li></ul>píxeles rectángulos
  22. 22. 2 Video SDL_Color <ul><ul><li>r,g,b: intensidad de cada componente (0 a 255). </li></ul></ul><ul><ul><li>unused: no usado. </li></ul></ul>
  23. 23. 2 Video SDL_Color <ul><ul><li>r,g,b: intensidad de cada componente (0 a 255). </li></ul></ul><ul><ul><li>unused: no usado. </li></ul></ul><ul><li>RGB </li></ul><ul><li>Espacio tridimensional de color. </li></ul><ul><ul><li>RGB: (0.0 a 1.0) </li></ul></ul><ul><ul><li>SDL_Color: (0 a 255) (256x256x256 colores) </li></ul></ul><ul><li>No todos los modos de videos soportan tantos colores. </li></ul><ul><ul><li>-BPP 24-32: todos los colores (8 bits por eje o mas) </li></ul></ul><ul><ul><li>-BPP 16: bits truncados en cada eje (5,6,5). </li></ul></ul><ul><ul><li>-BPP 8: sólo 256 colores posibles. </li></ul></ul><ul><li>En 8BPP habría que truncar demasiados bits y resultaría muy pobre. En lugar de eso, se suele usar 256 valores de color completos de 24bits cada uno. </li></ul><ul><li>Se mapea cada valor del pixel con uno de estos colores. A esto se le llama ‘color indirection’ (Color LookUp Table CLUT). </li></ul>
  24. 24. 2 Video SDL_VideoInfo Devuelve información sobre el subsistema de video.
  25. 25. 2 Video SDL_PixelFormat <ul><li>BitsPerPixel, BytesPerPixel: nº de bits necesarios para representar un pixel en este formato (8,16,24,33 – 1,2,3,4). </li></ul><ul><li>colorKey: color transparente en el formato actual. </li></ul><ul><li>alpha: píxeles translúcidos. </li></ul><ul><li>El resto de variables se usan para convertir pixeles entre formatos. </li></ul><ul><ul><li>-mask: valor con el cual un pixel es 100% de un primario. </li></ul></ul><ul><ul><li>-shift: coge mask y desplaza bits hasta que en bit0 halla un 1. </li></ul></ul><ul><ul><li>-loss: diferencia entre color en 8bits y color en formato actual. </li></ul></ul>
  26. 26. 2 Video SDL_GetVideoInfo <ul><li>Función que devuelve un puntero tipo SDL_VideoInfo. </li></ul>
  27. 27. 2 Video SDL_Surface <ul><li>Estructura principal. </li></ul><ul><ul><li>flags : informa como se ha creado el surface. </li></ul></ul><ul><ul><li>format : puntero a SDL_PixelFormat que describe el formato de pixeles. </li></ul></ul><ul><ul><li>w,h : ancho y alto. </li></ul></ul><ul><ul><li>pitch : relacionado con el ancho, los BPP y con como la tarjeta de video reserva memoria para las surfaces. </li></ul></ul><ul><ul><li>pixels : puntero al array de pixeles de la superficie. </li></ul></ul><ul><ul><li>clip_rect : SDL_Rect que limita el área de blitting. </li></ul></ul><ul><ul><li>refcount : superficie creada 1 </li></ul></ul><ul><ul><ul><ul><li>superficie liberada 0 </li></ul></ul></ul></ul>
  28. 28. 2 Video SDL_Surface: superficie “pantalla” <ul><li>La superficie principal (display surface) es la primera superficie a crear. </li></ul><ul><li>Para ello se usa la función SDL_SetVideoMode. </li></ul><ul><ul><li>w,h: ancho, alto. </li></ul></ul><ul><ul><li>bpp: bpp. </li></ul></ul><ul><ul><li>flags: información de cómo quieres que se cree la superficie. </li></ul></ul>
  29. 29. 2 Video SDL_Surface: superficie “pantalla” <ul><li>Nota: no todas las opciones serán posibles, pero SDL intentará darlas o emularlas. </li></ul><ul><li>La superficie creada con esta función es liberada con SDL_Quit. </li></ul>
  30. 30. 2 Video SDL_Surface: RGB Surfaces <ul><li>Estas funciones se usan para crear superficies (distinta de la superficie “pantalla”). </li></ul><ul><li>Parámetros comunes a SDL_SetVideoMode como width , height , depth (bpp) y mask . </li></ul><ul><ul><li>flags : SDL_SWSURFACE, SDL_HWSURFACE, SDL_SRCCOLORKEY, SDL_ALPHA. </li></ul></ul><ul><ul><li>pixels : puntero al array de pixels para la superficie. </li></ul></ul>
  31. 31. 2 Video SDL_Surface: RGB Surfaces <ul><li>Estas funciones se usan para crear superficies (distinta de la superficie “pantalla”). </li></ul><ul><li>Parámetros comunes a SDL_SetVideoMode como width , height , depth (bpp) y mask . </li></ul><ul><ul><li>flags : SDL_SWSURFACE, SDL_HWSURFACE, SDL_SRCCOLORKEY, SDL_ALPHA. </li></ul></ul><ul><ul><li>pixels : puntero al array de pixels para la superficie. </li></ul></ul><ul><li>Devuelven NULL o un puntero tipo SDLSurface. </li></ul>Raramente usadas.
  32. 32. 2 Video SDL_Surface: RGB Surfaces <ul><li>Función que libera la memoria correspondiente a una superficie. </li></ul><ul><ul><li>surface: puntero a la superficie que se quiere liberar. </li></ul></ul>
  33. 33. 2 Video SDL_Surface: Bitmaps <ul><li>Función que carga la información de un archivo bmp en una surface. </li></ul><ul><ul><li>file : archivo que se quiere cargar. </li></ul></ul><ul><li>Devuelve: </li></ul><ul><ul><li>un puntero a una nueva superficie que contiene el bitmap. </li></ul></ul><ul><ul><li>NULL (error). </li></ul></ul><ul><li>NOTA: Muy limitada. Se suele usar la biblioteca SDL_image para tener opción de cargar otros formatos (jpg, gif, png, …) </li></ul>
  34. 34. 2 Video SDL_Surface: Conversión <ul><li>Necesario cuando tenemos dos superficies en formatos distintos. </li></ul><ul><li>SDL_ConvertSurface convierte una superficie en otra con un nuevo formato: </li></ul><ul><ul><li>src: puntero a la superficie a convertir. </li></ul></ul><ul><ul><li>fmt: puntero a SDL_PixelFormat con el nuevo formato. </li></ul></ul><ul><ul><li>flags: SDL_SWSURFACE, SDL_HWSURFACE, SDL_SRCCOLORKEY, SDL_ALPHA. </li></ul></ul><ul><li>SDL_DisplayFormat devuelve un puntero a una nueva superficie con el mismo formato de la superficie “pantalla” (mucho más interesante). </li></ul><ul><ul><li>surface: superficie a convertir. </li></ul></ul>Liberar la superficie antigua.
  35. 35. 2 Video Trabajando con superficies <ul><li>Hay 3 modos principalmente: </li></ul><ul><ul><li>Rectángulos rellenos (de un solo color). </li></ul></ul><ul><ul><li>Manejando píxeles individualmente. </li></ul></ul><ul><ul><li>Blitting. </li></ul></ul><ul><li>Nota Blitting : básicamente es pasar el bloque de píxeles de una superficie a otra superficie. </li></ul>
  36. 36. 2 Video Trabajando con superficies: rectángulos rellenos <ul><li>Función que rellena un rectángulo dentro de una superficie de un color. </li></ul><ul><ul><li>dst: puntero a la superficie en la que quieres dibujar el rectángulo. </li></ul></ul><ul><ul><li>dstrect: puntero SDL_Rect con el rectángulo que quieres rellenar. </li></ul></ul><ul><ul><li>color: el color a usar en el formato de píxeles nativo. </li></ul></ul><ul><li>Función que convierte un SDL_Color al formato nativo. </li></ul><ul><ul><li>fmt: puntero a un SDL_PixelFormat. </li></ul></ul><ul><ul><li>r,g,b: componentes RGB. </li></ul></ul>
  37. 37. 2 Video Trabajando con superficies: pixeles <ul><li>Para trabajar pixel a pixel, es necesario seguir 4 pasos: </li></ul><ul><ul><li>1: Determinar si la superficie necesita bloquearse. </li></ul></ul><ul><ul><li>2: Bloquear si es necesario. </li></ul></ul><ul><ul><li>3: Manipular los datos. </li></ul></ul><ul><ul><li>4: Desbloquear la superficie. </li></ul></ul><ul><li>El bloqueo es necesario dependiendo si la superficie está alojada en memoria principal o en video. </li></ul>Usado para crear funciones de primitivas, ya que SDL no tiene.
  38. 38. 2 Video Trabajando con superficies: Blitting <ul><li>Función que transfiere el contenido de una superficie a otra (Block Transfer). </li></ul><ul><ul><li>src: puntero a superficie fuente. </li></ul></ul><ul><ul><li>srcrect: puntero SDL_Rect que delimita el rectángulo que se quiere copiar. </li></ul></ul><ul><ul><li>dst: puntero a la superficie destino. </li></ul></ul><ul><ul><li>dstrect: puntero SDL_Rect que delimita el rectángulo destino donde se va a copiar. </li></ul></ul><ul><li>Devuelve: </li></ul><ul><ul><li>0 todo bien. </li></ul></ul><ul><ul><li>-1 error. </li></ul></ul>
  39. 39. 2 Video Transparencias (colorKey) <ul><li>Función que establece un color que se ignora al realizar blitting (suele elegirse magenta 1,0,1) </li></ul><ul><ul><li>surface : puntero a la superficie para la cual se quiere establecer la transparencia. </li></ul></ul><ul><ul><li>flags : </li></ul></ul><ul><ul><ul><li>0: elimina la transparencia de la superficie. </li></ul></ul></ul><ul><ul><ul><li>SDL_SRCCOLORKEY: establece un color transparente. Key guarda el color en formato nativo. </li></ul></ul></ul><ul><ul><ul><li>SDL_SRCCOLORKEY|SDL_RLEACCEL: establece un color transparente y configura la superficie para que realice blitting más rápido. </li></ul></ul></ul><ul><ul><li>key : valor del color transparente en formato nativo. </li></ul></ul>
  40. 40. 2 Video Clipping areas <ul><li>Se puede especificar un rectángulo como la única zona en la que se puede “escribir” dentro de la pantalla (útil para marcadores, zonas de texto, armas…) </li></ul><ul><ul><li>surface: puntero a la superficie en la cual estás estableciendo el área de clipping. </li></ul></ul><ul><ul><li>rect: rectángulo que delimita el área de clipping (NULL para toda la sup). </li></ul></ul>
  41. 41. 2 Video Paletas <ul><li>Es una manera de usar “color indirection” para superficies de 8 bits. </li></ul><ul><ul><li>ncolors: nº de colores. </li></ul></ul><ul><ul><li>colors: puntero a un array de variables SDL_Color con los colores de la paleta. </li></ul></ul>
  42. 42. 2 Video Paletas <ul><li>Función que establece una paleta de colores en una superficie. </li></ul><ul><ul><li>surface: puntero a una superficie en la cual quieres establecer la paleta. </li></ul></ul><ul><ul><li>flags: SDL_LOGPAL, SDL_PHYSPAL. </li></ul></ul><ul><ul><li>colors: puntero al array de colores SDL_Color. </li></ul></ul><ul><ul><li>firstcolor: primer color de la paleta. </li></ul></ul><ul><ul><li>ncolors: nº de colores de la paleta. </li></ul></ul>
  43. 43. 2 Video Actualizar pantalla <ul><li>Dos maneras: </li></ul><ul><ul><li>Actualizando zonas (rectángulos) de la pantalla. </li></ul></ul><ul><ul><li>Haciendo doble buffering. </li></ul></ul>
  44. 44. 2 Video Alpha blending <ul><li>Consiste en darla cierta transparencia a las superficies (no confundir con colorKey). </li></ul><ul><li>Incluso si el hardware no lo soporta, SDL intentará emularlo. </li></ul><ul><li>Útil para diversos efectos como fading, cristales, fantasmas, … </li></ul><ul><li>El valor de alpha va de 0% a 100%. </li></ul><ul><li>En SDL, el valor va de 0 (transparente) a 255 (opaca). </li></ul>
  45. 45. 2 Video Alpha blending <ul><li>Función que establece un valor alpha para una superficie. </li></ul><ul><ul><li>surface : superficie sobre la cual quieres establecer un valor alpha. </li></ul></ul><ul><ul><li>flag : </li></ul></ul><ul><ul><ul><li>SDL_SRCALPHA para poner o quitar el alpha. </li></ul></ul></ul><ul><ul><ul><li>SDL_RLEACCEL para optimización en el blitting. </li></ul></ul></ul><ul><ul><li>alpha : valor de 0 a 255 para el alpha. </li></ul></ul><ul><li>Se pueden establecer valores alpha pixel a pixel mediante las funciones SDL_CreateRGBSurface y SDL_CreateRGBSurfaceFrom cambiando los valores de la máscara alpha (Amask). </li></ul>
  46. 46. 2 Video Alpha blending <ul><li>Función que optimiza una superficie para hacer blitting más rápidamente en la superficie “pantalla”. </li></ul><ul><li>NOTA: hay que usar esta función en lugar de SDL_DisplayFormat si se quiere optimizar una superficie que contenga alpha o colorKey. </li></ul>
  47. 47. 2 Video Overlays <ul><li>Estructura para reproducir video sobre una superficie. </li></ul><ul><ul><li>format: ver tabla. </li></ul></ul><ul><ul><li>w,h: ancho, alto. </li></ul></ul><ul><ul><li>planes: nº de bitplanes. </li></ul></ul><ul><ul><li>pitches: array que guarda el pitch de cada plano. </li></ul></ul><ul><ul><li>pixels: array de punteros para los planos. </li></ul></ul>
  48. 48. 2 Video Overlays <ul><li>Funciones para crear, liberar y mostrar overlays. </li></ul><ul><ul><li>width , height: ancho, alto. </li></ul></ul><ul><ul><li>format : ver tabla. </li></ul></ul><ul><ul><li>display : superficie sobre la que se mostrará el overlay. </li></ul></ul><ul><ul><li>overlay : puntero al overlay a eliminar o mostrar. </li></ul></ul><ul><ul><li>dstrect : puntero SDL_Rect con el rectángulo a mostrar del overlay ( NULL para overlay completo). </li></ul></ul>
  49. 49. 3 Eventos y ventanas Intro <ul><li>Evento: Algo que ocurre en el ordenador ante lo que quieras reacionar (pulsar una tecla, mover el ratón, minimizar la ventana…). </li></ul><ul><li>Tipos: </li></ul><ul><ul><li>Teclado </li></ul></ul><ul><ul><ul><li>Presionar tecla y soltar tecla. </li></ul></ul></ul><ul><ul><ul><li>Información sobre qué tecla, scancode, ascii o unicode, “shift keys” (shift, control, alt, …). </li></ul></ul></ul><ul><ul><li>Ratón </li></ul></ul><ul><ul><ul><li>Movimiento, click, unclick. </li></ul></ul></ul><ul><ul><ul><li>Información sobre qué botón, posición relativa y absoluta. </li></ul></ul></ul><ul><ul><li>Joystick </li></ul></ul><ul><ul><ul><li>Ejes, botones, “hats”, “trackball”. </li></ul></ul></ul><ul><ul><li>Sistema </li></ul></ul>
  50. 50. 3 Eventos y ventanas Intro <ul><li>Métodos de obtener información: </li></ul><ul><li>Espera (waiting). </li></ul><ul><ul><li>No muy usada en la mayoría de los juegos. </li></ul></ul><ul><ul><li>¿Editores de niveles? </li></ul></ul><ul><li>Consulta constante (polling). </li></ul><ul><ul><li>La más usada. </li></ul></ul><ul><li>Consulta directa (direct). </li></ul><ul><ul><li>Peligrosa (pérdidas). </li></ul></ul>
  51. 51. 3 Eventos y ventanas Teclado <ul><ul><li>type : SDL_KEYPRESSED o SDL_KEYRELEASED. </li></ul></ul><ul><ul><li>state : duplicado de type. </li></ul></ul><ul><ul><li>keysym : </li></ul></ul><ul><ul><ul><li>scancode : codigo dependiente del hardware (evitar). </li></ul></ul></ul><ul><ul><ul><li>sym : código SDL correspondiente a la tecla. </li></ul></ul></ul><ul><ul><ul><li>mod : modificador para teclas especiales (shift, control, alt, …). </li></ul></ul></ul><ul><ul><ul><li>unicode : código ascii o unicode de la tecla (activar). </li></ul></ul></ul>1: activar 0: desactivar -1:devuelve estado
  52. 52. 3 Eventos y ventanas Teclado
  53. 53. 3 Eventos y ventanas Teclado
  54. 54. 3 Eventos y ventanas Ratón: movimiento <ul><ul><li>type : SDL_MOUSEMOTION. </li></ul></ul><ul><ul><li>state : indica el estado de los botones del ratón (flags). </li></ul></ul><ul><ul><li>x,y : posición absoluta del ratón. </li></ul></ul><ul><ul><li>xrel,yrel : posición relativa desde el último evento. </li></ul></ul>
  55. 55. 3 Eventos y ventanas Ratón: botones <ul><ul><li>type : SDL_MOUSEBUTTONDOWN o SDL_MOUSEBUTTONUP. </li></ul></ul><ul><ul><li>button : </li></ul></ul><ul><ul><ul><li>SDL_BUTTONLEFT </li></ul></ul></ul><ul><ul><ul><li>SDL_BUTTONRIGHT </li></ul></ul></ul><ul><ul><ul><li>SDL_BUTTONMIDDLE. </li></ul></ul></ul><ul><ul><li>state : SDL_PRESSED o SDL_RELEASED (similar a type). </li></ul></ul><ul><ul><li>x,y : posición absoluta del ratón. </li></ul></ul>
  56. 56. 3 Eventos y ventanas Joystick <ul><li>type : </li></ul><ul><ul><li>Axis: SDL_JOYAXISMOTION. </li></ul></ul><ul><ul><li>Botón: </li></ul></ul><ul><ul><ul><li>SDL_JOYBUTTONDOWN </li></ul></ul></ul><ul><ul><ul><li>SDL_JOYBUTTONUP. </li></ul></ul></ul><ul><ul><li>Hat: SDL_JOYHATMOTION. </li></ul></ul><ul><ul><li>Ball: SDL_JOYBALLMOTION. </li></ul></ul><ul><li>which : id del joystick (para varios). </li></ul><ul><li>axis : ejes que se han movido. </li></ul><ul><li>value : nuevo valor. </li></ul><ul><li>button : botón que se ha pulsado. </li></ul><ul><li>state : SDL_PRESSED o SDL_RELEASED. </li></ul><ul><li>hat : id del hat. </li></ul><ul><li>ball : id del ball. </li></ul><ul><li>xrel,yrel : posiciones relativas x e y. </li></ul>
  57. 57. 3 Eventos y ventanas Sistema: Quit y Expose <ul><li>Evento Quit: terminar aplicación. </li></ul><ul><li>Evento Expose: redibujar aplicación. </li></ul><ul><ul><li>tipe : </li></ul></ul><ul><ul><ul><li>SDL_QUIT. </li></ul></ul></ul><ul><ul><ul><li>SDL_VIDEOEXPOSE. </li></ul></ul></ul>
  58. 58. 3 Eventos y ventanas Sistema: Resize y activation <ul><li>Redimensionado de ventana. </li></ul><ul><ul><li>- type : SDL_VIDEORESIZE </li></ul></ul><ul><ul><li>- w,h: nuevo tamaño ancho y alto. </li></ul></ul><ul><li>Cuando la aplicación gana o pierde el control. </li></ul><ul><ul><li>- type : SDL_ACTIVEEVENT </li></ul></ul><ul><ul><li>gain: </li></ul></ul><ul><ul><ul><li>0: perdido </li></ul></ul></ul><ul><ul><ul><li>1: ganado </li></ul></ul></ul><ul><ul><li>state: </li></ul></ul><ul><ul><ul><li>Ratón: SDL_APPMOUSEFOCUS </li></ul></ul></ul><ul><ul><ul><li>Teclado: SDL_APPINPUTFOCUS </li></ul></ul></ul><ul><ul><ul><li>Minimizar, restaurar: SDL_APPACTIVE </li></ul></ul></ul>
  59. 59. 3 Eventos y ventanas Sistema: usuario <ul><li>Para definir eventos propios. </li></ul><ul><ul><li>- type : desde SDL_USEREVENT hasta SDL_NUMEVENTS-1 </li></ul></ul><ul><ul><li>- resto de campos: a definir. </li></ul></ul>
  60. 60. 3 Eventos y ventanas Estructura principal <ul><li>Estructura principal union de todos los tipos. </li></ul><ul><ul><li>- type : tipo de evento. </li></ul></ul>
  61. 61. 3 Eventos y ventanas Métodos de obtener información: Waiting <ul><li>Devuelve: </li></ul><ul><ul><li>1: se guarda el evento en event. </li></ul></ul><ul><ul><li>0: error. </li></ul></ul>
  62. 62. 3 Eventos y ventanas Métodos de obtener información: Polling <ul><li>Típico para juegos. </li></ul><ul><li>Devuelve: </li></ul><ul><ul><li>1: se guarda el evento en event. </li></ul></ul><ul><ul><li>0: nada. </li></ul></ul>
  63. 63. 3 Eventos y ventanas Métodos de obtener información: Directo <ul><li>numkeys: puntero a un entero con el número de teclas que quieres mirar. </li></ul><ul><li>Devuelve un 1 si está activo y 0 si no en cada posición de un array de indices SDLK_*. </li></ul><ul><li>-Devuelve combinación de flags. </li></ul><ul><li>-Devuelve combinación de flags. </li></ul>
  64. 64. 3 Eventos y ventanas Administrador de ventana <ul><li>Título de la ventana del programa. </li></ul><ul><ul><li>title: puntero a una cadena de caracteres con el título. </li></ul></ul><ul><ul><li>icon: puntero a una cadena de caracteres con el título (aplicación minimizada). </li></ul></ul><ul><li>Icono del programa. </li></ul><ul><ul><li>icon: puntero a un SDL_Surface (32x32 pixels). </li></ul></ul><ul><ul><li>mask: enmascarar (NULL – icono entero). </li></ul></ul>
  65. 65. 4 Audio y CDRom Estructuras audio: SDL_AudioSpec <ul><li>Información sobre el audio: </li></ul><ul><li>freq: frecuendia del audio en samples por segundo (11025, 22050, 44100) </li></ul><ul><li>format: formato del sonido (ver tabla). </li></ul><ul><li>channels: 1 mono, 2 stereo. </li></ul><ul><li>silence: genera silencios cuando se escribe en el buffer. </li></ul><ul><li>samples: tamaño del buffer de audio en samples. </li></ul><ul><li>size: tamaño del buffer de audio en bytes. </li></ul><ul><li>callback: puntero a una función definida por el usuario. </li></ul><ul><li>userdata: puntero a los datos que se pasarán a la función callback. </li></ul>
  66. 66. 4 Audio y CDRom Estructuras audio: SDL_AudioSpec
  67. 67. 4 Audio y CDRom Funciones open, pause, close <ul><li>Función para preparar el subsistema: </li></ul><ul><li>*desired: puntero tipo SDL_AudioSpec con la información del audio que deseas obtener. </li></ul><ul><li>*obtained: puntero tipo SDL_AusiSpec con la información del audio del sistema. (NULL y SDL emulará lo mejor que pueda para obtener *desired). </li></ul><ul><li>Devuelve 0 si todo correcto, o -1 si hay error. </li></ul>Función para cerrar. <ul><li>Función para iniciar y detener el sonido: </li></ul><ul><li>pause_on: 1 pausado, 0 no pausado. </li></ul>
  68. 68. 4 Audio y CDRom Archivos wav <ul><li>Carga un archivo wav en una estructura tipo SDL_AudioSpec: </li></ul><ul><li>file: puntero tipo string con el nombre del archivo que quieres cargar. </li></ul><ul><li>spec: puntero tipo SDL_AudioSpec que la función rellenará con información acerca del sonido cargado. </li></ul><ul><li>audio_buf: puntero tipo entero que recibirá un puntero con los datos de audio para el sonido. </li></ul><ul><li>audio_len: puntero tipo entero con el tamaño de los datos de audio_buf en bytes. </li></ul>Para liberar los datos de un archivo wav.
  69. 69. 4 Audio y CDRom Conversión y mezcla Requieren conocimientos avanzados sobre sonido.
  70. 70. 4 Audio y CDRom Estructuras CDRom <ul><li>Contiene información sobre el CD: </li></ul><ul><li>id: identificador para el CDROM. </li></ul><ul><li>status: estado del CD (ver tabla). </li></ul><ul><li>numtracks: cuantas pistas contiene el CD. </li></ul><ul><li>cur_track: track que se está reproduciendo. </li></ul><ul><li>cur_frame: frame que se está reproduciendo (frame: unidad más pequeña de información). </li></ul><ul><li>track: puntero tipo SDL_CDTrack con información sobre todas las pistas del CD. </li></ul>
  71. 71. 4 Audio y CDRom Estructuras CDRom
  72. 72. 4 Audio y CDRom Estructuras CDRom <ul><li>Información sobre las pistas del CD: </li></ul><ul><li>id: número de pista (0-99). </li></ul><ul><li>type: SDL_AUDIO_TRACK, SDL_DATA_TRACK. </li></ul><ul><li>length: duración de la pista (frames). </li></ul><ul><li>offset: inicio de la pista (frames). </li></ul><ul><li>Para hacer los cálculos en segundos, dividir por la constante SDL_FPS (frames per second). </li></ul>
  73. 73. 4 Audio y CDRom Funciones CDRom: información Devuelve el número de pistas del CD. Devuelve el nombre de la unidad de CD, pasándole el id. (drive 0, default). Pasándole el id, devuelve un puntero tipo SDL_CD con información sobre el CD. Libera un puntero SDL_CD. Coge un puntero tipo SDL_CD y devuelve el estado actual (tabla anterior).
  74. 74. 4 Audio y CDRom Funciones CDRom: play, stop, pause… Detiene la reproducción de un CD, pasándole un puntero tipo SDL_CD. Devuelve 0 o -1(error). <ul><li>Reproduce el contenido de un CD, devolviendo 0 o -1(error): </li></ul><ul><li>cdrom: puntero tipo SDL_CD con la información del CD. </li></ul><ul><li>start: entero con el frame en el que quieres empezar. </li></ul><ul><li>length: entero con la duración de la reproducción. </li></ul>
  75. 75. 4 Audio y CDRom Funciones CDRom: play, stop, pause… <ul><li>Reproduce el contenido de un CD, devolviendo 0 o -1(error): </li></ul><ul><li>cdrom: puntero a estructura SDL_CD. </li></ul><ul><li>start_track: pista en la que se quiere comenzar. </li></ul><ul><li>start_frame: frame en el que se quiere comenzar (relativo a la pista: 0 inicio). </li></ul><ul><li>ntracks: número de pistas que se quieres reproducir. </li></ul><ul><li>nframes: número de frames que se quieren reproducir de la última pista. </li></ul>Devuelven 0 o -1(error).
  76. 76. 5 Joysticks Intro Subsistema para el manejo de todo tipo de controladores de juegos (excepto ratón y teclado).
  77. 77. 5 Joysticks Intro 1: palanca (eje principal). 2: base. 3: gatillo. 4: botones adicionales. 5: botón adicional (auto). 6: palanca adicional (eje adicional). 7: botón direccional (hat). 8: ventosa.
  78. 78. 5 Joysticks Información Devuelve el número de joysticks conectados. Pasándole un número de dispositivo (de 0 a SDL_NumJoysticks-1), devuelve un string con el nombre del joystick. Abre el acceso a un joystick pasado por parámetro, devolviendo un puntero tipo SDL_Joystick (manejado internamente por SDL, no es necesario conocer su estructura). Libera el acceso a un joystick. Devuelve 0 o 1 (acceso a joystick abierto).
  79. 79. 5 Joysticks Información Devuelven un entero con el número de elementos de ese tipo del joystick.
  80. 80. 6 Hilos (Threads) y temporizadores Intro <ul><li>Este subsistema ofrece herramientas para el control del tiempo y para programación concurrente o multi-hilo. </li></ul><ul><li>5 Tipos de entidades: </li></ul><ul><ul><li>Thread (hilo) </li></ul></ul><ul><ul><li>Timer (temporizador) </li></ul></ul><ul><ul><li>Mutex (semáforos con dos estados, bloqueado o desbloqueado). </li></ul></ul><ul><ul><li>Semaphore (semáforo) </li></ul></ul><ul><ul><li>Condition variable (variable condicional que manda señales a mutexes). </li></ul></ul>
  81. 81. 6 Hilos (Threads) y temporizadores Timers <ul><li>Crea un temporizador alojado en SDL_TimerID: </li></ul><ul><li>interval: número de milisegundos que deben pasar entre cada llamada a la función. </li></ul><ul><li>callback: puntero a la función a la que se llamará en cada intervalo. </li></ul><ul><li>param: puntero a los datos que la función necesite en cada llamada. </li></ul><ul><li>Función de llamada (el nombre es de ejemplo) que devuelve un intervalo. </li></ul><ul><li>interval: el intervalo actual que usa la función. </li></ul><ul><li>param: mismo puntero que se pasa a SDL_AddTimer. </li></ul>
  82. 82. 6 Hilos (Threads) y temporizadores Timers Devuelve el número de milisegundos desde que se inicializó la librería SDL_TIMER. Detiene la ejecución del programa ms milisegundos.
  83. 83. 6 Hilos (Threads) y temporizadores Threads <ul><li>Crea un nuevo hilo devuelto como un puntero tipo SDL_Thread: </li></ul><ul><li>fn: puntero a una función que prepare el hilo. </li></ul><ul><li>data: puntero a los datos pasados a la función. </li></ul><ul><li>Función del hilo (el nombre es de ejemplo) creada por el usuario: </li></ul><ul><li>data: puntero con los datos que necesite la función. </li></ul>Función que destruye un hilo tipo SDL_Thread pasado como puntero en thread. Detiene el programa hasta que termine el tread. El valor que devuelve se almacena como puntero en status.
  84. 84. 6 Hilos (Threads) y temporizadores Threads Devuelve un entero con el identificador de el hilo (dentro del hilo). Devuelve un entero con el identificador del hilo (fuera del hilo). Hay que pasarle el puntero del hilo como parámetro.
  85. 85. 6 Hilos (Threads) y temporizadores Mutexes Un mutex, una vez creado, tiene dos estados: bloqueado y desbloqueado. Una vez que un mutex es bloqueado, nada puede volverlo a bloquear hasta que esté desbloqueado. Crea un mutex, devuelto como puntero tipo SDL_mutex. Destruye el mutes pasado como puntero tipo SDL_mutex en mutex.
  86. 86. 6 Hilos (Threads) y temporizadores Mutexes <ul><li>Dependiendo del estado del mutex (pasado como puntero): </li></ul><ul><li>Bloqueado: espera hasta que el mutex sea desbloqueado. Entonces lo bloquea y termina. </li></ul><ul><li>Desbloqueado: Bloquea al mutex y termina. </li></ul>Desbloquea un mutex previamente bloqueado (tb SDL_UnlockMutex).
  87. 87. 6 Hilos (Threads) y temporizadores Semáforos Devuelve un puntero a un semáforo tipo SDL_sem, pasándole un valor inicial en initial_value. Destruye un semáforo previamente creado. La función espera hasta que el semáforo pasado por parámetro tenga un valor positivo, entonces lo decrementa y sale. Similar a la anterior, sin espera. Devuelve 0 o -1(error).
  88. 88. 6 Hilos (Threads) y temporizadores Semáforos Incrementa el valor de un semáforo. Devuelve el valor de un semáforo.
  89. 89. 6 Hilos (Threads) y temporizadores Variables condicionales Crea una variable condicional devuelta como un puntero tipo SDL_cond. Destruye una variable condicional pasada en cond. Funciones de espera para las variables condicionales. Ambas desbloquean un mutex que debe de estar previamente bloqueado. Ambas mandan una señal a una o varias variables condicionales. La primera desbloquea el primer mutex esperando por la variable. La segunda, desbloquea todos.
  90. 90. Librería SDL_net Intro <ul><li>SDL_net es una librería adicional para facilitar la programación en red. </li></ul><ul><li>Maneja tres estructuras básicas: </li></ul><ul><li>Direcciones IP </li></ul><ul><ul><ul><ul><li>Contiene la dirección del sistema con el que se está en comunicación. </li></ul></ul></ul></ul><ul><ul><ul><li>TCP Sockets </li></ul></ul></ul><ul><ul><ul><ul><li>Un socket se define por una dirección ip, un protocolo de comunicación (TCP en este caso) y un puerto. </li></ul></ul></ul></ul><ul><ul><ul><li>UDP Sockets </li></ul></ul></ul><ul><ul><ul><ul><li>Similares a los TCP Sockets (no garantizan la entrega de los paquetes en el orden que fueron enviados). </li></ul></ul></ul></ul>
  91. 91. Librería SDL_net Inicialización Función para inicializar la librería. Devuelve 0 o -1(error). Fución para cerrar la librería.
  92. 92. Librería SDL_net IPAddress <ul><ul><li>host: direccion ipv4. </li></ul></ul><ul><ul><li>port: puerto con el que se quiere comunicar. </li></ul></ul><ul><li>Función para resolver una dirección ip: </li></ul><ul><ul><li>address: puntero vacío que es devuelto por la función con un puntero tipo IPaddress correspondiente a las dirección y puerto de host y port. </li></ul></ul><ul><ul><li>host: puntero tipo string con la dirección con la que se quiere conectar (tipo xxx.xxx.xxx.xxx o www.blablabla.bla ) </li></ul></ul><ul><ul><li>port: puerto con el que se quiere conectar. </li></ul></ul>
  93. 93. Librería SDL_net IPAddress <ul><li>Función que devuelve un string con la dirección correspondiente a una direccion ip: </li></ul><ul><ul><li>ip: puntero tipo IPaddress que contiene la dirección ip. </li></ul></ul>
  94. 94. Librería SDL_net TCPSocket Estructura para almacenar de manera abstracta una conexión con un equipo (socket). Funciones para abrir y cerrar sockets. Tipos de sockets: servidor y cliente . Los sockets servidor sólo escuchan peticiones de otros equipos. Los sockets cliente envían datos.
  95. 95. Librería SDL_net TCPSocket Función que necesita un TCPsocket servidor (server) y que devuelve una conexión al sistema remoto que previamente usó SDL_TCP_Open. Función que devuelve la dirección de un sistema con el que se ha conectado mediante un puntero tipo IPaddress. Necesita un socket (sock) de tipo TCPsocket como parámetro.
  96. 96. Librería SDL_net TCPSocket <ul><li>Función para enviar datos a través de un socket. Devuelve la cantidad de datos enviados (si no coincide con len, error): </li></ul><ul><ul><li>sock: socket cliente a través del que se quiere comunicar. </li></ul></ul><ul><ul><li>data: puntero con los datos que se quieren mandar. </li></ul></ul><ul><ul><li>len: tamaño de los datos a mandar. </li></ul></ul><ul><li>Función que recive datos de otro sistema con el que se ha conectado previamente. Devuelve la cantidad de datos que se han leído: </li></ul><ul><ul><li>sock: socket cliente a través del cual se quiere recibir los datos. </li></ul></ul><ul><ul><li>data: puntero con el buffer de datos. </li></ul></ul><ul><ul><li>maxlen: tamaño máximo del buffer de datos. </li></ul></ul>
  97. 97. Librería SDL_net TCPSocket Servidor Inicializar SDL_net Establecer puerto de escucha Abrir socket hacia ese puerto Aceptar una conexión Recibir los datos Hacer algo con los datos Limpiar y salir Cliente Inicializar SDL_net Resolver la dirección del servidor Abrir un socket Leer datos del usuario Mandar los datos Limpiar y salir
  98. 98. A Referencias Simple Direct Media Layer http://libsdl.org SDL_image http://libsdl.org/projects/SDL_image SDL_net http://libsdl.org/projects/SDL_net SDL_ttf http://libsdl.org/projects/SDL_ttf SDL_mixer http://libsdl.org/projects/SDL_mixer Lazy Foo Productions http://lazyfoo.net/SDL_tutorials/index.php Dev Hub http://www.sdltutorials.com/ Tutorial-Wiki SDL http://softwarelibre.uca.es/wikijuegos/Portada Focus On SDL The Premier Press Game Development Series Ernest Pazera

×