Ir al contenido

publicidad

Foto

Colisiones (esa palabra maldita)


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
9 respuestas en este tema

  • wiyarmir

  • Elder

  • vida restante: 100%
  • Registrado: 27 mar 2009
  • Mensajes: 108
#1

Escrito 30 abril 2009 - 22:01

Buenas, resulta que estoy con un jueguecillo en SDL (cuando esté jugable, sabreis de él, va de tanques ;-) ) y estaba dándole vueltas a las colisiones...

Hasta ahora, las había hecho en Flash con el comodísimo hitTest(), pero ahora estoy viendo la cruda realidad... xD

Os pongo en situación:

C++

Todo es creado y destruido dinámicamente

Creado y destruido (y controlado) por una clase estilo "dios" que recibe los eventos de la SDL y actúa en consecuencia

Clases Tanque, Jugador, Enemigos, Bala (entre otras, ya me meteré con objetos del escenario más adelante)

Enemigos: Lista enlazada de tanques

Jugador: Clase simple heredada de Tanque

Bala: He aquí un problemilla... Como es creada dinámicamente (y destruida cuando llega a los bordes de la pantalla por ella misma) queda un poco guarrete cuando intento que se mire sus propias colisiones
Problema: ¿Dónde implemento las colisiones? ¿Clase controlador, enemigos, bala... estilo Juan Palomo (cada uno su colision)? Llevo unos días evitando el problema y haciendo tonterías mientras tanto pero no puedo demorarlo más (es un proyecto de la facultad y tiene fecha XD ) y quizás el escribirlo todo me ayude a verlo algo más claro...

¡A ver qué se os ocurre! Yo mientras tanto leeré lo que he escrito una y otra vez a ver si me inspiro...

#2

Escrito 30 abril 2009 - 22:48

En el motor del juego, durante el ciclo habrá un momento en el que se actualizan los sprites. Las balas estarán en alguna estructura de algún tipo. Lo que tienes que hacer es por cada una actualizar su posición y comprobar si ha colisionado con un enemigo y tomar las medidas necesarias.

Si puedes comprobar si llegan al borde también puedes hacer lo mismo con las colisiones, le indicas que se autodestruya, que destruya al tanque y muestras una explosión.

Si quieres ayuda más concreta danos más datos.

  • wiyarmir

  • Elder

  • vida restante: 100%
  • Registrado: 27 mar 2009
  • Mensajes: 108
#3

Escrito 30 abril 2009 - 23:13

El ciclo del juego consiste en actualizar los gráficos cada 27ms y los eventos cada 7ms, las colisiones las había puesto dentro del grupo de los eventos...

La duda radicaba más en quien destruye a quien, ya que con el tema punteros es algo lioso... aunque la verdad ayuda bastante verlo escrito, la próxima vez lo escribo en papel antes de molestaos XD

¿Qué datos necesitarías?

#4

Escrito 01 mayo 2009 - 02:08

Yo lo que hago es que cada x tiempo invoque unos rayos -raycast- que no son mas que unos vectores, desde el centro del objeto a los bordes. Invoco 12 por cada objeto complejo -enemigos y prota sobre todo-. Uno al frente, otro atras, izquierda, derecha, arriba, abajo y en diagonal. Si esto colisiona con algun objeto pues reacciona.

Al disparar lo que hago es un raycast del alcance del arma. Mi motor me devuelve el primer objeto con el que colisiona, si es una pared pues crea un plano con textura de impacto ahi. Si es enemigo crea unas particulas rojas y quita vida al enemigo.


Para las explosiones como son esfericas del todo lo que hago es crear una esfera, ponerle textura de fuego, y si colisiona con algo ese algo sale despedido hacia el otro lado y le quito vida.

Pero queda mas realista crear varios raycast mas para asegurarse de que no atraviesa paredes.

De todas formas, puedes bajarte el codigo de cualquier quake y ver como lo tratan ahi. Si te fijas, es algo similar. Solo lo tienes que adaptar a lo tuyo.

Un saludo.

  • wiyarmir

  • Elder

  • vida restante: 100%
  • Registrado: 27 mar 2009
  • Mensajes: 108
#5

Escrito 01 mayo 2009 - 12:00

Ellolo17, me suena a que hablas en 3D... yo por ahora no he salido del plano XD

  • Xinef

  • HARENA TIGRIS

  • vida restante: 100%
  • Registrado: 15 oct 2002
  • Mensajes: 7.003
#6

Escrito 01 mayo 2009 - 12:18

Yo creo que lo mejor es hacer un método virtual en la clase abstracta de la que hereden tus sprites "opacos" (susceptibles de colisión). El método recibiría como parámetro de entrada otro objeto.

Luego cada tipo de sprite implementará la colisión que creas necesaria.


Ventaja de eso?

Puedes tener varios métodos de colisión, en función de la necesidad. Por ejemplo, te puede interesar que el personaje principal tenga una colisión más "fina" con múltiples rectángulos y que personajes menos importantes tengan colisión circular o con un sólo rectángulo.

Para comprobar las colisiones, sólo tendrías que recorrer los objetos visibles, activos o como los hayas definido... bien todos, si son pocos o usando zonas de colisión (comprobación previa de distancia, etc, etc).

  • wiyarmir

  • Elder

  • vida restante: 100%
  • Registrado: 27 mar 2009
  • Mensajes: 108
#7

Escrito 01 mayo 2009 - 12:22

Hmmm parece muy interesante lo del método virtual y heredado... Muchas gracias Xinef, voy manos a la obra :)

#8

Escrito 05 mayo 2009 - 11:17

Ayer estuve haciendo practicas con DarkPhysics.

Dios mio! estoy encantado. Con solo un par de comandos ya se encarga el sistema solo y de forma muy eficaz de todas las colisiones.

Y se configura a la que se invoca, pudiendo decir hasta que altura puede autosubirse el personaje para subir escalones, la inclinacion maxima que puede subir, le puedes dar colision de caja o de capsula, segun como lo veas...

Solo con 50 lineas de codigo me cargaba un escenario prehecho en el blender con sus texturas y todo -solo cargando el modelo *.x te coge ya las texturas- y con ponerle que quieres que sea un objeto solido y que calcule de todo ese escenario la colision por poligonos... iba de putisima madre. Y en esos 50 lineas de codigo la mayoria eran para controlar el personaje y la camara!

Estoy muy sorprendido, iré haciendo mas practicas. Por ahora he visto que la colision funciona con todos los poligonos renderizados. Si por culling o por esconderlo no aparecen no hay colision a no ser que hayas creado una caja de colision ahi.

Lo mas complicado ha sido acostumbrarme un poco a usar fuerzas en vez de coordenadas, pero es igualmente facil.

Y eso que aun no he probado todo del darkphysics... al igual de eso con poner un solo comando en un objeto 3d, conviertes ese objeto 3d en una "tela" creando un ragdoll!! Y sin necesidad de ponerle huesos, ni limites ni nada. Solo al decir que quieres que sea tela le dices que queires que sea consistente pero que se doble .

Vamos, la leche. Ya ire probando mas...

Un saludo.

  • wiyarmir

  • Elder

  • vida restante: 100%
  • Registrado: 27 mar 2009
  • Mensajes: 108
#9

Escrito 05 mayo 2009 - 14:16

Ayer estuve haciendo practicas con DarkPhysics.
[...]
Con solo un par de comandos ya se encarga el sistema solo y de forma muy eficaz de todas las colisiones.

:o Qué gustazo, ¿no? Tendré que probarlo algún día :D

#10

Escrito 05 mayo 2009 - 14:51

Flipando estuve.

En la media hora del desayuno matutino, en vez de ir al bar a por algo me hice una pequeña escena de prueba con un tunel, unas cuestas, varias paredes... y lo dicho:

Un comando para decir que objeto es solido y que la colision se haga con todas las caras, otro para decir que el cubo que usaba como protagonista tuviese un cubo o una "pildora" como colision -probe los dos-, que pueda subir cuestas de hasta 60 º, que pueda subir automaticamente hasta la mitad de su altura -todo esto en el mismo comando- y un par de comandos para colocar la camara detras de el, que si se pulsa izquierda gire a la izquierda, a la derecha para girar alli, adelante para que se mueva a una velocidad de 2 -por poner algo XD - y atras para lo mismo en el otro sentido.

Y listo! esto se encargaba solo de todo!

Con esto puedo hacer maravillas o buscar clientes entre algunas empresas de diseño grafico 3d o interioristas, ellos me pasan los mapas, yo cargo eso con el motor y en seguida ya pueden moverse por el interior colisionando sin problemas con todo.

Una delicia.

Un saludo.


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
publicidad