Ir al contenido

publicidad

Foto

No he podido realizar una colision exitosa


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

  • uziel5

  • Ultima

  • vida restante: 100%
  • Registrado: 08 sep 2007
  • Mensajes: 1.955
#1

Escrito 15 agosto 2011 - 03:32

Hola, actualmente estoy aprendiendo a programar videojuegos 2d y ya he aprendido a animar sprites y a detectar colisiones tanto por rectángulos como por píxeles, pero ahora mismo estoy queriendo hacer que mi personaje no atraviese ciertas partes del mapa, y que cuando este esté en el aire caiga, como si hubiese gravedad.

Navegando en internet me encontré que para dibujar un mapa la pantalla se dividía en secciones y en cada sección se dibujaban unos tiles que se almacenaban previamente en un array y se utilizaba un método para determinar si el personaje podía desplazarse a cierta zona del mapa.

Yo hasta ahora he estado dibujando el mapa de una forma distinta, lo que hago es dibujar toda una imagen en mi pantalla, y encima dibujo a mi personaje. Para que mi personaje no atraviese una parte que es sólida lo que tenía pensado hacer es cubrir esta zona con un rectángulo y darle órdenes a mi personaje si estaba colisionando con esta, el problema es que no se si esta forma sea correcta, pues solo fue algo que se me vino a la mente, incluso no se si la forma en la que dibujo el mapa sea también válida.

En internet he visto mas de una forma de determinar colisiones con el mapa, pero quisiera que los mas experimentados y que saben de este me dijeran mas o menos que método utilizar, y si me pueden explicar en que consiste se los agradecería bastante.

Un saludo y gracias por su tiempo.

  • Ollydbg

  • Ultima

  • vida restante: 100%
  • Registrado: 05 sep 2008
  • Mensajes: 6.259
#2

Escrito 15 agosto 2011 - 10:06

1) .NET Tutorial 9. Crear mapeados de tamaño infinito (Parte I)

2) Interactuar con el "mapeado":

http://www.youtube.com/watch?v=iTaE7BkA1Hc

  • malditis

  • Neonate

  • vida restante: 100%
  • Registrado: 07 feb 2006
  • Mensajes: 68
#3

Escrito 15 agosto 2011 - 11:01

Para que mi personaje no atraviese una parte que es sólida lo que tenía pensado hacer es cubrir esta zona con un rectángulo y darle órdenes a mi personaje si estaba colisionando con esta, el problema es que no se si esta forma sea correcta, pues solo fue algo que se me vino a la mente, incluso no se si la forma en la que dibujo el mapa sea también válida.


Vas bien, hay mil maneras de hacerlo, hazlo de la froma que te sientas mas a gusto.

Tener una lista de rectangulos o circulos para las colisiones es una forma bastante comun.

Simplemente, antes de mover un objeto, calcula su nueva posicion, comprueba si colisiona en la nueva posicion con algun otro, y si lo hace, ajusta la posicion segun las necesidades del objeto. (esta es la parte mas chula)

Suerte

  • uziel5

  • Ultima

  • vida restante: 100%
  • Registrado: 08 sep 2007
  • Mensajes: 1.955
#4

Escrito 15 agosto 2011 - 20:15

Hola, muchas gracias por las respuestas, me voy a guiar mas por el comentario de malditis, así que seguiré trabajando de la forma en que lo iba haciendo, aunque voy a estudiar también el método de ollydbg que nunca viene mal aprender y quizás en un futuro no muy lejano lo aplique.

Seguiré dándome una vuelta por si alguien me recomienda algo mas.

Saludos.

  • uziel5

  • Ultima

  • vida restante: 100%
  • Registrado: 08 sep 2007
  • Mensajes: 1.955
#5

Escrito 18 agosto 2011 - 06:51

Jodas, no he logrado hacer una correcta colisión de rectángulos, debido a que influye la dirección en la que mi sprite está colisionando con mi rectangulo.

Lo que hago es si por ejemplo quiero que mi sprite camine a la derecha, presiono la tecla de la derecha y llamo al método caminar el cual me modifica un atributo llamado dirección, dirección es un vector que señala la direccion en la que tienen que caminar mis sprites. Una vez modifico mi vector modifico los valores X e Y de mi bounding box, ejemplo:

[code:1]rectangulo.x += direccion.x;
rectangulo.y += direccion.y;
[/code]

Una vez cambio los valores de mi boundig box llamo a un método que me comprueba si mi sprite está colisionando, y si lo está entonces hago un re acomodo de bounding box.

caso 1:

Imagen Enviada

Este caso sucede cuando mi objeto está cayendo sobre un objeto y me doy cuenta de que está cayendo si el vector en Y es mayor a 0, si colisionan hago un reacomodo del bouding box:

[code:1]if(cuadrado.isColision(otroCuadrado){
if(direccion.y > 0){
rectangulo.y -= direccion.y;
}
}
[/code]

caso 2:

Imagen Enviada

Este caso sucede cuando mi sprite choca con un lado de un muro, y me doy cuenta de que está chocando de la siguiente manera:

[code:1]if(cuadrado.isColision(otroCuadrado){
if(direccion > 0){
rectangulo.y -= direccion.y;
}else{
rectangulo.x -= direccion.x;
}
}[/code]

Si se dan cuenta complementa el código anterior.

caso 3:

Imagen Enviada

En este caso es donde tengo problemas y sucede cuando mi personaje está haciendo un salto parabólico, pues pueden suceder dos cosas, que mi personaje golpee un lado y caiga o golpee arriba y se detenga, y no he logrado detectar cuando suceden dichas situaciones, de hecho hoy estuve todo el día intentando solucionar este problema y no he logrado nada.

También me ha ocurrido lo siguiente:

Imagen Enviada

En este caso mi sprite sería el cuadrado, y el rectángulo sería una plataforma. Como pueden ver mi sprite estaría golpeando con la cabeza la plataforma y si le digo que si colisiona con ella mi sprite se subiría a la plataforma :-( .

Tampoco me he dado la libertad de meterle demaciado código raro, ya que puedo hacerlo para solucionar estos problemas pero no creo que sea la forma correcta, además estoy programando en html5 + javascript y no creo que sea bueno meterle demasiadas cosas.

Espero que alguien me pueda dar algún consejo o me pueda decir que estoy haciendo mal.

pd: el juego que estoy haciendo es de plataformas, vamos, el mítico Mario.

  • malditis

  • Neonate

  • vida restante: 100%
  • Registrado: 07 feb 2006
  • Mensajes: 68
#6

Escrito 19 agosto 2011 - 23:02

El IsColidion deberia devolverte informacion de la colision...

enum {Arriba=1, Abajo=2, Izquierda=4, Derecha=8}

Si choca por la izquierda y por arriba devuelves 5...

Asi luego sabes coma actuar en funcion de como haya sido la colision

  • uziel5

  • Ultima

  • vida restante: 100%
  • Registrado: 08 sep 2007
  • Mensajes: 1.955
#7

Escrito 20 agosto 2011 - 06:15

El IsColidion deberia devolverte informacion de la colision...

enum {Arriba=1, Abajo=2, Izquierda=4, Derecha=8}

Si choca por la izquierda y por arriba devuelves 5...

Asi luego sabes coma actuar en funcion de como haya sido la colision


Muy bien, gracias por la respuesta, lo trabajaré como lo dices y ya te cuento como me fue.


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