Duda con Pascal

Iniciado por yako-_-, 16 Junio 2010, 03:53 AM

0 Miembros y 1 Visitante están viendo este tema.

yako-_-

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).


Código (pascal) [Seleccionar]
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!!
Para que vivir, pudiendo trabajar los Domingos

                                                                Yako-_-

IDarknightI

#1
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.
El Conocimiento ahora es libre. Compartelo!!   -   The Knowledge is now free. Share it!!

yako-_-

Gracias por la respuesta. Al final lo consegui con el siguiente código ayudado de un compañero:
Código (pascal) [Seleccionar]
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
Para que vivir, pudiendo trabajar los Domingos

                                                                Yako-_-

Malvinas

Una aclaración: En el IF, si sólo es una Acción, no hace falta usar Begin y End.

Es decir:

Código (pascal) [Seleccionar]
if (Condicion) then
    Accion1
else
    Accion2;


Saludos.

yako-_-

Para que vivir, pudiendo trabajar los Domingos

                                                                Yako-_-