Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-12-2008
Luvac Luvac is offline
Miembro
 
Registrado: nov 2007
Posts: 24
Poder: 0
Luvac Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 30-12-2008
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 19
Kipow Va por buen camino
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].....................
Responder Con Cita
  #3  
Antiguo 30-12-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 30-12-2008 a las 10:32:34.
Responder Con Cita
  #4  
Antiguo 30-12-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Te pongo el ejemplo completo, he retocado algunas cosas y es casi lo que necesitas.

Un saludo.
Archivos Adjuntos
Tipo de Archivo: zip Colisiones.zip (3,2 KB, 43 visitas)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 30-12-2008
Luvac Luvac is offline
Miembro
 
Registrado: nov 2007
Posts: 24
Poder: 0
Luvac Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 30-12-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Lo he subido al FTP del club; Prueba a descargarlo de allí. Seccion Ejemplos de Win-32.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 31-12-2008
Luvac Luvac is offline
Miembro
 
Registrado: nov 2007
Posts: 24
Poder: 0
Luvac Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 31-12-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 06-01-2009
Luvac Luvac is offline
Miembro
 
Registrado: nov 2007
Posts: 24
Poder: 0
Luvac Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 06-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Supongo que dependiendo de la posición del impacto deberas cambiar la dirección de uno o varios objetos.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Detectar llamadas pollo_c Varios 4 05-02-2007 11:14:21
Colision registros Bluechip Conexión con bases de datos 3 27-11-2006 07:54:03
Detectar IP Carliviris Varios 3 17-04-2006 19:18:26
Detectar procesador Mic82 Varios 1 12-11-2004 09:45:35
Detectar Hora AM-PM AGAG4 Varios 4 22-10-2004 20:34:18


La franja horaria es GMT +2. Ahora son las 15:56:01.


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
Copyright 1996-2007 Club Delphi