First commit 16/09/1994
This commit is contained in:
362
MOVES.CPP
Normal file
362
MOVES.CPP
Normal file
@ -0,0 +1,362 @@
|
||||
int CargaPaleta(char *file );
|
||||
|
||||
#include <dos.h>
|
||||
#include <mem.h>
|
||||
#include <stdio.h>
|
||||
#include <conio.h>
|
||||
#include <alloc.h>
|
||||
//#include <graphics.h>
|
||||
|
||||
#define NUM_MOVES 4 // Numero de movimientos por secuencia
|
||||
|
||||
#define IZQUIERDA 0
|
||||
#define DERECHA 1
|
||||
#define ARRIBA 2
|
||||
#define ABAJO 3
|
||||
#define IZQARR 4
|
||||
#define IZQABJ 5
|
||||
#define DERARR 6
|
||||
#define DERABJ 7
|
||||
|
||||
#define OK 0
|
||||
#define ERROR 1
|
||||
|
||||
#define SIZE_PERSONAJE (59*33)
|
||||
|
||||
typedef unsigned char DacPalette256[256][3];
|
||||
|
||||
void setvgapalette256(DacPalette256 *PalBuf);
|
||||
|
||||
|
||||
|
||||
unsigned char far *video_buffer = (char far *)0xA0000000L; // vram byte ptr
|
||||
|
||||
void putpixel( int x, int y, int color)
|
||||
{
|
||||
video_buffer[((y<<8) + (y<<6)) + x] = color;
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char Frame[NUM_MOVES][SIZE_PERSONAJE];
|
||||
} Pmovim;
|
||||
|
||||
/*Pmovim *Personaje;*/
|
||||
|
||||
typedef struct pcx_header_typ
|
||||
{
|
||||
char manufacturer;
|
||||
char version;
|
||||
char encoding;
|
||||
char bits_per_pixel;
|
||||
int x,y;
|
||||
int width,height;
|
||||
int horz_res;
|
||||
int vert_res;
|
||||
char ega_palette[48];
|
||||
char reserved;
|
||||
char num_color_planes;
|
||||
int bytes_per_line;
|
||||
int palette_type;
|
||||
char padding[58];
|
||||
|
||||
} PCX_HEADER;
|
||||
|
||||
Pmovim far *Jugador;
|
||||
|
||||
#define PALETTE_MASK 0x3c6
|
||||
#define PALETTE_REGISTER_RD 0x3c7
|
||||
#define PALETTE_REGISTER_WR 0x3c8
|
||||
#define PALETTE_DATA 0x3c9
|
||||
// this structure holds a RGB triple in three bytes
|
||||
|
||||
typedef struct RGB_color_typ
|
||||
{
|
||||
|
||||
unsigned char red; // red component of color 0-63
|
||||
unsigned char green; // green component of color 0-63
|
||||
unsigned char blue; // blue component of color 0-63
|
||||
|
||||
} RGB_color, *RGB_color_ptr;
|
||||
|
||||
void Set_Palette_Register(int index, RGB_color_ptr color)
|
||||
{
|
||||
// this function sets a single color look up table value indexed by index
|
||||
// with the value in the color structure
|
||||
|
||||
// tell VGA card we are going to update a pallete register
|
||||
|
||||
outport(PALETTE_MASK,0xff);
|
||||
|
||||
// tell vga card which register we will be updating
|
||||
|
||||
outport(PALETTE_REGISTER_WR, index);
|
||||
|
||||
// now update the RGB triple, note the same port is used each time
|
||||
|
||||
outport(PALETTE_DATA,color->red);
|
||||
outport(PALETTE_DATA,color->green);
|
||||
outport(PALETTE_DATA,color->blue);
|
||||
|
||||
}; // end Set_Palette_Color
|
||||
|
||||
|
||||
int IniciaJugador( Pmovim far **JUgador, int Direcciones, char *PCX, long PorDonde )
|
||||
{
|
||||
FILE *PCX_ptr;
|
||||
PCX_HEADER pcx_header;
|
||||
int alto, ancho, movimiento;
|
||||
int desplaz, contador;
|
||||
unsigned char byte;
|
||||
int color = -1;
|
||||
int contar = -1;
|
||||
|
||||
//Asignamos memoria para los movimientos del jugador
|
||||
// if ( ( (*Jugador) = (Pmovim far *)farmalloc( sizeof(Pmovim)*Direcciones ) ) == NULL ) return ERROR;
|
||||
|
||||
// Abrimos el fichero de los movimientos
|
||||
if ( ( PCX_ptr = fopen( PCX, "rb" ) ) == NULL ) return ERROR;
|
||||
|
||||
// Nos posicionamos en el lugar de comienzo del PCX
|
||||
fseek( PCX_ptr, PorDonde, SEEK_SET );
|
||||
|
||||
// Leemos la cabecera
|
||||
fread( &pcx_header, sizeof(PCX_HEADER), 1, PCX_ptr );
|
||||
|
||||
// Comprobamos que sea un PCX
|
||||
if ( pcx_header.manufacturer == 10 )
|
||||
{
|
||||
for(alto=0; alto<pcx_header.height; alto++)
|
||||
{
|
||||
for(ancho=0; ancho<pcx_header.width; )
|
||||
{
|
||||
byte=getc(PCX_ptr);
|
||||
if(byte<=0xC0)
|
||||
{
|
||||
for ( movimiento = 0; movimiento < NUM_MOVES; movimiento++ )
|
||||
if ( alto >= (47+82*movimiento) && alto < (106+82*movimiento) )
|
||||
{
|
||||
for ( desplaz = 0; desplaz < Direcciones; desplaz++ )
|
||||
if ( ancho >= (80+71*desplaz) && ancho < (113+71*desplaz) )
|
||||
{
|
||||
Jugador[desplaz]./*->*/ Frame[movimiento][ (ancho-(80+71*desplaz)) + 33 * (alto-(47+82*movimiento)) ] = byte;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
ancho++;
|
||||
}
|
||||
else
|
||||
{
|
||||
contador=byte&0x3F; byte=getc(PCX_ptr);
|
||||
for(; contador>0; contador--)
|
||||
{
|
||||
for ( movimiento = 0; movimiento < NUM_MOVES; movimiento++ )
|
||||
if ( alto >= (47+82*movimiento) && alto < (106+82*movimiento) )
|
||||
{
|
||||
for ( desplaz = 0; desplaz < Direcciones; desplaz++ )
|
||||
if ( ancho >= (80+71*desplaz) && ancho < (113+71*desplaz) )
|
||||
{
|
||||
Jugador[desplaz]./*->*/ Frame[movimiento][ (ancho-(80+71*desplaz)) + 33 * (alto-(47+82*movimiento)) ] = byte;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
ancho++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
CargaPaleta( PCX );
|
||||
|
||||
// Cerramos el fichero de movimientos
|
||||
fclose( PCX_ptr );
|
||||
|
||||
return OK;
|
||||
};
|
||||
|
||||
void MuestraJugador( unsigned char *BitMap_Ptr, int Px, int Py, char FILL )
|
||||
{
|
||||
int x, y;
|
||||
static color = -1;
|
||||
|
||||
if ( color == -1 ) color = *(BitMap_Ptr);
|
||||
|
||||
for ( x = 0; x < 33; x++ )
|
||||
for ( y = 0; y < 59; y++ )
|
||||
if ( 1 || *(BitMap_Ptr + x + y*33) != color )
|
||||
if ( FILL==1 )
|
||||
putpixel( x+Px, y+Py, 0 );
|
||||
else
|
||||
putpixel( x+Px, y+Py, *(BitMap_Ptr + x + y*33) );
|
||||
else
|
||||
putpixel( x+Px, y+Py, 0 );
|
||||
}
|
||||
void asigna_modo_video(char modo) /* asigna el modo de v<>deo indicado */
|
||||
{ /* en la variable "modo" */
|
||||
union REGS ent, sal;
|
||||
|
||||
ent.h.al = modo;
|
||||
ent.h.ah = 0;
|
||||
int86(16, &ent, &sal); /* funci<63>n para asignar el modo de video */
|
||||
};
|
||||
|
||||
void main(void)
|
||||
{
|
||||
Pmovim far *Figuras;
|
||||
int Direccion, O_K = 0;
|
||||
float MovAct;
|
||||
|
||||
float x, y;
|
||||
// Inicializamos la Pantalla
|
||||
asigna_modo_video(0x13);
|
||||
|
||||
|
||||
|
||||
if ( ( (Jugador) = (Pmovim far *)farmalloc( sizeof(Pmovim)*8 ) ) == NULL ) return ;
|
||||
|
||||
if ( ( (Figuras) = (Pmovim far *)farcalloc( 8, sizeof(Pmovim) ) ) == NULL ) return ;
|
||||
|
||||
if ( IniciaJugador( &Figuras, 8, "moves.pcx", 0 ) != OK ) return;
|
||||
|
||||
// Mostramos los personajes en la pantalla
|
||||
|
||||
Direccion = 0;
|
||||
MovAct = 0;
|
||||
float Incx=0, Incy=0;
|
||||
x = 0; y = 0;
|
||||
do
|
||||
{
|
||||
if ( kbhit() )
|
||||
if ( getch() == 0 )
|
||||
{
|
||||
switch( getch() )
|
||||
{
|
||||
case 72: //ARRIBA
|
||||
Direccion = 4;
|
||||
Incx = 0;
|
||||
Incy = -8;
|
||||
break;
|
||||
case 80: //ABAJO
|
||||
Direccion = 0;
|
||||
Incx = 0;
|
||||
Incy = 8;
|
||||
break;
|
||||
case 75: //IZQ
|
||||
Direccion = 2;
|
||||
Incx = -8;
|
||||
Incy = 0;
|
||||
break;
|
||||
case 77: //DER
|
||||
Direccion = 6;
|
||||
Incx = 8;
|
||||
Incy = 0;
|
||||
break;
|
||||
case 71:
|
||||
Direccion = 3;
|
||||
Incx = -5;
|
||||
Incy = -5;
|
||||
break;
|
||||
case 73:
|
||||
Direccion = 5;
|
||||
Incx = 2;
|
||||
Incy = -2;
|
||||
break;
|
||||
case 81:
|
||||
Direccion = 7;
|
||||
Incx = 2;
|
||||
Incy = 2;
|
||||
break;
|
||||
case 79:
|
||||
Direccion = 2;
|
||||
Incx = -2;
|
||||
Incy = 2;
|
||||
break;
|
||||
|
||||
default:
|
||||
O_K = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
// memset( video_buffer, 254, 320*200 );
|
||||
|
||||
MuestraJugador( Jugador[Direccion].Frame[(int)MovAct], x, y, 1 );
|
||||
x += Incx; y += Incy; MovAct = (MovAct+=1); if ( MovAct >= 4 ) MovAct = 0;
|
||||
if ( x > 320-33 ) x = 320-33; if ( x < 0 ) x = 0;
|
||||
if ( y > 200-59 ) y = 200-59; if ( y < 0 ) y = 0;
|
||||
MuestraJugador( Jugador[Direccion].Frame[(int)MovAct], x, y, 0 );
|
||||
delay(100);
|
||||
} while( !O_K );
|
||||
|
||||
farfree( Figuras );
|
||||
// Volvemos la pantalla a su estado normal
|
||||
asigna_modo_video(0x3);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************************************************************************\
|
||||
|* *|
|
||||
|* CargaPaleta *|
|
||||
|* *|
|
||||
|* Descripci<63>n: *|
|
||||
|* Carga la paleta con los colores por defecto *|
|
||||
|* *|
|
||||
|* *|
|
||||
|* Entradas: achivo PCX de donde cargar la paleta *|
|
||||
|* *|
|
||||
|* Salidas: OK Todo ha ido bien *|
|
||||
|* ERROR Algo va mal *|
|
||||
|* *|
|
||||
\**************************************************************************/
|
||||
int CargaPaleta(char *file )
|
||||
{
|
||||
DacPalette256 Palette256;
|
||||
int index;
|
||||
FILE *fp;
|
||||
|
||||
if ( (fp=fopen( file, "rb" ) ) == NULL )
|
||||
return ERROR;
|
||||
|
||||
if ( fseek( fp, -768L, SEEK_END ) == 0 )
|
||||
{
|
||||
for (index=0; index<256; index++)
|
||||
{
|
||||
// get the red component
|
||||
// get the green component
|
||||
// get the blue component
|
||||
// set components
|
||||
Palette256[index][0] = getc(fp) >> 2;
|
||||
Palette256[index][1] = getc(fp) >> 2;
|
||||
Palette256[index][2] = getc(fp) >> 2;
|
||||
} // end for index
|
||||
|
||||
}
|
||||
setvgapalette256( &Palette256 );
|
||||
|
||||
|
||||
fclose( fp );
|
||||
return OK;
|
||||
}
|
||||
|
||||
/* Setvgapalette256 sets the entire 256 color palette */
|
||||
/* PalBuf contains RGB values for all 256 colors */
|
||||
/* R,G,B values range from 0 to 63 */
|
||||
/* Usage: */
|
||||
/* DacPalette256 dac256; */
|
||||
/* */
|
||||
/* setvgapalette256(&dac256); */
|
||||
void setvgapalette256(DacPalette256 *PalBuf)
|
||||
{
|
||||
struct REGPACK reg;
|
||||
|
||||
reg.r_ax = 0x1012;
|
||||
reg.r_bx = 0;
|
||||
reg.r_cx = 256;
|
||||
reg.r_es = FP_SEG(PalBuf);
|
||||
reg.r_dx = FP_OFF(PalBuf);
|
||||
intr(0x10,®);
|
||||
}
|
Reference in New Issue
Block a user