Mi problema es que e creado dos círculos que rebotan por la pantalla y ahora querría que rebotaran entre ellos(cuando un circulo toque contra el otro) e probado de varias maneras pero no doy se que e de comparar la posición de uno con el otro pero no encuentro una manera lógica de hacerlo si alguien me puede echar un cable. Esta hecho en FreePascal (Lazarus).
Program circulo;
uses Graph,Crt;
var
Driver, Modo: Smallint;
x1,y1,r1,x2,y2,r2: Integer;
arriba, derecha, izquierda, abajo: boolean;
Procedure bola (color1,color2: integer);
begin
Setcolor(color1); //1º bola
Circle(x1,y1,r1);
Setcolor(color2); // 2º bola
Circle(x2,y2,r2);
end;
{$IFDEF WINDOWS}{$R circulo.rc}{$ENDIF}
begin
Driver := Vga; { Para pantalla VGA }
Modo := VgaHi; { Modo 640x480, 16 colores }
InitGraph(Driver, Modo, 'c:\tp\bgi'); { Inicializamos }
x1:=160;
y1:=240; //1º bola
r1:=30;
x2:=480;
y2:=240; //2º bola
r2:=30;
//x1:=-4;
//x2:=x2+4;
//y1:=y1+4;
//y2:=y2+4;
arriba:=true;
derecha:=false;
izquierda:=true;
abajo:=false;
while true do
begin
bola(random(16),random(16)); // Pinta bola 1 y bola 2
delay(60); // Espera
bola(black,black); // Pinta bola 1 y dos de negro
if derecha=false then
begin
x1:=x1-9;
end
else // X izquierda derecha
begin
x1:=x1+9;
end;
if arriba=true then // BOLA 1
begin
y1:=y1-6;
end
else // Y arriba abajo
begin
y1:=y1+6;
end;
if izquierda=false then
begin
x2:=x2-10;
end
else // X izquierda derecha
begin
x2:=x2+10;
end;
if abajo=true then // BOLA 2
begin
y2:=y2-5;
end
else // Y arriba abajo
begin
y2:=y2+5;
end;
////////////////////////////////////
if x1<= 0+30 then
begin
derecha:=true;
//x1:=0+30;
end // X izquierda derecha
else if x1>=640-30 then
begin
derecha:=false;
//x1:=640-30;
end; // BOLA 1
if y1<= 0+30 then
begin
arriba:=false;
//y1:=0+30;
end
else if y1>=480-30 then // Y arriba abajo
begin
arriba:=true;
//y1:=480-30;
end;
if x2<= 0+30 then
begin
izquierda:=true;
//x2:=0+30; // X izquierda derecha
end
else if x2>=640-30 then
begin
izquierda:=false;
//x2:=640-30;
end; // BOLA 2
if y2<= 0+30 then
begin
abajo:=false;
//y2:=0+30;
end
else if y2>=480-30 then // Y arriba abajo
begin
abajo:=true;
//y2:=480-30;
end;
end;
Readln; { Esperamos }
CloseGraph { Y se acabó }
end.
Gracias de antemano
Un saludo!!
http://juank.black-byte.com/xna-colisiones-2d/ esta la formula para calcular la distancia entre dos circulos, adapta el codigo a pascal. Estructura tu programa con funciones y colocalos asi:
// Esto es un pseudocodigo para que veas como se puede estructurar tu programa
// Inicia el sistema de video e inicializa variables a usar
IniciarSistema()
// Bucle infinito hasta que se presione la tecla Escape (o cualquier otra)
while(Tecla <> Esc)
// Verificar tecla (en caso de que quieras mover los circulos o salir del programa)
VerificarTeclas()
// Detectar las colisiones entre los circulos o contra la pantalla (en la pag. de arriba tienes las formulas)
DetectarColision()
// Dibuja la nueva posicion de los circulos de acuerdo a los calculos realizados
DibujarCirculo()
FinWhile()
Ese es la estructura basica para detectar colisiones.
Gracias por la respuesta. Al final lo consegui con el siguiente código ayudado de un compañero:
if x2>x1 then
begin
dx:=x2-x1;
end
else
begin
dx:=x1-x2;
end;
if y1>y2 then
begin
dy:=y1-y2;
end
else
begin
dy:=y2-y1;
end;
if ((dx <= r1+r2) and (dy<=r1+r2)) then
begin
derecha:=true;
arriba:=false;
//izquierda:=true;
//abajo:=false;
end;
PD: la pag que me diste no rula
Un saludo!! y gracias de nuevo por la respuesta
Una aclaración: En el
IF, si sólo es una Acción, no hace falta usar Begin y End.
Es decir:
if (Condicion) then
Accion1
else
Accion2;
Saludos.