Progrmacion 3D S
Este código lo creé por la necesidad de unir automáticamente las imágenes que se pueden encontrar aquí para utilizarlas en el 3dgs como sprites animados.
|
#include <acknex.h>
#define Cantidad_Cuadros 33 // Número de imágnes#define Paso_Animacion 75 // Anchura de cada cuadro de animación
#define Base_Altura 100 // Altura de cada cuadro de animación
#define STR_Archivo "roda_frog" // Nombre base de los archivos de imágenes
function main ()
{
video_set ( sys_metrics(0), sys_metrics(1), 32, 1 ); // Resolución de escritorio
var Contador = 0, i, ii; // Contadores BMAP* Base = bmap_createblack ( Paso_Animacion*Cantidad_Cuadros, Base_Altura, 32 ); // Imagen donde se irá añadiendo cada cuadro
BMAP* Trozo = bmap_createblack ( Paso_Animacion , Base_Altura , 32 ); // Imagen donde se copiará cada archivo
BMAP* Precarga; //Imagen donde se cargará cada imagen para conocer sus dimensiones
STRING* Nombre = "#40"; // Cadena de texto para nombres de archivos COLOR Color_Base; // Color del pixel superior izquierdo de ña primera imagen
COLOR Color_Pixel; // Color para lectura de pixeles
var Pixel; // Variable para puntero a pixel
var Formato; // Variable para guardar el formato de las imágenes
while ( Contador<Cantidad_Cuadros )
{
Contador ++;
str_cpy ( Nombre, STR_Archivo ); // Generar nombre de la imagen según el contador
if ( Contador < 1000 ) str_cat ( Nombre, "0" );
if ( Contador < 100 )
str_cat ( Nombre, "0" );
if ( Contador < 10 )
str_cat ( Nombre, "0" );
str_cat_num ( Nombre, "%.0f", Contador );
str_cat ( Nombre, ".bmp" );
Precarga = bmap_create ( Nombre ); // Cargar imagen para utilizar sus dimensiones bmap_load ( Trozo, Nombre, 1 ); // Copiar imagen desde .bmp indexado
if ( Contador == 1 ) // Hallar color del pixel superior izquierdo de la primera imagen
{
Formato = bmap_lock ( Trozo, 0 );
Pixel = pixel_for_bmap( Trozo, 0, 0 );
pixel_to_vec ( Color_Base, NULL, Formato, Pixel); bmap_fill ( Base, Color_Base, 100 ); // Colorear el fondo del mismo color que la base de las imagenes originales
bmap_unlock ( Trozo );
}
bmap_blit ( Base, Trozo, vector(((Contador-1)*Paso_Animacion)+integer(Paso_Animacion/2)-integer(bmap_width(Precarga)/2),Base_Altura-bmap_height(Precarga),0), vector(bmap_width(Trozo),bmap_height(Trozo),0) ); // Copiar a imagen base
}
Formato = bmap_lock ( Base, 0 ); // Generar Canal Alfa
for ( i=0; i<Paso_Animacion*Cantidad_Cuadros; i++ )
{
for ( ii=0; ii<Base_Altura; ii++ )
{
Pixel = pixel_for_bmap( Base, i, ii );
pixel_to_vec ( Color_Pixel, NULL, Formato, Pixel);
if ( vec_dist ( Color_Pixel, Color_Base ) == 0 )
{
Pixel = pixel_for_vec ( Color_Pixel, 0, Formato ); pixel_to_bmap ( Base, i, ii, Pixel );
}
}
}
bmap_unlock ( Base );
str_cpy ( Nombre, STR_Archivo ); // Generar nombre del resultado
str_cat_num ( Nombre, "+%.0f", Contador );
str_cat ( Nombre, ".tga" );
bmap_save ( Base, Nombre ); // Salvar resultado
while (!key_esc)
{ for ( i=0; i<screen_size.y/Base_Altura; i++) // Mostrar resultado
draw_quad( Base, vector(-screen_size.x*i,Base_Altura*i,0), NULL, NULL, NULL, NULL, 100, 0 );
wait(1);
}
sys_exit ( NULL ); // Salir
} | |
Solamente quedaría recortar el TGA a las dimensiones...
Regístrate para leer el documento completo.