elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Colision de 2 image [Solucionado]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Colision de 2 image [Solucionado]  (Leído 7,508 veces)
skapunky
Electronik Engineer &
Colaborador
***
Desconectado Desconectado

Mensajes: 3.667


www.killtrojan.net


Ver Perfil WWW
Colision de 2 image [Solucionado]
« en: 4 Septiembre 2008, 02:11 am »

Buenas a todos, estoy programando un juego de marcianitos tipo space invaders en visual basic y tengo el siguiente problema.

Hay una nave en un image3 y el dibujo del disparo producido por mi nave(la que manejo) esta en un image2. Todo funciona bien, el disparo se acerca al image de la nave enemiga (image3) y aquí he creado una funcion para detectar la colision y la he puesto en un timer:

Private Sub Timer3_Timer()
'Rutina para detectar colisiones nave mala 1
If (Image2.Left = Image3.Left) And (Image2.Top = Image3.Top) Then
MsgBox "Tocado", vbInformation
End If
End Sub

Pero...no funciona, se cruza el disparo con la nave enemiga y no sale em msgbox. Nose porque me temo que quiza al ser dimensionado por twips el centro de las dos imágenes no llegan a tocar aunque aparentemente sea asi...No se, alguien tiene alguna solucion ?

PD: El timer he probado tiempos de 1 mS a un par de segundos y no capta nada..No creo que este sea el problema.


« Última modificación: 4 Septiembre 2008, 13:49 pm por skapunky » En línea

Killtrojan Syslog v1.44: ENTRAR
seba123neo
Moderador
***
Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: Colision de 2 image
« Respuesta #1 en: 4 Septiembre 2008, 02:57 am »

Hola, pues tenes que ver primero el procedimiento de el movimiento del proyectil...puede que lo estes moviendo de una forma en que nunca sea igual al top de la imagen del enemigo...o sea si lo moves de 120 en 120 puede ser ...pero si lo moves por ejemplo de 35 en 35 no te va a detectar nada...ahi esta la cuestion busca el numero exacto que funcione para todos...trabajando con los twips...no es dificil...y otra cosa ahi en tu codigo esta mal porque lo unico que tiene que comparar es el Top ...pero no el left...y aparte tenes que comparar si la imagen del proyectil es igual al Top de la iamgen enemiga menos la altura de esta misma...para que lo detecte cuando lo toque en la punta ..ahi lo esta haciendo pero cuando llega al final de la nave....yo hice de estas boludeces muchas jeje  :xD por ahi habia posteado uno mio cuando empeze en visual ..si queres lo psoteo asi ves mas o menos la idea..tiene para scores y elegir naves etc...bien basico...aparte uso una api que se llama InterSectRect que como el nombre lo indica es para justamente detercar coliciones entre cajas...hasta te podes hacer un simple pacman con esta api que tambien hice  :xD..

saludos.


En línea

cobein


Desconectado Desconectado

Mensajes: 759



Ver Perfil WWW
Re: Colision de 2 image
« Respuesta #2 en: 4 Septiembre 2008, 08:50 am »

En mi opinion tendrias que utilizar BitBlt, regiones y pixeles para lo que queres hacer.
En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
Mad Antrax
Colaborador
***
Desconectado Desconectado

Mensajes: 2.164


Cheats y Trainers para todos!


Ver Perfil WWW
Re: Colision de 2 image
« Respuesta #3 en: 4 Septiembre 2008, 09:20 am »

Yo cambiaría el modo de trabajo, de twips a pixel y prueba a ver. Trabajar con gráficos en VB6 es un poco "pastel"...
En línea

No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
Hans el Topo


Desconectado Desconectado

Mensajes: 1.754


"Estoy cansado de no hacer nada"


Ver Perfil WWW
Re: Colision de 2 image
« Respuesta #4 en: 4 Septiembre 2008, 11:00 am »

no tiene mucho sentido trabajar con movimiento, animaciones sobre vb6 ya que acabarás teniendo problemas con el refresco

si realmente quieres hacer algo "decente" dede vb6 y en condiciones te recomiendo la utilización de directX y si quieres ahorrarte la tediosa faena de saberte directX al dedillo existen librerías muy bien documentadas

te dejo un jueguecillo que híce en su día

http://foro.elhacker.net/programacion_vb/twip_estrategic_videojuego_en_visual_basic_60-t164149.15.html

En línea

skapunky
Electronik Engineer &
Colaborador
***
Desconectado Desconectado

Mensajes: 3.667


www.killtrojan.net


Ver Perfil WWW
Re: Colision de 2 image
« Respuesta #5 en: 4 Septiembre 2008, 12:06 pm »

E probado en pixeles y nada..hace lo mismo.

Citar
Hola, pues tenes que ver primero el procedimiento de el movimiento del proyectil...puede que lo estes moviendo de una forma en que nunca sea igual al top de la imagen del enemigo...o sea si lo moves de 120 en 120 puede ser ...pero si lo moves por ejemplo de 35 en 35 no te va a detectar nada...ahi esta la cuestion busca el numero exacto que funcione para todos...trabajando con los twips...no es dificil...y otra cosa ahi en tu codigo esta mal porque lo unico que tiene que comparar es el Top ...pero no el left...y aparte tenes que comparar si la imagen del proyectil es igual al Top de la iamgen enemiga menos la altura de esta misma...para que lo detecte cuando lo toque en la punta ..ahi lo esta haciendo pero cuando llega al final de la nave....yo hice de estas

Con esto qwue comentas creo que has dado en la clave y es aquí desde un principio que sospecho de mi error. Es lo que comento que los centros no se encuentran.

Lo que probare será de un image aumentarle el radio de colision, así almenos seguro que el centro del image del misil colisionara exitosamente con el image de la nave con un radio mayor que el propio centro .

He creado la siguiente rutina con la idea de que detecte la colision y la he puesto en un timer a 1mS.

Código
  1. Private Sub Timer3_Timer()
  2.  
  3. Dim radio, radio2, imagen3top, imagen3left As Integer
  4. Dim colision As Boolean
  5.  
  6. For radio = 0 To 30
  7.    For radio2 = 0 To 30
  8.        imagen3top = Image3.Top + radio
  9.        imagen3left = Image3.Left + radio2
  10.           If (Image2.Top = imagen3top) And (Image2.Left = imagen3left) Then
  11.             colision = True
  12.            End If
  13.    Next
  14. Next
  15.  
  16. If colision = True Then
  17. MsgBox "tocado"
  18. Image2.Enabled = False
  19. Image3.Enabled = False
  20. End If
  21. End Sub

Pero no detecta nada...Al final esta en píxeles.
« Última modificación: 4 Septiembre 2008, 13:45 pm por skapunky » En línea

Killtrojan Syslog v1.44: ENTRAR
skapunky
Electronik Engineer &
Colaborador
***
Desconectado Desconectado

Mensajes: 3.667


www.killtrojan.net


Ver Perfil WWW
Re: Colision de 2 image
« Respuesta #6 en: 4 Septiembre 2008, 13:49 pm »

Atencion, esta solucionadooooooooooooooooooooooooooooo lo que el anterior codigo hay un error, detecta la colision pero hacia la izquierda de la nave:

Cambiando lo siguiente ya funciona:

imagen3top = Image3.Top - radio
imagen3left = Image3.Left - radio2

Codigo correcto:
Código
  1. Private Sub Timer3_Timer()
  2.  
  3. Dim radio, radio2, imagen3top, imagen3left As Integer
  4. Dim colision As Boolean
  5.  
  6. For radio = 0 To 30
  7.    For radio2 = 0 To 30
  8.        imagen3top = Image3.Top - radio
  9.        imagen3left = Image3.Left - radio2
  10.           If (Image2.Top = imagen3top) And (Image2.Left = imagen3left) Then
  11.             colision = True
  12.            End If
  13.    Next
  14. Next
  15.  
  16. If colision = True Then
  17. MsgBox "tocado"
  18. Image2.Enabled = False
  19. Image3.Enabled = False
  20. End If
  21. End Sub
« Última modificación: 4 Septiembre 2008, 13:51 pm por skapunky » En línea

Killtrojan Syslog v1.44: ENTRAR
Hans el Topo


Desconectado Desconectado

Mensajes: 1.754


"Estoy cansado de no hacer nada"


Ver Perfil WWW
Re: Colision de 2 image
« Respuesta #7 en: 4 Septiembre 2008, 14:07 pm »

se me olvido responder al tema de colisión,

para saber si algo ha colisionado en algo se hace mediante áreas,

si quieres comprobar si una img1 colisiona con img2 es bastante simple :

tienes que ir comprobando que los "vértices" del cuadrádo/rectángulo se encuentren dentro del área del otro cuadrádo/rectángulo y en eso entra en juego el ancho del objeto

por ejemplo para saber si su vértice izquierdo del img2 se encuentra dentro del área de img1 sería algo así

para comprobar el eje x
la posición más a la izquierda de img2 debe ser mayor que la posición más a la izquierda de img1 y  la posición más a la derecha de img mayor que la posición img2 izquierda y para que se encuentre en colisión
debe cumplir que el eje y también se encuentre,

se haría lo mismo con el rest de vértices

if ((img1.left < img2.left and img1.left+img1.width>img2.left) or(... resto de comprobaciones ejes x))  and  ((img1.top < img2.left and img1.top+img1.height>img2.top) or (... resto de comprobaciones ejes y)) then
 ' colisiona
else
 ' no colisiona
endif


se queda un if algo grande pero bueno

Te dejo otros dos juegos en la que pongo en práctica lo que digo he actualizado sus links de descarga.

En garrapato invasion no utilizo directx
http://foro.elhacker.net/programacion_vb/garrapato_invasion-t129166.0.html;msg604315

Lucha de sangre con direct x
http://foro.elhacker.net/programacion_vb/source_juego_lucha_de_sangre_humanoslicantroposvampiros-t164714.0.html;msg777233#msg777233


P.D. atención se ha escrito un nuevo comentario ... etc ...
En línea

cobein


Desconectado Desconectado

Mensajes: 759



Ver Perfil WWW
Re: Colision de 2 image [Solucionado]
« Respuesta #8 en: 4 Septiembre 2008, 14:52 pm »

Producto del aburrimiento hice una funcion generica para detectar si 2 objetos estan colisionando, usa api y es mas que simple.

Código:
Option Explicit

Private Type RECT
    Left        As Long
    Top         As Long
    Right       As Long
    Bottom      As Long
End Type

Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function IntersectRect Lib "user32" (lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long

Private Function IsColliding(ByVal obj1 As Control, ByVal obj2 As Control) As Boolean
    Dim tRECT1  As RECT
    Dim tRECT2 As RECT
   
    With obj1
        SetRect tRECT1, .Left, .Top, .Left + .Width, .Top + .Height
    End With
    With obj2
        SetRect tRECT2, .Left, .Top, .Left + .Width, .Top + .Height
    End With
    IsColliding = IntersectRect(tRECT1, tRECT1, tRECT2)
End Function

Como llamar a la funcion

Código:
Private Sub Form_Load()
    Debug.Print IsColliding(Image1, Image2)
End Sub
En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Colisión en expansión protestas anti-estadounidenses en Yemen « 1 2 »
Foro Libre
מילים מהלב 12 5,836 Último mensaje 16 Septiembre 2012, 22:44 pm
por m0rf
Comprobar colisión de 2 cuadrados en SDL
Programación C/C++
Stereo 7 4,352 Último mensaje 24 Febrero 2013, 15:32 pm
por Anastacio
[SFML] Rebote de colisión « 1 2 »
Programación C/C++
DeMoNcRaZy 13 7,149 Último mensaje 3 Julio 2015, 17:40 pm
por Maurice_Lupin
Colisión entre objetos JS
Desarrollo Web
SrTrp 6 4,804 Último mensaje 14 Julio 2017, 02:29 am
por SrTrp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines