Un saludo a todos!
Se me plantea un problema tengo que hacer una cruz que se mueve a modo de cursor segun como presione las teclas direccionales y me dibuja una linea cuando presiono enter.
Ahora debo modificar el programa para que no borre las lineas al retroceder, me imprima la primera coordada donde se presiono enter y las coordenadas por donde va desplazandose la cruz cuando la voy moviendo con las flechas. Además debe dibujarse un rectangulo es decir un area de dibujo que es el limite fuera del cual no debe desplazarse la cruz, la impresion de las coordenadas debe estar fuera de dicha area. Les dejo el codigo original y un que altere pero que no va y no hace todo lo que debe de cualquier manera pero ni ese ha corrido correctamente.
En verdad, necesito ayuda.
________________
| _____________ |
| | | |
| | + | |
| |____________ | |
|_coord x,y________|
Codigo Original
/* ESTE PROGRAMA HACE QUE PODAMOS UBICAR EL CURSOR EN LA POSICION DESEADA
INTERACTIVAMENTE */
#include <stdio.h>
#include <graphics.h>
#include <process.h>
#include <conio.h>
#define NEGRO 0
#define BLANCO 15
#define ARRIBA 72
#define ABAJO 80
#define DER 77
#define IZQ 75
#define ENTER 13
#define Poner_cursor(x,y) Dib_cursor(x,y,BLANCO);
#define Borrar_cursor(x,y)Dib_cursor(x,y,NEGRO);
#define Tamcurs 5
void inicio (void);
void Dib_polilinea (void);
int Escoger_punto (int *,int *);
void Dib_cursor (int,int,int);
int Leer (void);
/* MAIN */
void main (void)
{
inicio();
cleardevice();
Dib_polilinea();
restorecrtmode();
}
/* FUNCION INICIO */
void inicio (void)
{
int adaptador=DETECT,modo,codigo;
initgraph(&adaptador,&modo,"c:\\ tc20");
if ((codigo=graphresult())!=0)
{
printf("%s\n",grapherrormsg(codigo));
exit(1);
}
}
/* FUNCION POLI_LINEA */
void Dib_polilinea (void)
{
int x1,x2,y1,y2,car;
x2=getmaxx()/2;
y2=getmaxy()/2;
car= Escoger_punto(&x2,&y2);
while(car==ENTER)
{
x1=x2;
y1=y2;
car=Escoger_punto(&x2,&y2);
if(car==ENTER)
line(x1,y1,x2,y2);
}
}
/* FUNCION DIB_CURSOR */
void Dib_cursor(int x,int y,int color)
{
int Col_ant;
Col_ant=getcolor();
setcolor(color);
line(x-Tamcurs,y,x+Tamcurs,y);
line(x,y-Tamcurs,x,y+Tamcurs);
setcolor(Col_ant);
}
/* FUNCION ESCOGER_PUNTO */
int Escoger_punto(int * x,int * y)
{
int c,dx,dy;
Poner_cursor(*x,*y);
for (;
{
dx=dy=0;
switch(c=Leer())
{
case ARRIBA:dy--;break;
case ABAJO:dy++;break;
case IZQ:dx--;break;
case DER: dx++;break;
default:return©;
}
Borrar_cursor(*x,*y);
*x+=dx;
*y+=dy;
Poner_cursor(*x,*y);
}
}
/* FUNCION LEER */
int Leer(void)
{
int tecla;
while((tecla=getch())!=0)
if (tecla==ENTER)
return(tecla);
return(getch());
}
***************************
Codigo alterado
#include <stdio.h>
#include <graphics.h>
#include <process.h>
#include <conio.h>
#define NEGRO 0
#define BLANCO 15
#define ARRIBA 72
#define ABAJO 80
#define DER 77
#define IZQ 75
#define ENTER 13
#define Poner_cursor(x,y) Dib_cursor(x,y);
#define Borrar_cursor(x,y)Dib_cursor(x,y);
#define Tamcurs 5
#define Col_curs 8
#define s 115
void inicio (void);
void Dib_polilinea (void);
int Escoger_punto (int *,int *);
void Dib_cursor (int,int);
int Leer (void);
void area_dib(void); /*FUNCION QUE FORMA EL AREA DE DIBUJO */
void XOR_PIXEL(int x,int y); /*FUNCION QUE EVITA QUE SE BORREN LAS LINEAS*/
int maxx(int *x);
int maxy(int *y);
/* MAIN */
void main (void)
{
inicio();
cleardevice();
area_dib();
Dib_polilinea();
if(Leer()==s)
restorecrtmode();
else main();
}
/* FUNCION INICIO */
void inicio (void)
{
int adaptador=DETECT,modo,codigo;
initgraph(&adaptador,&modo,"c:\\ tc20");
if ((codigo=graphresult())!=0)
{
printf("%s\n",grapherrormsg(codigo));
exit(1);
}
}
/* FUNCION POLI_LINEA */
void Dib_polilinea (void)
{
int x1,x2,y1,y2,car;
x2=getmaxx()/2;
y2=getmaxy()/2;
car= Escoger_punto(&x2,&y2);
while(car==ENTER)
{
x1=x2;
y1=y2;
car=Escoger_punto(&x2,&y2);
if(car==ENTER)
line(x1,y1,x2,y2);
}
}
/* FUNCION DIB_CURSOR */
void Dib_cursor(int x,int y)
{
int i;
for(i=0;i<Tamcurs;i++)
{
XOR_PIXEL(x-i,y);
XOR_PIXEL(x+i,y);
XOR_PIXEL(x,y-i);
XOR_PIXEL(x,y+i);
}
}
/*FUNCION XOR_PIXEL*/
void XOR_PIXEL(int x,int y)
{
putpixel(x,y,Col_curs^getpixel(x,y) );
}
/* FUNCION ESCOGER_PUNTO */
int Escoger_punto(int * x,int * y)
{
int c;
int ct_arriba=0;
int ct_abajo=0;
int ct_der=0;
int ct_izq=0;
int paso_acel=5;
Poner_cursor(*x,*y);
for (;
{
switch(c=Leer())
{
case ARRIBA:
if( maxy(*y)!=0 )
{
Borrar_cursor(*x,*y);
*y+=(++ct_arriba<paso_acel)?-1:-paso_acel;
ct_abajo=ct_der=ct_izq=0;
Poner_cursor(*x,*y);
}
break;
case ABAJO:
if( maxy(*y)!=1 )
{
*y+=(++ct_abajo<paso_acel)?1:paso_acel;
ct_arriba=ct_izq=ct_der=0;
Poner_cursor(*x,*y);
}
break;
case IZQ:
if( maxx(*x)!=1 )
{
Borrar_cursor(*x,*y);
*x+=(++ct_izq<paso_acel)?-1:paso_acel;
ct_arriba=ct_abajo=ct_der=0;
Poner_cursor(*x,*y);
}
break;
case DER:
if(maxx(*x)!=0)
{
Borrar_cursor(*x,*y);
*x+=(++ct_der<paso_acel)?1:paso_acel;
ct_abajo=ct_arriba=ct_izq=0;
Poner_cursor(*x,*y);
}
break;
default:
Borrar_cursor(*x,*y);
return©;
}
/* FUNCION LEER */
int Leer(void)
{
int tecla;
while((tecla=getch())!=0)
if (tecla==ENTER)
return(tecla);
return(getch());
}
/*FUNCION AREA_DIB*/
void area_dib(void)
{
int x,y;
x=getmaxx()/2;
y=getmaxy()/2;
setcolor(BLUE);
rectangle(x-300,y-150,x+300,y+150);
}
/*FUNCION MAXx*/
int maxx(int *x)
{
int min1,max1;
max1=(getmaxx()/2)+300;
min1=(getmaxx()/2)-300;
if(*x>=max1)
return(0);
if(*x<=max1)
return(1);
}
/*FUNCION MAXy*/
int maxy(int *y)
{
int min2,max2,centro2;
max2=(getmaxy()/2)+150;
min2=(getmaxy()/2)-150;
if(*y>=max2)
return(0);
if(*y<=max2) return(1);
}