El titulo lo dice todo... necesito un detector de colisiones para directx8 con vb6 yo tengo esta funcion que no se si esta bien... si alguien sabe de directx...
Private Function GetDist(intX1 As Single, intY1 As Single, intX2 As Single, intY2 As Single) As Single
'Devuelve la distancia entre los dos puntos
GetDist = Sqr((intX1 - intX2) ^ 2 + (intY1 - intY2) ^ 2)
ChaMeR
Hola Chamer, la funcion que pusiste bien como ahi dice, calcula la distancia absoluta entre dos puntos en un plano cartesiano (2D) siendo (intX1, intY1) las coordenadas del objeto 1 y (intX2, intY2) las del objeto 2. Si el resultado de la funcion esa es 0, entonces ambos objetos estan en el mismo lugar, lo que indicaria una superposicion (la colision ya ocurrio, ya que ambos estan en la misma posicion [ocupan el mismo espacio]), quizas podrias usar esa misma funcion pero aplicandole un margen, si suponemos que los objetos son circulares, de un radio de 3, con que la distancia obtenida sea menor o igual a 3 indica una colision.
Quizas programando todo en directX haya alguna funcion para contrlar automaticamente la colision de sprites (o su equivalente en DX).
Espero haber ayudado algo.
Y a ver la opnion de alguein que tengas mas idea de uso de DX, ya que yo nunca lo use (siempre me hice mis sprites a mano :/ ).
Baii.
Gracias Predicador, mira yo te comento, yo tengo un laberinto y necesito hacer que cuando el personaje vamos a llamarlo mesh choque con alguna pared el DKISTATE.KEY(200) que vendria a ser la flechita de arriba, deje de funcionar, es decir que detecta la colision y no avanza mas, el mesh si contiene objetos circulares pero el laberinto son todos prismas rectangulares.
ChaMeR
Chamer, hay dos formas de hacerlo (que al menos se me ocurren ahora), veamos:
1) Es tal cual como la estas haciendo ahora, mover al muñeco y detectar las colisiones hacia todos los lados con la funcion distancia, pero para un laberinto, detectar colisiones de ese modo no es el adecuado, ademas de que forzas una repersentacion del laberinto que no es la adecuada; por eso creo que el mejor metodo es el 2.
2) Este metodo es clasico para la resolucion de laberintos, consta de una matriz que compone el laberinto, todo el recorrido y analisis se realiza sobre la matriz, luego la matriz es usada para representar graficamente.
Por ejemplo, una matriz de 10x10, donde P es pared y M es muñequito, E la entrada y S la salida:
PEPPPPPPPP
PMP P
P PPPP P
PPP P P P
P P P P
P PPPP P P
P P P
P PPPPPP P
S P P
PPPPPPPPPP
Luego, detectar una colision es tan facil como mirar antes de moverse en una direccion dada si hay un espacio o una P, si es P no se puede avanzar (se previene la colision), si no es P se avanza sin problemas (aca haces uso de una rutina grafica para mover el mñeco dentro del laberinto sin preocuparte si colisiona o no, ya que ese control lo haces solo la matriz, el grafico es solo una representacion "linda" de la matriz).
Esto es:
Siendo la matriz laberinto[1..10, 1..10] (una matriz de 10x10)
Si estas en laberinto[x,y] y te moves un lugar a la derecha entonces controlas si laberinto[x+1,y] = " " para ver si podes avanzar (esto lo podes imlpementar muy facilmente con una funcion).
El verdadero control es a nivel matriz ;) lo grafico es un mapeo de la matriz en la pantalla!!
Espero que sea entendible lo que acabo de escribir.
El laberinto se resuelve automaticamente o guiado por una persona? si tenes que hacerlo que se resuelva automaticamente, podrias darle una mirada al metodo de distancia Manhatan.
Baii :D
Entendi todo Predicador el tema es que vos decis que "antes de moverse en una direccion dada si hay un espacio o una P, si es P no se puede avanzar (se previene la colision), si no es P se avanza sin problemas"
Esto no es tan asi ya que el "muñeco" no se mueve de a casilleros sino que se mueve de a poco, nose si se entiende, vos apretas la flecha y avanza +1 en la coordenada, no es que avanza un casillero entonces puedo detectar si a la izq hay P o a la der hay P...creo que no se entendio cualquier cosa avisa
Ah y no, no es de resolucion automatica, vos manejas al muñeco
ChaMeR
chamer, te entendi perfect oa lo que te referias, pero unicamente es una cuestion de escalas a lo que te referis, ya que se podria implemenatr de varias maneras:
1) el avance no es bruzco, sino que avanza de una casilla (supongamos de 10 pixeles) a la otra no de a saltos, sino incrementando de a 1 pixel a la vez (pro una vez que larga el avance, el usuario no puede frenarlo) [quizas esta sea la alternativa menos atractiva ya que daria la sensacion de no control al usuario].
2) la matriz es mas grande y el tamaño de los pasillos tambien, de este modo por ejemplo un corredor seria:
P P
P P
P P
PPPPPPPP (6 espacios)
3) usar un indicador de coordenadas real (me refiero al tipo de dato) donde la parte entera indica la casilla y la parte decimal indica fraccion de casilla, por ende si la coordenada en X es 1,8 quiere decir que esta en la casilla 1 en el medio del lado derecho de la mitad derecha (por ejemplificar el ancho de una celda seria |xxxxxxxxXx| donde la X marca la posicion) de este modo solo controlas antes de avanzar por una posible colision mirando si en la parte entera coordenada incrementada hay pared o no.
Se podrian usar otros esquemas similares o algun hibrido entre estos.
Creo que esta es una de las formas mas simples de hacerlo, ya que si o si deberias almacenar la estructura del laberinto en una matriz o algo, sobre todo si queres realizar generacion de laberintos en forma random.
Baii.