Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Detectar colision (https://www.clubdelphi.com/foros/showthread.php?t=62514)

Luvac 30-12-2008 07:31:10

Detectar colision
 
Bueno mi problema es ese como detectar una colision les explico tengo en mi forma un boton que donde doy click con el raton el boton se mueve el problema es como hacer para que se detenga cuando encuentre a otro boton este es el codigo que tengo hasta ahora

/Left
if(X>Button1->Left)
{
for(int x=Button1->Left; x<=X;x++)
{
Button1->Left=x;
}
}
else
{
for(int x=Button1->Left; x>=X;x--)
{
Button1->Left=x;
}
}

//Top
if(Y>Button1->Top)
{
for(int x=Button1->Top; x<=Y;x++)
{
Button1->Top=x;
}
}
else
{
for(int x=Button1->Top; x>=Y;x--)
{
Button1->Top=x;
}
}

habia pensado con un if
if(Button1->left+90==Button2->left && Button1->Top+90==Button2->Top)
x=X;
pero no respeta alguna sugerencia. :(

Kipow 30-12-2008 08:16:54

Talvez te ayuda deberias de crear una funcion que verificara en todos los componentes existentes en el form para verificar esa "colision"

la forma cuenta con una propiedad Components que incluye todos los componentes de la misma.

Código Delphi [-]
for I := 0 to ComponentCount - 1 do
      if (Components[i].....................

Neftali [Germán.Estévez] 30-12-2008 10:25:08

Una posible rtuina de colisiones podría ser algo así:

Código Delphi [-]
// Calcular colisión entre dos objetos
function TForm1._CalculateColision(sh1, sh2:TShape): boolean;
var
  r1, r2, b1, b2:Integer;
begin

  Result := False;

  r1 := (sh1.Left + sh1.Width);
  r2 := (sh2.Left + sh2.Width);
  b1 := (sh1.Top + sh1.Height);
  b2 := (sh2.Top + sh2.Height);

  // COLISION?
  if (((sh1.Left < sh2.Left) and (r1 > sh2.Left)) and
      ((sh1.Top < sh2.Top) and (b1 > sh2.Top))) or

     (((sh2.Left < sh1.Left) and (r2 > sh1.Left)) and
      ((sh2.Top < sh1.Top) and (b2 > sh1.Top))) or

     (((sh1.Left < sh2.Left) and (r1 > sh2.Left)) and
      ((sh2.Top < sh1.Top) and (b2 > sh1.Top))) or

     (((sh2.Left < sh1.Left) and (r2 > sh1.Left)) and
      ((sh1.Top < sh2.Top) and (b1 > sh2.Top))) then begin


    Result := True;
  end;

end;

Está en Delphi y usa TShapes, pero es fácil de entender y creo que puedes pasarla a Builder y cambiar los TShape por TButton sin grandes problemas.

Neftali [Germán.Estévez] 30-12-2008 10:33:31

1 Archivos Adjunto(s)
Te pongo el ejemplo completo, he retocado algunas cosas y es casi lo que necesitas.

Un saludo.

Luvac 30-12-2008 19:28:34

Bueno gracias por ayudarme pero aun no logro hacerlo el ejemplo que me dejastes no logro bajarlo me aparece una pagina de php, podrias poner el codigo, he intentado con lo que dejastes y funciona a veces y otras se cicla te dejo el codigo que llevo:

Result=false;
if(X>Button1->Left)
{
Button1->Left+=10;
}
if(X<Button1->Left)
{
Button1->Left-=10;
}
//Left
if(X>Button1->Left)
{
for(int x=Button1->Left; x<=X;x++)
{
Button1->Left=x;
colision();
if (Result==true)
{
x=X;
}
}
}
else
{
for(int x=Button1->Left; x>=X;x--)
{
Button1->Left=x;
colision();
if (Result==true)
{
x=X;
}
}
}
if( Result!=true)
{
//Top
if(Y>Button1->Top)
{
for(int x=Button1->Top; x<=Y;x++)
{
Button1->Top=x;
colision();
if (Result==true)
{
x=X;
}
}
}
else
{
for(int x=Button1->Top; x>=Y;x--)
{
Button1->Top=x;
colision();
if (Result==true)
{
x=X;
}
}
}
}
}
//---------------------------------------------------------------------------
void TForm1::colision()
{
int r1, r2, b1, b2;
r1=(Button1->Left + Button1->Width);
r2= (Button2->Left + Button2->Width);
b1= (Button1->Top + Button1->Height);
b2=(Button2->Top + Button2->Height);
if (((Button1->Left < Button2->Left) && (r1 > Button2->Left)) && ((Button1->Top < Button2->Top) && (b1 > Button2->Top)) ||((Button2->Left < Button1->Left) && (r2 > Button1->Left)) &&((Button2->Top < Button1->Top) &&(b2 > Button1->Top)) ||((Button1->Left < Button2->Left) &&(r1 > Button2->Left)) &&((Button2->Top < Button1->Top) &&(b2 > Button1->Top)) ||((Button2->Left< Button1->Left) &&(r2 > Button1->Left)) && (( Button1->Top < Button2->Top) &&(b1 > Button2->Top)))
{
Result=true;
}

}
//---------------------------------------------------------------------------

tiene un problema que estoy resolviendo ya que cuando te acercas al otro boton se para, pero ya no se mueve porque la condicion se cumple ya que estan cerca por eso en la funcion de mouse down le incremento 10 para que se aleje cada que se da un click. espero me puedas dar una mano:(

Neftali [Germán.Estévez] 30-12-2008 23:24:04

Lo he subido al FTP del club; Prueba a descargarlo de allí. Seccion Ejemplos de Win-32.

Luvac 31-12-2008 01:41:05

Gracias por tu pronta respuesta es mas o menos lo que queria hacer pero esta en delphi, me va a costar un poco pasarlo a builder pero bueno gracias

Neftali [Germán.Estévez] 31-12-2008 09:54:00

Ves probando a traducir por trozos, si te atascas en alguno seguro que aquí en los foros hay quien te da una mano, que hay gente que domina ambos lenguajes... De todas formas son instrucciones sencillas, así que no te debería costar entenderlas.

Luvac 06-01-2009 07:06:44

:D Ya pude solo que me volvi a atorar, la pregunta es como continuar despues de la colision,mas detalladamente, la colision ocurre cuando el boton baja choca contra el otro es decir la colision ocurre por arriba, entonces el boton se puede mover a los lados pero no hacia abajo como hago esto, alguna idea.

Neftali [Germán.Estévez] 06-01-2009 23:37:17

Supongo que dependiendo de la posición del impacto deberas cambiar la dirección de uno o varios objetos.


La franja horaria es GMT +2. Ahora son las 11:19:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi