[newbies][SDL] CoN FirmA DemoS

Este es tu lugar para hablar de programación, compartir, crear y desarrollar nuevos proyectos

Moderador: Moderadores

[newbies][SDL] CoN FirmA DemoS

Notapor AnimAlf » Jue Mar 29, 2012 4:00 am

Hola,
he preparado un código en el que vamos a poder ver cómo podemos presentar la firma, que veo teneis muy logrado que cada usuario se haga la suya propia.

Como no soy muy buen diseñador, se me ocurrió tras escribir el articulo anteriór, tras ver el mensaje Limpiemos el Foro de :.:yepeto:.:=) pues que siendo uno de los activos, pues que voy a aprovechar su firma para el ejemplo. (Si no te parece bien, pues nada, me los comentas y lo cambio en un momento, con algún garabato que pueda hacer, pero me quedan muy feos los mios. Espero que no te sepa mal).

Bien, pues la idea es la siguiente, coger una firma y sus dimensiones, que servirá de fondo. Este fondo tendrá un scroll, se irá desplazando hacia la izquierda en un loop infinito. (le he quitado el marco blanco)

Imagen

Para animarlo un poco, le he puesto un personaje, uno que encontré en una colección de sprites, por la red, que pertenece a algún videojuego. Con el gimp, cogí los difentes sprite y los puse uno al lado de otro, con el movimiento que van a realizar. Para ello utilicé dos capas, en una estaba la cudrícula, con 18 casilla, y en cada casilla distribuí una posición del personaje. Luego eliminé la capa de la cuadrícula y el resultado es este:

Imagen

Para animarlo me basé en este documento de LosersJuegos

El sprite, no se moverá, más que en la muestra de un cuadro tras otro, que simularán un movimiento. Y aunque no se desplace por la pantalla, como lo que sí que se desplaza es el fondo, simulará un efecto de movimiento.

Para completarla le he añadido un módulo musical. El módulo está en Fasttracker II, les tengo mucho cariño a estos módulos, ya que había muchos trackers a los que les gustaba hacer sus composiciones musicales y sorprendernos con sus creaciones. Esta práctica, supongo que aún está viva, no lo se, pero sería agradable, ver un foro dedicado a ello, si aparece algun@ de esos jovenes genios creadores. Los módulos ocupan muy poco espacio, el que he escogido, ocupa tan sólo 351 Kb. En su interior, contiene los pequeños samples de sonido (e intrumentos), y el codigo y tiempos que con su combinacion nos ofrece la pieza final. Una pieza creada por Aitor Barazon]. Si hay alguien que quiera saber algo sobre estos módulos músicales, puedo intentar, volver a soprenderme de lo mal tracker que soy, je, je, recuerdo una creación que realicé con el "Impulse Tracker", pero recuerso su utilización y he visto proyectos vivos clones de él, como el cheesetracker que ademas posee un editor de samples.

La SDL permiten el trato de sonido con formatos especiales a través de la librería "SDL mixer", es un paquete aparte de la libSDL, que también deberá ser instalada en el sistema, si se quiere desarrollar de este modo.

Entonces, al ejecutable, le deben acompañar varios archivos, todos deberán estar en el mismo directorio. Mas adelante os mostraré como empaquetarlos todos en uno, pero de momento los veremos por separado.

El linkado del ejecutable es dinámico, por lo que hace falta que las librerías dinámicas se encuentren en el sistema en el que se van a ejecutar.

Bien, aquí está el código:
Código: Seleccionar todo
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>

int  init ( SDL_Surface ** );
void procesar_eventos ( int *, int * );
void imprimir ( SDL_Surface *, SDL_Surface *, int, int, int );
int  posFondoX, cargar_imagen ( SDL_Surface **, SDL_Surface ** );
void pinta_fondo ( SDL_Surface *, SDL_Surface * );

int main ( int argc, char * argv[] )
{
  // Inicializa unas cuantas variables
  Mix_Music * musica = NULL;
  SDL_Surface * pantalla, * imagen, * fondo;
  int salir = 0, cuadro = 0, columna = 6, fila = 3;
  posFondoX = 0;

  // Inicializo las SDL
  if ( init ( &pantalla ) )
    return 1;
  // Carga de las dos imagenes que se utilizarán
  if ( cargar_imagen ( &imagen, &fondo ) )
    return 1;

  // Esto no se para que es, ... inicializar el sistema de audio creo.
  if ( Mix_OpenAudio ( 44100, MIX_DEFAULT_FORMAT, 2, 1024 ) == -1 )
    return 1;

  // Inicia la musica
  musica = Mix_LoadMUS ( "aitor.xm" );
  Mix_PlayMusic ( musica, -1 );

  // Inicia un bucle de pintado
  while ( ! salir ) {
    pinta_fondo ( pantalla, fondo );
    cuadro ++;
    if ( cuadro > 16 )
      cuadro = 2;
    imprimir ( pantalla, imagen, cuadro, fila, columna );
    SDL_Flip ( pantalla );
    SDL_Delay ( 150 );
    // Al procesar los eventos, nos desplazarmos por la
    // la cuadrícula del sprite con cuadro
    procesar_eventos ( &salir, &cuadro );
  }

  // Finalizando
  Mix_HaltMusic ();
  Mix_FreeMusic ( musica );
  Mix_CloseAudio ();
  SDL_Quit ();

  return 0;
}

// Inicializa la biblioteca SDL y genera la pantalla principal
int init ( SDL_Surface **pantalla )
{
  if ( SDL_Init ( SDL_INIT_VIDEO ) == -1 )
    return 1;
  *pantalla = SDL_SetVideoMode ( 370, 145, 16, SDL_DOUBLEBUF | SDL_HWSURFACE );
  if ( pantalla == NULL )
    return 1;
  SDL_WM_SetCaption ( "Ejemplo con las Firmas", NULL );

  return 0;
}

// Informa si el programa debe terminar
void procesar_eventos ( int * salir, int * cuadro )
{
  SDL_Event event;
  while ( SDL_PollEvent ( &event ) ) {
    if ( event.type == SDL_QUIT )
      * salir = 1;
    if ( event.type == SDL_KEYDOWN )
      switch ( event.key.keysym.sym ) {
        case SDLK_q:
        case SDLK_ESCAPE:
          * salir = 1;
          break;
        case SDLK_1:
          if ( * cuadro > 0)
            ( * cuadro ) --;
          break;
        case SDLK_2:
          if ( * cuadro < 17 )
            ( * cuadro ) ++;
          break;
        default:
          break;
      }
  }
}

// Pinta el fondo en la pantalla
void pinta_fondo ( SDL_Surface * pantalla, SDL_Surface * fondo )
{
  SDL_Rect destino;
  int i;
  if ( posFondoX <= -370 ) posFondoX = -6; else posFondoX -= 3;
  for( i=0; i<=1; i++ ){
      destino = ( SDL_Rect ) { 370 * i + posFondoX, 0, 0, 0 };
      SDL_BlitSurface ( fondo, NULL, pantalla, &destino );
  }
}

// Cargamos las imagenes
int cargar_imagen ( SDL_Surface ** imagen, SDL_Surface ** fondo )
{
  * imagen = SDL_LoadBMP ( "rejilla.bmp" );
  if ( * imagen == NULL )
    return 1;
  SDL_SetColorKey ( * imagen, SDL_SRCCOLORKEY, \
      SDL_MapRGB ( ( * imagen ) -> format, 255, 255, 255 ) );
  * fondo = SDL_LoadBMP ( "laFirma.bmp" );
  if ( * fondo == NULL )
    return 1;
  return 0;
}

// función que calcula el cuadro a mostrar de la animación
// y dibuja el que corresponde en la pantalla
void imprimir ( SDL_Surface * dst, SDL_Surface * imagen, int cuadro, int fila, int columna )
{
  SDL_Rect srcrect;
  SDL_Rect dstrect = { 110, 25, 0, 0 };
  if ( cuadro > fila * columna || cuadro < 0 )
    return;
  srcrect.w = imagen -> w / columna;
  srcrect.h = imagen -> h / fila;
  srcrect.x = (cuadro % columna) * srcrect.w;
  srcrect.y = (cuadro / columna) * srcrect.h;
  SDL_BlitSurface ( imagen, &srcrect, dst, &dstrect );
}


Aquí os dejo el código fuente, lo acompaña el Makefile por si se quiere compilar en GNU/Linux y el archivo de proyecto para Dev-C++

Para windows también lo he compilado, para que podais ver el resultado, acompañado de las librerias de enlace dinámico.

Archivo dmoSig.zip - suma md5 6b8be04ac01c0c9224c1e0a454658d46

SaludOS
En busca del TuXeR perdido
Avatar de Usuario
AnimAlf
<|:-)
<|:-)
 
Mensajes: 628
Registrado: Mar Ago 08, 2006 4:54 am
Ubicación: tgn

Re: [newbies][SDL] CoN FirmA DemoS

Notapor vlan7 » Lun Abr 02, 2012 12:29 am

uhm

que agradable leer sprite, cuanto tiempo sin escuchar eso... :) Las animaciones se hacian asi, todo mascaras bit a bit, todo un engaño. Los algoritmos de deteccion de colisiones de cualquier juego eran algo guapo porque eran muy costosos, asi que un engaño tambien para ahorrar ciclos de reloj, lo que provocaba el cabreo de los chavales en las maquinas recreativas (si no me ha dado el disparo! si no me choque con la nave!). Habitualmente era verdad el cabreo del jugador, la colision detectada no habia sido tal, pero para la maquina si.

Durante mucho tiempo busque rutinas para hacer scroll, me fascinaba, una vez encontre incluso una que hacia un scroll en modo texto en DOS. Alucinante. En SWAG habia rutinas llamadas "copper bars" que increiblemente te mezclaban el modo texto del DOS con un modo grafico extraño (no era el 320x200x256), fue agradable ver eso, aunque no se yo si funcionara en dosbox, y eso era un engaño tambien. El camino mas corto para ir de un punto a otro en una aventura grafica 2D se calculaba con teoria de grafos (que aburrimiento matematica discreta en la facultad), aunque estas dos cosas no tiene que ver con lo que comentas... pero para enriquecer esto, pero aqui se ha recuperado el mirror de SWAG http://kd5col.info/swag/ Aquello parecia ser el paraiso, ¿como habria podido crearse algo asi? Tambien sobre graficos habia un grupo de demos de Sudafrica en los 90 que se llamaba Asphyxia y los tutos de Denthor, que asi se llamaba el programador, eran jodidamente buenos, excelente codigo ASM incrustado en turbo pascal (hubo gente que despues lo paso a Turbo C). En sucesivas entregas que yo seguia con ansias iba añadiendo mejoras a su rutina putpixel, increiblemente buena acabo siendo... Hubo rumores de unas entregas similares para sonido, pero nunca vieron la luz.

En los 90 hasta las micromanias cuando empezaron a sacar CDs, venian con modulos que enviaba la peña hechos en fasttracker etc, aunque yo nunca tuve el suficiente talento para los MOD.

Gracias maestro,
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: [newbies][SDL] CoN FirmA DemoS

Notapor AnimAlf » Lun Abr 02, 2012 8:04 am

gracias, ya sabes no me engañes, que sólo soy F0r3v3R NeWbI3 y se entiende que no aprenderé nunca, aunque en under se pueda mostrar un poquito de mi ignorancia :)) thnls

:embudito: :embudito: :embudito: pouet.net :embudito: :embudito: :embudito:

SaludOS
En busca del TuXeR perdido
Avatar de Usuario
AnimAlf
<|:-)
<|:-)
 
Mensajes: 628
Registrado: Mar Ago 08, 2006 4:54 am
Ubicación: tgn

Re: [newbies][SDL] CoN FirmA DemoS

Notapor Bebbop » Mar Abr 03, 2012 10:10 pm

Ostras... SWAG ya no me acordaba de esto y las maravillas que se llegaban a hacer con el Turbo Pascal.
Avatar de Usuario
Bebbop
Gran Wadalbertita
Gran Wadalbertita
 
Mensajes: 3424
Registrado: Mié Dic 14, 2005 2:46 pm
Ubicación: El Inframundo

Re: [newbies][SDL] CoN FirmA DemoS

Notapor Newhack » Dom Abr 08, 2012 8:15 pm

Ah! si!, los sprites, je je, que recuerdos. en el pc ya no los pude volver a usar, y es una lástima porque era una idea interesante y muy páctica.
El rey de esto era, creo yo, el C-64, te permitía de forma nativa poner no recuerdo si eran 8 ó 16 sprites monocromos o multicolor
según desearas, tanto sobre pantalla gráfica como de puro texto, :cool: y todo esto con su movimiento, su detección de colisiones y demás.

En cuanto aprendi un poquito me hice incluso un programilla que me permitía manejar los pixels visualmente y no tener que andar
recalculando cada data. :-)

Y como debe ser en una fiera como el commodore, hubo quien se curró el software y sorprendió a los propios fabricantes obteniendo hasta 64 sprites!!.
( what do you say??, thats not posible! ), que se lograban a base de jugar con la detección de raster que tenía el ordenador. :-)

La verdad es que al pasarme al pc los añoré, al igual que algunas otras cosas que ya no podía hacer.
Al menos me consuela que los conocimientos y conceptos adquiridos con ellos no hay pc que los tumbe, y me siguen sirviendo para entender otras cosas.
Avatar de Usuario
Newhack
<|:-D
<|:-D
 
Mensajes: 1865
Registrado: Jue Dic 20, 2007 7:36 pm


Volver a Programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

cron