prueba1.pro



%        trace

domains
	file = valores
	r    = real
	lr   = r*
	i    = integer
	s    = symbol
	st   = string
	c    = char
	li   = i*
	lst  = st*
	key	= arr;aba;der;izq;
		  rpag;apag;
		  enter;esc;otro
% ___________________________________________________________________________
%                             ------- -------
predicates
  actualiza(i,i)
  a_key(key) b_key(i,key) e_tecla(key) key(i,key)
  color(i,i,i)
  fantasma
  modo_grafico
  run

database - f
   f(i,i,i,i)			% -(Xa,Ya,Xn,Yn)
database - brinco
   brinco(i)			% -(Incremento)   es el SNAP.
database - cambio
   cambio(i)			% -(cambio?)	detecta si no es flecha.
clauses
modo_grafico:-
		DetectGraph(G_Driver, G_Mode1), color(G_Driver,G_Mode1,G_Mode),
		InitGraph(G_Driver,G_Mode, _, _, bgi_Path),!.
	color(1,_,0). color(_,Mode,Mode).
run:-
     a_key(K), !, e_tecla(K), fantasma, run.
a_key(Key):-   inkey(K), !, char_int(K,Asc), key(Asc,Key).
a_key(K_):-    !,a_key(K_).
key(13,enter):- !.      key(27,esc):- !.
key(0,Key):- readchar(T), char_int(T,Asc),
	     b_key(Asc,Key).               key(_,otro):- !.
b_key(72,arr):-!. b_key(80,aba):-!. b_key(75,izq):-!. b_key(77,der):-!.
b_key(73,rpag):-!. b_key(81,apag):-!.
b_key(_,otro):-!.
% ---------------------------------------------------------------------------
% ---------------------------------------------------------------------------
e_tecla(esc):- !,fail.
e_tecla(izq):- f(_,_,X1,Y1), brinco(B), X1 - B > 10,  !, X1 - B = X2, actualiza(X2,Y1).
e_tecla(arr):- f(_,_,X1,Y1), brinco(B), Y1 - B > 10,  !, Y1 - B = Y2, actualiza(X1,Y2).
e_tecla(der):- f(_,_,X1,Y1), brinco(B), X1 + B < 590, !, X1 + B = X2, actualiza(X2,Y1).
e_tecla(aba):- f(_,_,X1,Y1), brinco(B), Y1 + B < 290, !, Y1 + B = Y2, actualiza(X1,Y2).
		% izq = 3   arr = 10   der = 600  aba = 300
e_tecla(rpag):- brinco(B), B > 5, !, retractall(_,brinco),
		B - 5 = B1, asserta(brinco(B1),brinco),
		retractall(_,cambio), asserta(cambio(1),cambio).
e_tecla(apag):- brinco(B), B < 20, !, retractall(_,brinco),
		B + 5 = B1, asserta(brinco(B1),brinco),
		retractall(_,cambio), asserta(cambio(1),cambio).
e_tecla(enter):- cursor(20,50), f(_,_,X,Y), write(X,"     ",Y), !,
		 retractall(_,cambio), asserta(cambio(1),cambio).
e_tecla( _ ):-   !, retractall(_,cambio), asserta(cambio(1),cambio).
% ---------------------------------------------------------------------------
fantasma:-		% cursor ==> wi = 10  hi = 10
    not(cambio(1)), f(Xa,Ya,Xn,Yn),
    Xa1 = Xa - 10, Ya1 = Ya - 10,	% Xa2 = Xa + 10, Ya2 = Ya + 10,
    Xn1 = Xn - 10, Yn1 = Yn - 10, Xn2 = Xn + 10, Yn2 = Yn + 10,
    getimage(500,350,520,370,Figa), putimage(Xa1,Ya1,Figa,0),
    getimage(Xn1,Yn1,Xn2,Yn2,Fign), putimage(500,350,Fign,0),
    setcolor(2), line(Xn1,Yn,Xn2,Yn), line(Xn,Yn1,Xn,Yn2), !.
fantasma:- !.
actualiza(Xn,Yn):- f(_,_,Xa,Ya), retractall(_,f), retractall(_,cambio),
		   asserta(f(Xa,Ya,Xn,Yn),f), !.
% ---------------------------------------------------------------------------

goal
    modo_grafico,
    outtextxy(200,2,"Control del cursor"),
    outtextxy(20,60,"Control del cursor"),
    setcolor(4),rectangle(1,1,601,301),
    line(10,10,250,250),line(250,250,560,10),
    retractall(_,f), asserta(f(110,20,110,20),f),
    retractall(_,brinco), asserta(brinco(1),brinco),
    getimage(100,10,120,30,Bit), putimage(500,350,Bit,0), readchar(_),
    fantasma, run, closegraph().