PDA

Ver la Versión Completa : Detectar colision


Luvac
30-12-2008, 07:31:10
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.


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í:


// 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
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 (http://www.terawiki.clubdelphi.com/); Prueba a descargarlo de allí (http://www.terawiki.clubdelphi.com/archivos/Delphi-Win32/Ejemplos/Ejemplo_Colisiones.zip). 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.