Cómo acercarse a la serpiente de 360 ​​grados

8

Recientemente me metí en XNA y debo decir que me encanta. Como una especie de juego hello world, decidí crear el clásico juego "Snake". La versión de 90 grados fue muy simple y fácil de implementar. Pero cuando trato de hacer una versión que permita una rotación de 360 ​​grados con las flechas izquierda y derecha, me encuentro con un problema.

Lo que estoy haciendo ahora proviene de la versión de 90 grados: iterando a través de cada parte del cuerpo de la serpiente comenzando en la cola y terminando justo antes de la cabeza. Esto funciona muy bien cuando se mueve cada 100 milisegundos. El problema con esto es que crea un estilo de juego entrecortado ya que técnicamente el juego progresa a solo 6 fps en lugar de su potencial 60.

Me gustaría mover la serpiente en cada ciclo de juego. Pero desafortunadamente, debido a que la serpiente se mueve a la velocidad del tamaño de su cabeza, va demasiado rápido. Esto significaría que la cabeza necesitaría moverse a un incremento mucho menor, como (2, 2) en su dirección en lugar de lo que tengo ahora (32, 32). Debido a que he estado trabajando en este juego de vez en cuando durante un par de semanas mientras administraba la escuela, creo que he estado pensando demasiado en cómo lograrlo. Probablemente sea una solución simple, simplemente no la estoy captando.

Aquí hay un pseudocódigo para lo que he probado basado en lo que tiene sentido para mí. Realmente no puedo pensar en otra forma de hacerlo.

for(int i = SnakeLength - 1; i > 0; i--){
    current = SnakePart[i], next = SnakePart[i - 1];

    current.x = next.x - (current.width * cos(next.angle));
    current.y = next.y - (current.height * sin(next.angle));

    current.angle = next.angle;
} 

SnakeHead.x += cos(SnakeAngle) * SnakeSpeed;
SnakeHead.y += sin(SnakeAngle) * SnakeSpeed;

Esto produce algo como esto: Código en acción . Como puede ver, cada parte siempre permanece detrás de la cabeza y no produce un efecto "Trail".

Un ejemplo perfecto de lo que estoy buscando se puede encontrar aquí: Data Worm . No es la rotación de la vista sino el efecto final de los triángulos.

¡Gracias por cualquier ayuda!

Austin Brunkhorst
fuente

Respuestas:

5

Con ese algoritmo, estás haciendo que cada segmento mire al mismo ángulo que el que está frente a él. Es por eso que todos terminan directamente detrás de la cabeza, en última instancia, todos enfrentan el mismo ángulo. Como puedes ver en el juego Data Worm que vinculaste, cada segmento solo mira hacia el segmento frente a él . Determine el ángulo desde el segmento actual a su nexty haga que el segmento apunte de esa manera en lugar de establecerlo en next.angle.

Para esa implementación, es posible que desee iterar de adelante hacia atrás. El comportamiento será diferente según la dirección que pase por la lista. Pruébelos a ambos y vea cuál funciona mejor.

He usado una idea similar para un prototipo de proyecto en el pasado ( enlace de Unity WebPlayer ). Utilicé un código similar (aunque en 3D) para hacer que cada segmento gire hacia el segmento frente a él y se mantenga una distancia establecida. Trabajado como un encanto.

técnico del caos
fuente
¡Eso es genial! Estaba leyendo un blog que usa un concepto similar a ese, pero no pensé en iterar de adelante hacia atrás. Lo intentaré y lo marcaré como respuesta si tiene éxito.
Austin Brunkhorst
Actualización: ¡Lo tengo funcionando! Tomó algo de tiempo comprender el concepto y comprender lo que realmente está sucediendo. Gracias de nuevo por guiarme en la dirección correcta. Aquí hay un video del código de trabajo :) screenr.com/Fhn8 . No importa la colisión de alimentos, no he pasado mucho tiempo en ello.
Austin Brunkhorst
1
Me alegro de poder ayudar!
chaosTechnician
Tu enlace está muerto.
Jeff
1
@ Jeff Al parecer Dropbox ha decidido que estoy dibujando demasiado tráfico de alguna manera, lo que es raro ...
chaosTechnician