RE:Ayuda con tarea, por favor.
Hola, Felix.
Como quiera que lo que pides es algo laborioso, pues supongo que lo habras hecho en modo grafico y habras declarado una variable tipo puntero (pointer) que contendrá la imagen; por este motivo prefiero insertarte el codigo fuente de una imagen que se mueve con las teclas de direccion:
Program animacion_combinada;
Uses crt,graph;
var
gd,gm : integer;
fantasma1 :pointer;
{Definimos un procedimiento para inicializar el modo gráfico}
procedure inicia_graficas;
begin
GD := Detect;{Se autodetecta el tipo de tarjeta o controlador
gráfico para el monitor en el que se este ejecutando el programa}
InitGraph(GD, GM, 'c:\bp\bin\bgi');{Esta ruta indicada puede ser erronea, inserta la correcta}
if GraphResult <> grOk then Halt(1);{Evalua, si la inicialización no
fue correcta entonces Termina}
setcolor(YELLOW);
outtextxy(0,0,'TUTOR DE PROGRAMACION');
setcolor(CYAN);
outtextxy(0,15,'Animacion Combinada');
end;
{Definimos un procedimiento para pintar el fantasma}
procedure pinta_fantasma;
begin
{Cada instrucción conforma una parte del dibujo}
cleardevice;{Limpia la pantalla}
setcolor(lightblue);{Se fija el color a azul brillante}
setfillstyle(1,lightblue);{Se fija el estilo de relleno a solido en azul brillante}
arc(40,40,0,180,20);{Se pinta un arco en la columna 40, fila 40, que
empieza en 0 grados y termina en 180 grados, con un radio de 20 pixels}
line(20,40,20,60);{Se pinta una linea desde la columna 20, fila 40 hasta la
columna 20, fila 60 }
line(20,60,25,55);{Se pinta una linea desde la columna 20, fila 60
hasta la columna 25, fila 55 }
line(25,55,30,60);{Se pinta una linea desde la columna 25, fila 55
hasta la columna 30, fila 60}
line(30,60,35,55);{Se pinta una linea desde la columna 30, fila 60
hasta la columna 35, fila 55}
line(35,55,40,60); {Se pinta una linea desde la columna 35, fila 55
hasta la columna 40, fila 60}
line(40,60,45,55);{Se pinta una linea desde la columna 40, fila 60
hasta la columna 45, fila 55}
line(45,55,50,60);{Se pinta una linea desde la columna 45, fila 55
hasta la columna 50, fila 60}
line(50,60,55,55);{Se pinta una linea desde la columna 50, fila 60
hasta la columna 55, fila 55}
line(55,55,60,60);{Se pinta una linea desde la columna 55, fila 55
hasta la columna 60, fila 60}
line(60,60,60,40);{Se pinta una linea desde la columna 60, fila 60
hasta la columna 60, fila 40}
floodfill(50,50,lightblue);{Se rellena la figura con color azul brillante}
setcolor(white);{Se fija el color en blanco}
arc(40,43,200,350,10);
setfillstyle(1,white);{Se fija el estilo de relleno a solido en blanco}
fillellipse(35,35,4,5);{Se pinta una elise rellena en la columna 35, fila 35
con 4 pixels de radio en "X" y 4 en "Y"}
fillellipse(45,35,4,5);{Se pinta una elise rellena en la columna 45, fila 35
con 4 pixels de radio en "X" y 4 en "Y"}
setfillstyle(1,BLUE);{Se fija el estilo de relleno a solido en azul brillante}
fillellipse(35,38,2,2);{Pinta una el elipse en la columna 35, fila 38 de
2 pixels de radio en "X" y "Y"}
fillellipse(45,38,2,2);{Pinta una el elipse en la columna 45, fila 38 de
2 pixels de radio en "X" y "Y"}
{Una vez hemos dibujado la imagen del fantasma, procedemos a capturarla en
una posición determinada de la memoria para despues copiarla y hacer la
animación}
getmem(fantasma1,imagesize(20,20,60,60));
{La función imagesize devuelve el número de bytes requeridos para almacenar
el mapa de bits de la porción de la pantalla comprendida entre la columna 20
fila 20 hasta la columna 60 fila 60.
El procedimiento Getmem reserva el número de bytes que le entrega la función
imagesize y pone la dirección al comienzo de la variable de tipo Pointer fantasma1
observese detenidamente que en este caso fantasma va sin ^ }
getimage(20,20,60,60,fantasma1^);{Este procedimiento almacena en la variable
fantasma1 los pixels contenidos entre la columna 20, fila 20 hasta la
columna 60 fila 60, notese que en este caso la variable fantasma1 si lleva
el signo ^ }
end;{Final del procedimiento que pinta el fantasma}
procedure movimiento;
var
x,y,desplazamiento,valor,pausa : integer;
contador : byte;
tecla : char;
begin
desplazamiento:=20;{Numero de Pixels que va a avanzar el fantasma en
cualquier dirección}
pausa:=100;{Se hace una espera en milisegundos}
x:=getmaxx div 2; {El valor de X se situa en la mitad de la pantalla}
y:=getmaxy div 2; {El valor de Y se situa en la mitad de la pantalla}
cleardevice;{Se limpia la pantalla}
setcolor(Yellow);
outtextxy(10,10,'TUTOR DE PROGRAMACION');
setcolor(White);
outtextxy(10,20,'Movimiento de una figura con las flechas de dirección');
outtextxy(10,30,'Presione flechas de direccionamiento para mover o [ESC] para terminar');
repeat{Este ciclo se repite hasta que se presiona la tecla [ESC] o sea la #27}
tecla:=readkey;{La variable tecla de tipo char se le asigna el valor dela tecla capturado mediante la función readkey}
valor:=ord(tecla);{La variable valor de tipo integer, toma el valor ordinal de la tecla leida}
if valor=0 then valor:=-ord(readkey);
{En este case se evalua el valor de la tecla}
case valor of
-75:begin{En caso de que se halla presionado la tecla FLECHA IZQUIERDA}
x:=x-desplazamiento;
{El procedimiento PUTIMAGE pinta sobre la pantalla en las coordenadas
respectivas (columna x, fila y) la imagen almacenada previamente y
asignada a la variable fantasma1; la sentencia XORPUT quiere decir
que va a pintar la imagen y restablecer el fondo, si quieres probar,
puedes cambiar este valor por : COPYPUT, ORPUT, ANDPUT, o NOTPUT,
observar que pasa y de ahi sacar tus propias conclusiones}
repeat
putimage(x,y,fantasma1^,xorput);
delay(pausa);
putimage(x,y,fantasma1^,xorput);
until keypressed;
end;
-77:begin{En caso de que se halla presionado la tecla FLECHA DERECHA}
x:=x+desplazamiento;
repeat
putimage(x,y,fantasma1^,xorput);
delay(pausa);
putimage(x,y,fantasma1^,xorput);
until keypressed;
end;
-80:begin{En caso de que se halla presionado la tecla FLECHA ABAJO}
y:=y+desplazamiento;
repeat
putimage(x,y,fantasma1^,xorput);
delay(pausa);
putimage(x,y,fantasma1^,xorput);
until keypressed;
end;
-72:begin{En caso de que se halla presionado la tecla FLECHA ARRIBA}
y:=y-desplazamiento;
repeat
putimage(x,y,fantasma1^,xorput);
delay(pausa);
putimage(x,y,fantasma1^,xorput);
until keypressed;
end;
else{En caso de que se presione una tecla diferente a las flechas
de direccionamiento, se emite un pitido}
begin
sound(400);
delay(50);
nosound;
end;
end;{case}
until tecla=#27;{Se repite hasta que se presiona la tecla [ESC]}
end;{Final del procedimiento}
begin{Inicio del programa principal}
inicia_graficas;{Llamado a el procedimiento para inicializar el modo gráfico}
pinta_fantasma;{Llama al procedimiento que pinta y "captura" el fantasma}
movimiento;{Realiza el movimiento de la figura}
closegraph;{Se cierra el modo gráfico}
end.{Final del programa principal}
Espero te solucione el problema.
Un saludo