Oppure

Loading
10/02/17 16:05
dario cavarrett
Salve mi servirebbe un consiglio per un problema che probabilmente, in realtà, é molto semplice: io ho una figura che si muove (in graph) a seconda dei comandi inseriti in input dall' utente, la domanda é: one faccio a comprarla in modo che rimanga colorata in ogni posizione (usando floodfill la rivolta ad ogni spostamento e ovviamente non é un Bell effetto)
aaa
10/02/17 18:33
Poggi Marco
Se floodfill impiega troppo tempo "lenta", puoi utilizzare la funzione GetImage, come precedentemente suggerito.
Posta il programma per avere maggiori dettagli sul problema.
aaa
10/02/17 19:25
dario cavarrett
Program esempio;

Uses graph,wincrt;

Procedure disegno(x,y:integer);
Begin
Circle(x,y,13);
End;
Var ch:char;
,x,y:integer;
Begin
//inizializzo la grafica
X:=400;
Y=300;
Repeat
If keypressed the
Ch:=reakey;
Case ch of
1:begin
x:=x;
Y:=y-10;
Disegno(x,y);
End;
End;


Until 1=2

End.
//l ho scritto veloce ed esemplificato solo per risparmiare tempo: questo è il concetto comunque
aaa
10/02/17 22:13
Poggi Marco
Ho rivisto il programma:
Uses graph, crt;

function inizio_graf:boolean;
var sg,ng:integer;
begin
 sg:=detect; ng:=0;
 initgraph(sg, ng, '');
 inizio_graf:=graphresult = grOk;
end;

Procedure disegno(x,y:integer); // Disegna la figura a video
Begin
    setColor(green);
    Circle(x,y,13);
    setFillStyle(1, red);
    floodFill(x, y, green);
End;


procedure inizio(var immagine,vuoto:pointer); // Memorizza le fugure in immagine e vuoto
var dimensione:word;
begin
	clearDevice; // pulizia del video
	dimensione:=imageSize(0,0, 26,26); // Calcolo della memoria necessaria a memorizzare le figure
	getMem(immagine, dimensione); // allocazione della memoria per immagine
	getMem(vuoto, dimensione); // allocazione della memoria per vuoto
	getImage(0,0, 26,26, vuoto^); // in vuoto memorizzo un rettangolo nero
    disegno(13, 13);
    getImage(0,0, 26,26, immagine^); // in immagine memorizzo il disegno
    putImage(0, 0, vuoto^, normalPut); // in vuoto, è memorizzato un quadrato nero, 
                                       // quindi con questa istruzione pulisco lo schermo.
end;

procedure immagine(x,y:integer; figura:pointer);
begin
   putImage(x, y, figura^, normalPut); // Genere l'immagine memorizzata in figura
   // putImage lavora tramite puntatori, di conseguenza figura va indicata con ^ finale. 
end;

Var ch:char;
    x,y:integer;
    palla,nero:pointer;


Begin

	if inizio_graf then
	begin
		X:=400;
		Y:=300;
		inizio(palla, nero);
		Repeat
			If keypressed then
			begin
				Ch:=readkey;
				if ch='w' then
				begin 
				    immagine(x, y, nero); // cancella la figura precedente
					Y:=y - 20;
					immagine(x, y, palla) // disegna l'immagine nella nuova posizione.
				end;
				if ch='s' then
				begin
				    immagine(x, y, nero); 
					x:=x + 20;
					immagine(x, y, palla); 
				end;
				if ch='a' then
				begin
				    immagine(x, y, nero); 
					x:=x - 20;
					disegno(x+13, y+13); // Richiamo la procedura disegno 
					                     // per un confronto con immagine.
				end;
				if ch='z' then
				begin
				    immagine(x, y, nero); 
					y:=y + 20;
					immagine(x, y, palla); 
				end;
			end;
		Until upCase(ch)='Q';
	    closegraph;
	    freeMem(palla);
	    freeMem(nero);
	    // Alla fine del programma è necessario deallocare 
	    // la memoria in palla e nero tramite la funzione freeMem.
	end;
End.
aaa
11/02/17 5:40
dario cavarrett
Grazie veramente, sei stato molto d'aiuto
Ultima modifica effettuata da dario cavarrett 11/02/17 5:41
aaa
11/02/17 8:52
Poggi Marco
Di nulla.
aaa
11/02/17 13:14
dario cavarrett
scusa, copiaincollandolo tale e quale, ora, non capisco perché non funzioni: il cerchio appare per un secondo e poi scompare.
aaa
11/02/17 13:19
dario cavarrett
No niente ho risolto; avevo utilizzato crt invece che wincrt.
Comunque ho ancora una domanda: come mai facendolo andare verso sinistra ci mette più tempo a caricare?
Ultima modifica effettuata da dario cavarrett 11/02/17 13:21
aaa