Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: yako-_- en 16 Junio 2010, 03:53 am



Título: Duda con Pascal
Publicado por: yako-_- en 16 Junio 2010, 03:53 am
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
  1. Program circulo;
  2.  
  3. uses Graph,Crt;
  4.  
  5. var
  6.  Driver, Modo: Smallint;
  7.  x1,y1,r1,x2,y2,r2: Integer;
  8.  arriba, derecha, izquierda, abajo:   boolean;
  9.  
  10.  
  11. Procedure bola (color1,color2: integer);
  12.     begin
  13.       Setcolor(color1);  //1º bola
  14.       Circle(x1,y1,r1);
  15.       Setcolor(color2);  // 2º bola
  16.       Circle(x2,y2,r2);
  17.     end;
  18.  
  19.     {$IFDEF WINDOWS}{$R circulo.rc}{$ENDIF}
  20.  
  21. begin
  22.  
  23.  
  24.  Driver := Vga;                                   { Para pantalla VGA }
  25.  Modo := VgaHi;                            { Modo 640x480, 16 colores }
  26.  InitGraph(Driver, Modo, 'c:\tp\bgi');                { Inicializamos }
  27.  
  28.       x1:=160;
  29.       y1:=240;   //1º bola
  30.       r1:=30;
  31.  
  32.       x2:=480;
  33.       y2:=240;   //2º bola
  34.       r2:=30;
  35.       //x1:=-4;
  36.       //x2:=x2+4;
  37.       //y1:=y1+4;
  38.       //y2:=y2+4;
  39.  
  40. arriba:=true;
  41. derecha:=false;
  42. izquierda:=true;
  43. abajo:=false;
  44.  
  45. while true do
  46.  
  47.    begin
  48.       bola(random(16),random(16));  // Pinta bola 1 y bola 2
  49.       delay(60);  // Espera
  50.       bola(black,black); // Pinta bola 1 y dos de negro
  51.  
  52.       if derecha=false then
  53.         begin
  54.         x1:=x1-9;
  55.         end
  56.        else                             // X izquierda derecha
  57.         begin
  58.         x1:=x1+9;
  59.         end;
  60.        if arriba=true then            // BOLA 1
  61.         begin
  62.         y1:=y1-6;
  63.         end
  64.        else                             // Y arriba abajo
  65.         begin
  66.         y1:=y1+6;
  67.         end;
  68.  
  69.         if izquierda=false then
  70.         begin
  71.         x2:=x2-10;
  72.         end
  73.        else                       // X izquierda derecha
  74.         begin
  75.         x2:=x2+10;
  76.         end;
  77.        if abajo=true then                             // BOLA 2
  78.         begin
  79.         y2:=y2-5;
  80.         end
  81.        else                       // Y arriba abajo
  82.         begin
  83.         y2:=y2+5;
  84.         end;
  85.  
  86. ////////////////////////////////////
  87.  
  88.        if x1<= 0+30 then
  89.         begin
  90.         derecha:=true;
  91.         //x1:=0+30;
  92.         end                             // X izquierda derecha
  93.        else if x1>=640-30 then
  94.          begin
  95.          derecha:=false;
  96.          //x1:=640-30;
  97.          end;                                               // BOLA 1
  98.  
  99.        if y1<= 0+30 then
  100.         begin
  101.         arriba:=false;
  102.         //y1:=0+30;
  103.         end
  104.        else if y1>=480-30 then            // Y arriba abajo
  105.         begin
  106.         arriba:=true;
  107.         //y1:=480-30;
  108.         end;
  109.  
  110.        if x2<= 0+30 then
  111.         begin
  112.         izquierda:=true;
  113.         //x2:=0+30;                          // X izquierda derecha
  114.         end
  115.        else if x2>=640-30 then
  116.         begin
  117.         izquierda:=false;
  118.         //x2:=640-30;
  119.         end;                                              // BOLA 2
  120.  
  121.        if y2<= 0+30 then
  122.         begin
  123.         abajo:=false;
  124.         //y2:=0+30;
  125.         end
  126.        else if y2>=480-30 then               // Y arriba abajo
  127.         begin
  128.         abajo:=true;
  129.         //y2:=480-30;
  130.         end;
  131.  
  132.  
  133.    end;
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  Readln;                                                  { Esperamos }
  140.  CloseGraph                                              { Y se acabó }
  141. end.              

Gracias de antemano

Un saludo!!


Título: Re: Duda con Pascal
Publicado por: IDarknightI en 19 Junio 2010, 23:30 pm
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:

Código:
// 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.


Título: Re: Duda con Pascal
Publicado por: yako-_- en 20 Junio 2010, 02:46 am
Gracias por la respuesta. Al final lo consegui con el siguiente código ayudado de un compañero:
Código
  1. if x2>x1 then
  2.         begin
  3.         dx:=x2-x1;
  4.         end
  5.        else
  6.         begin
  7.         dx:=x1-x2;
  8.         end;
  9.  
  10.        if y1>y2 then
  11.         begin
  12.         dy:=y1-y2;
  13.         end
  14.        else
  15.         begin
  16.         dy:=y2-y1;
  17.         end;
  18.  
  19.        if ((dx <= r1+r2) and (dy<=r1+r2)) then
  20.         begin
  21.         derecha:=true;
  22.         arriba:=false;
  23.         //izquierda:=true;
  24.         //abajo:=false;
  25.         end;        

PD: la pag que me diste no rula

Un saludo!! y gracias de nuevo por la respuesta


Título: Re: Duda con Pascal
Publicado por: Malvinas en 20 Junio 2010, 19:40 pm
Una aclaración: En el IF, si sólo es una Acción, no hace falta usar Begin y End.

Es decir:

Código
  1. if (Condicion) then
  2.    Accion1
  3. else
  4.    Accion2;

Saludos.


Título: Re: Duda con Pascal
Publicado por: yako-_- en 24 Junio 2010, 06:28 am
ok, gracias