Advertisement
  1. Game Development
  2. Programming

Física de balanceo para el movimiento del jugador (como se ve en Spider-Man 2 y Energy Hook)

Scroll to top
Read Time: 11 min

() translation by (you can also view the original English article)

¡Hola! Soy Jamie Fristrom de Laboratorios Happion. Puedes recordarme de juegos como Die By The Sword, Spider-Man 2 y Schizoid ... todos los cuales, de una forma u otra, incluían cuerda. Últimamente he estado trabajando en un juego llamado Energy Hook - recientemente lanzado en Kickstarter - que tiene que ver con la cuerda. (Bueno, todo se trata de su haz de grappion con gravedad, de todos modos.)

Spider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorial

Voy a discutir cómo me gusta implementar un mecánico de juego mecánico. Cuando comencé a trabajar en Energy Hook casi todo lo hice con mi propio código personalizado. Creo que es posible simplemente entrar en Unity y usar la Joint Configurable para hacer algunas cosas muy similares, pero en ese momento no estaba disponible. Estoy bastante seguro de que esta ha sido la llamada correcta, de todos modos, porque me da control sobre todo - y puedo compartirlo contigo.

Spider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorial

Los fundamentos de hacer balanceo de la manera que lo hice - utilizando restricciones - son en realidad bastante simple. (Espero que no te decepcionen cuando ves lo que hay debajo de la campana). Funciona igual si estás haciendo un juego 2D o un juego en 3D, solo que los vectores son diferentes, así que empezaré con 2D y luego discutir algunas arrugas cuando se va a tres dimensiones.

En este artículo también se supone que está utilizando un motor de juego como Unity que puede hacer mucho del trabajo para usted, como raycasting contra la geometría y la orientación de un personaje, con simples llamadas de función. Si está utilizando su propio motor, puede que tenga que hacer las matemáticas usted mismo.

Spider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorial

Simulaciones físicas vs. movimiento conservado

Hay dos maneras simulaciones de juego a menudo funcionan. La mayoría de los juegos de tercera persona han enlatado todo; animaciones enlatadas y movimientos enlatados para que todo se vea perfecto, los pies del personaje no se deslizan, directamente desde el programa de animación del animador para nosotros. La alternativa es una simulación mucho más física - estás simulando física: aceleración, velocidad, gravedad - muchos juegos en primera persona hacen esto, pero los juegos en tercera persona tienden a evitarlo, porque es mucho más fácil tener los pies del personaje diapositiva y las cosas físicas no coinciden con la animación.

Si quieres hacer un swing de cuerda no enlatado (en contraposición a un swing de cuerda enlatada, como se ve en el primer Pitfall, o los primeros juegos de Spider-Man como el de Neversoft en PSX), una cuerda de swing que es en realidad física la simulación y por lo tanto, tal vez tenga la libertad y el matiz y la sensación visceral que la gravedad real y el impulso puede dar, entonces usted va a querer hacerlo de la segunda manera - que todo sea una simulación física, y evitar hacer cosas enlatadas que matan el impulso del personaje. Entonces, todo fluirá.

Así es como hago las cosas con Energy Hook.

Spider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorial

Hay una gran cantidad de artículos sobre cómo simular la física - aquí es uno con una demostración de Flash  construido pulg - Usted puede hacer la integración de Euler o la integración de Verlet, realmente no importa. (No te enseñaré sobre Euler vs. Verlet aquí, pero permítanme decirles que los conceptos no son tan aterradores como suenan).

Supongamos que hacemos la simple integración de Euler. El cada paso del juego de nuestro personaje podría parecerse a esto, donde la aceleración está determinada por la gravedad y cómo estás empujando el palo:

1
avatar.velocity = avatar.velocity + avatar.acceleration * deltaT;
2
avatar.position = avatar.position + avatar.velocity * deltaT;

(Nota de lado: esto es en realidad una aproximación aproximada - puede obtener una aproximación mejor, menos dependiente de framerate con avatar.position = avatar.position + (avatar.oldvelocity + avatar.velocity) * deltaT / 2.0f, y se puede obtener una simulación cercana a la perfecta con algo como esto - pero probablemente tus jugadores no notarán.)


Limitelo

Su juego probablemente tiene algún sistema para colisionar con la geometría del mundo. Probablemente se ve algo así:

1
Vector testPosition = avatar.position + avatar.velocity * deltaT;
2
Vector intersection
3
if( RayCast( position, testPosition, out intersection ))
4
{
5
  // we went through a wall, let's pull the character back,

6
	// using the normal of the wall

7
	// with a 1-unit space for breathing room

8
	testPosition = intersection + intersection.normal;
9
}

¿Qué sucede con la velocidad de tu avatar cuando golpean un obstáculo? No tiene sentido que tu avatar mantenga la misma velocidad a través de la pared. Algunos juegos te pueden rebotar, usando la normal de donde te intersectaste para reflejar tu velocidad; otros juegos pueden dejar que se deslice a lo largo de la pared; otros estarán en algún punto intermedio. Veamos el código para deslizarse a lo largo de una pared:

1
avatar.velocity = (testPosition - avatar.position)/deltaT;
2
avatar.position = testPosition;

(Si estás haciendo la integración de Verlet, donde cada marco ya estás determinando la velocidad simplemente mirando los datos de posición anteriores, este paso ya está hecho para ti.)

Además, los videojuegos que son las cosas hacky son, probablemente encontrará a menudo que la posición de su personaje se rompe repentinamente de un marco a otro en ciertos casos de esquina. Cuando esto sucede, su velocidad pasará por el techo. Mi solución para eso es simplemente un hack: comprobar si su velocidad se vuelve demasiado extrema y arreglarlo si lo hace.

¿Qué hace ese código cuando se golpea una pared en un ángulo? El primer marco, que cambia su velocidad dramáticamente como golpear la pared, pero todavía está empujando a través de la pared. El siguiente cuadro, tu avatar se actualiza en la pared de nuevo, y luego empujado de nuevo, pero ahora la velocidad es la nueva posición del avatar, se deslizó a lo largo de la pared, menos su posición antigua, contra la pared, por lo que es paralelo a la pared.

Esta es una simplificación excesiva de lo que sucede en el mundo real cuando un objeto choca con otro, pero la mayoría de sus jugadores no lo notarán ni se preocuparán.

En este punto, sin embargo, hemos reducido con éxito la posición de nuestro avatar y la velocidad con las paredes y los pisos de nuestro juego. Así que ahora estamos listos.

Restringir con cuerdas en lugar de muros

Así que ahora imagina que tu avatar ya está conectado por una cuerda virtual a un punto virtual. En lo que a nosotros respecta, podemos simplemente considerar que una pared circular o esférica invisible. Podemos probar la colisión viendo si has llegado demasiado lejos del centro del círculo, y jalar el avatar de nuevo.

1
if( amITethered )
2
{
3
	if (testPosition - tetherPoint ).Length() > tetherLength )
4
	{
5
		// we're past the end of our rope

6
		// pull the avatar back in.

7
		testPosition = (testPosition - tetherPoint).Normalized() * tetherLength;
8
	}
9
}

Ahora, el mismo ajuste de velocidad que nos hizo deslizar a lo largo de las paredes también nos hará deslizar por el interior de este círculo o esfera virtual.

Spider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorial
Física de balanceo: caer con una cuerda - marco 1
Spider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorial
Física de balanceo: caer con una cuerda - marco 2
Spider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorial
Física de balanceo: caer con una cuerda - marco 3

Un poco de sutileza y nuance

En este punto, usted tiene un juego de balanceo. Pero probablemente habrá algunas cosas sobre él que se interpongan en la forma de diversión para sus jugadores, y aquí es donde un poco de hacking puede hacer las cosas mejor.

Holgura y flexibilidad

Dependiendo de su juego, y si se supone que está simulando una longitud de cuerda o una tela elástica o una viga de agarre, puede tener diferentes enfoques de holgura y flexibilidad. Puedes simular muchas cosas ajustando la longitud de tetherLength. Si desea quitar la holgura de su trama elástica o barra de agarre, puede acortar el tetherLength a medida que el jugador se acerca al punto de la cuerda:

1
tetherLength = (avatar.position - tetherPoint).Length();

Pero si se trata de una cuerda no elástica, dejaría el tetherLength sin tocar.

Para el resorte, usted puede tener una longitud deseada desiredLength que sea fija y una longitud actual currentLength que intente continuamente acercarse a la longitud deseada desiredLength - esto también será útil para nuestro paso siguiente:

¡Pero yo no quiero tocar la tierra!

¿Qué pasa si tu avatar comienza en un lugar bajo y tratar de hacer swing? Es bastante obvio que no llegarán muy lejos. Una solución rápida para eso es comprobar cuánto arriba sobre el terreno el punto que quieren swing de es, y acortar la longitud de su correa para que se despeje el suelo.

No se puede acortar en un marco, ya que, entonces, de repente se rompen en el aire - por lo que aquí, con una longitud deseada desiredLength que es lo suficientemente corto como para no tocar el suelo y una longitud actual currentLength que rápidamente se acerca a la longitud deseada desiredLength obtendrá el espacio que usted quiere.

El avatar

Si tu avatar es una figura humanista, no tiene mucho sentido que aparezcan constantemente perfectamente verticales mientras se balancean. Orientarlos para que parezcan que están colgando de la cuerda - por lo que están al revés si están haciendo un bucle, por ejemplo - podría verse así en Unity:

1
Vector myUp = (avatar.position - tetherPoint);
2
avatar.rotation = Quaternion.LookRotation( avatar.rotation.forward, myUp );

Esto permitirá que el avatar se mueva hacia atrás. También puedes usar la velocidad del avatar para su avance (eso es lo que hago) - o déjalos girar locamente...

Terminando

En el mundo real, cuerdas envuelven cosas. Una forma rápida de simular que en su código es raycast a lo largo de la cuerda virtual de cada marco, y si se golpea algo, hacer un nuevo punto de unión donde se cruza. Esto no se verá bien si el avatar, a continuación, se balancea de nuevo en una cuerda antiadherente, pero está bien para una tela pegajosa, o la lengua.

Ajustar la forma en que su cuerda envuelve puede tener un gran impacto en la diversión. De repente, envolverse alrededor de un afloramiento puede tomar al jugador por sorpresa y hacerlos frustrados. Teníamos una solución de tres pasos en Spider-Man 2: si estuviera demasiado cerca del afloramiento, la web se rompería; si usted estuviera en una distancia media, la tela se envolvería; y si estuvieras lejos, la web sólo pasaría.


Consideraciones para 3D

Lo más difícil de llevar este mecánico 2D a 3D es considerar la interfaz para el jugador - cómo elegir puntos en el mundo a swing de. Diferentes juegos utilizan diferentes métodos para recoger tal punto. Ratchet & Clank tiene puntos fijos en el mundo que puedes atacar; con el Quake grappling-hook mod y Bionic Commando: Rearmed apuntas la cámara a lo que quieres conectar; Spider-Man 2 y Energy Hook lanzan rayos en relación con el personaje, y donde los rayos intersecan la geometría física que es el punto donde se adhieren.

Spider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorial

Casi todos estos métodos implican raycasting contra la geometría física del mundo, ya sea a lo largo de la línea de la cámara o desde el personaje hasta el punto del clic del ratón - la intersección de la raycast determina su nuevo punto de cuerda.

Por ejemplo, aquí hay un raycast de aspecto de ratón que podría ser bueno para un juego en primera persona:

1
RaycastHit wallData;
2
if( Physics.Raycast( camera.position, camera.forward, out wallData, maximumTetherLength ))
3
{
4
	amITethered = true;
5
	tetherPoint = wallData.point;
6
	tetherLength = Vector3.Distance( wallData.point, avatar.position );
7
}

Chocando con cosas

Golpear en las paredes y similares también tiende a ocurrir mucho más a menudo en un juego en 3D que un juego 2D, especialmente cuando son las paredes que te estás atando a ti mismo. Hay una variedad de cosas que usted puede hacer para hacer esto menos molesto.

  • Deja que el jugador guíe en el aire: la física no tiene mucho que decir sobre esto, pero de alguna manera se siente bien. Esa es una de las cosas que hicimos en Spider-Man 2, y por qué consigues un jetpack en Energy Hook.
  • Juega una animación fría: haz que el avatar haga una especie de giro o giro cuando golpean una pared, y luego se siente menos como un error y más como "¡Yo quería hacer eso!"
  • Manténgalos fuera de la pared: Ultimate Spider-Man hizo esto - si te acercas demasiado a una pared que gentilmente empujar lejos de ella. Parecía un poco extraño si soltaste el palo y deja que tu avatar cuelgue allí - que flotaban lejos de la pared en un ángulo extraño - pero para el resto del juego fue una mejora. (¿Podrías tener lo mejor de ambos mundos sólo empujando si el personaje va a cierta velocidad?)
  • Recompensa por no golpear la pared en primer lugar: Esta es la estrategia Energy Hook - enseñar al jugador a evitar golpear las paredes, al recompensarlos por limpias oscilaciones. Por un lado, les anima a balancearse bastante; por otro lado, cuando golpean la pared es mucho más frustrante, porque pierden sus puntos de estilo.
Spider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorialSpider-Man 2 and Energy Hook rope swinging physics tutorial

¿Entonces, Qué esperas?

Siga hacia fuera y haga sus propios juegos que hacen pivotar, y déjeme saben lo que usted sube con! Nunca puedo tener suficiente de los juegos de swing.

Espero que hayas encontrado este artículo útil. Si lo tiene, por favor, apoye el Energy Kookstarter o votelo en Steam Greenlight. ¡Gracias!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Game Development tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.