Pascal/Turbo Pascal - instrucciones de teclado para pacman en pascal

 
Vista:

instrucciones de teclado para pacman en pascal

Publicado por Aliasyo (1 intervención) el 28/01/2006 04:26:26
Hola, tengo un problema, estoy realizando el juego de pacman en pascal, bueno, recien estoy comenzando a realizarlo, y tengo el problema de darle instrucciones por teclado al pacman para que se mueva, es decir moverlo con las flechas de teclado. Les agradecería que me ayudaran con el código de ese movimiento y una breve explicación.
Gracias...!!!!!!!!!!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:instrucciones de teclado para pacman en pascal

Publicado por micropais (209 intervenciones) el 28/01/2006 10:02:33
____________________________________________________________

saludos Aliasyo.

Ahí va una unidad Casera del teclado de proposito General ,y mas abajo
como se usa la UNIT , hay mas funciones y otras que he quitado , el tecldo funciona perfectamente .
En el ejemplo solo he usado algunas teclas para que entiendas su funcionamiento , si observas el código verás que puedes usar la unidad
de varias formas.

He preservado las del joystic por si quieres reutilizar el codigo ,pero XP
ya no lo soporta , incluso el tecldo veras que si pulsas mas de 5 veces la
tecla Shif (derecha) el windows XP lo intercepta activando un programilla
llamado Stickykeys - tener en cuenta el efecto secundario de algunas teclas
a la hora bajo el S.O que utilices.

Si tienes dudas postea aquí , solo respondo a los mensajes si no han
pasado mucho tiempo

Saludos MICROPAIS.
____________________________________________________________

{ MICROPAIS 2006 - }
UNIT UTECLA;
{°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°}
INTERFACE {.......... * simbolos publicos *..........................}
{°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°}
const
{ teclas de funcion }
f1=59;f2=60;f3=61;f4=62;f5=63;f6=64;f7=65;f8=66;f9=67;F10=68;
f11=87;f12=88;

impr_pant=42;
bloq_despl=70;
pausa=29;

{ teclas de cursor }
arriba_izquierda=71;
arriba =72;
arriba_derecha =73;
izquierda =75;
centro =76;
derecha =77;
abajo_izquierda =79;
abajo =80;
abajo_derecha =81;
colocar =82;{ insertar hace interferencias con func insert ??? }
suprimir =83;

escape = 1;
retroceso =14;
tabulador =15;
intro =28;
control =29;
alternativa=56;
espaciador =57;

{ para usar con tecla_pulsada }
{ ejemplo: if teclado[tecla_pulsada]<>'þ' then
cad:=cad+teclado[tecla_pulsada]
else cad:='';}

teclado1:array[0..57]of char=#0+'þ1234567890''­þ'+
'þQWERTYUIOP`+þ'+
'þASDFGHJKL¥''§'+
'þ€ZXCVBNM,._þþþ ';
teclado2:array[0..57]of char=#0+'þ!"ú$%&/()=?¨þ'+
'þqwertyuiop^*þ'+
'þasdfghjkl¤ù€'+
'þ€zxcvbnm;:-þþþ ';

var
estado:integer; {actualiza_togle}
insertar,Capslock,Numlock,Scrollock,Alt,Ctrl,
Shifizquierda,ShifDerecha:Boolean;
tec:byte;
procedure actualiza_toggle; { actualiza el estado de las teclas de cambio}
function tecla_pulsada:byte;

{...........................................................................}
var
_cenxx:byte;
_cenyy:byte;
_izq,_der,_arr,_aba:byte;
_bo1,_bo2,_bo3,_bo4:byte;
function init_joypad:boolean;
procedure get_joystick_gamepad;
{////////////////////////////////////////////////////////////////////////////}

{°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°}
IMPLEMENTATION {.......... * simbolos privados *......................... }
{°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°}
uses crt,windos;
var regs:tregisters;

procedure actualiza_toggle;
begin
estado:=mem[$40:$17]; { estado de las teclas modificadoras shif y toggle }
if estado and 1=1 then Shifderecha :=TRUE else Shifderecha :=FALSE;
if estado and 2=2 then ShifIzquierda:=TRUE else ShifIzquierda:=FALSE;
if estado and 4=4 then Ctrl :=TRUE else Ctrl :=FALSE;
if estado and 8=8 then Alt :=TRUE else Alt :=FALSE;
if estado and 16=16 then Scrollock :=TRUE else Scrollock :=FALSE;
if estado and 32=32 then NumLock :=TRUE else NumLock :=FALSE;
if estado and 64=64 then CapsLock :=TRUE else CapsLock :=FALSE;
if estado and 128=128 then insertar :=TRUE else insertar :=FALSE;
{falta estado de insert (colocar) and 128=128 then }
end;

{...........................................................................}
{* mantenido para compatibildad de programas antiguos ,ya no hace falta }
{ borrar el buffer del teclado bios despues de una llamada a tecla_pulsada }
procedure borra_buffer;
begin
asm cli end;
mem[$40:$1a]:=mem[$40:$1c];
asm sti end;
end;
{...........................................................................}
{ actualizado 22-7-2001 ahora soporta equipos portatiles con bola mouse que}
{ mandan un codigo al puerto 60h del teclado cuando este se mueve }
{ interfiriendo con el teclado ahora se separa este mediante un codigo del }
{ puerto 64h cod 28=teclado cod 60=bola trackball }
function tecla_pulsada:byte;assembler;
asm
in al,64h
test al,100000b
je @ok1
xor ax,ax
jmp @fin
@ok1:
in al,60h
cmp al,128
jbe @ok2
xor ax,ax
jmp @fin
@ok2:
cli
push es
xor bx,bx
mov es,bx
mov bl,es:[41ah]
mov es:[41ch],bl
pop es
sti
@fin:
end;
{...........................................................................}
{////////////////////////////////////////////////////////////////////////////}
function init_joypad:boolean;assembler;
asm
mov ah,84h
mov dx,1
int 15h
mov _cenyy,bl
mov _cenxx,al

cmp al,0
je @error1
cmp bl,0
je @error2
mov ax,0ffffh
jmp @fin

@error1:
mov ax,0
jmp @fin
@error2:
mov ax,0
@fin:
end;
{////////////////////////////////////////////////////////////////////////////}
{ get_joystick_gamepad: }
{ carga _izq,_der,_arr,_aba_,bo1,bo2,bo3,bo4 de un joystick o gamepad }
procedure get_joystick_gamepad;
{////////////////////////////////////////////////////////////////////////////}
{ joypad: }
{ devuelve un byte con el contenido del las direcciones y botones de un }
{ joystick o de un gamepad en el sigiente orden }
{ izq, der, arr, aba, bo1, bo2, bo3, bo4 }
{ nota:izq=bit0 bo4=bit7 }
{ llamado por get_joystick_gamepad; }
{ SUBFUNCION joypad /////////////////////////////////////////////////////}
function joypad:byte;assembler;
var centrox,centroy:byte;
asm
mov ah,84h
mov dx,1
int 15h

mov dl,_cenxx
mov centrox,dl
mov dl,_cenyy
mov centroy,dl

xor dl,dl
sub centrox,16
cmp al,centrox
ja @no_izq
or dl,1b
@no_izq:
add centrox,32
cmp al,centrox
jb @no_der
or dl,10b
@no_der:
sub centroy,16
cmp bl,centroy
ja @no_arr
or dl,100b
@no_arr:
add centroy,32
cmp bl,centroy
jb @no_aba
or dl,1000b
@no_aba:
mov bl,dl
{ guardamos las direcciones en bl }
{ obtenemos los botones 1,2,3,4 en al }
mov dx,201h
in al,dx
not al
and al,11110000b
or al,bl
end;
{///////////////////////////////////////////////////////////////////////}
var padxy:byte;
begin
padxy:=joypad;
_izq:=padxy and 1 ;
_der:=padxy and 2 shr 1;
_arr:=padxy and 4 shr 2;
_aba:=padxy and 8 shr 3;
_bo1:=padxy and 16 shr 4;
_bo2:=padxy and 32 shr 5;
_bo3:=padxy and 64 shr 6;
_bo4:=padxy and 128 shr 7;

end;
{////////////////////////////////////////////////////////////////////////////}

END.

___________________________________________________________________
***********************************************************

{ MICROPAIS 2006 Prueba de algunas funciones de la unidad Uteclal }

uses crt,utecla;
begin

clrscr;
writeln('Pulsa en las teclas de direccion - Pulsa ESC para salir');

repeat

gotoxy(1,10);

case tecla_pulsada of
arriba_izquierda:write('Arriba Izquierda');
arriba :write('Arriba ');
arriba_derecha :write('Arriba Derecha ');
izquierda :write('Izquierda ');
centro :write('Centro ');
derecha :write('Derecha ');
abajo_izquierda :write('Abajo Izquierda');
abajo :write('Abajo ');
abajo_derecha :write('Abajo derecha ');
colocar :write('Insertar ');
suprimir :write('Suprimeir ');
{------ ejemplo de algunas teclas ------- }
f1 :write(' Funcion 1 ');
f2 :write(' Funcion 2 ');
f12 :write(' Funcion 12 ');

end;

gotoxy(1,12);
actualiza_toggle; { interceptar los cambios de estado de las teclas exp. }
if Shifizquierda then writeln(' Shif IZQ pulsada') else
writeln(' Shif IZQ no pulsada');
if ShifDerecha then writeln(' Shif DER pulsada ') else
writeln(' Shif DER no pulsada');

until tecla_pulsada= escape;


end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar