Estoy desarrollando un juego en el que el jugador puede usar cuerdas para balancearse (al igual que Spiderman o Bionic Commando ) y tengo problemas para implementar este comportamiento. ¿Alguien puede ayudarme a hacer esto? Me refiero a las fórmulas de física, etc. Hasta ahora se me han ocurrido 3 ideas. Uno está usando la primavera, pero consume mucho tiempo y, a veces, está nervioso. Los otros dos están tratando de calcular el siguiente paso (uno a través del cálculo de la energía potencial y otro a través del cálculo del torque) y ambos casi chocan cada vez que el actor intenta balancearse.
Aquí está el código que escribí para calcular el par:
float dx = Runner->getPosition().x - ancher.x;
float dy = Runner->getPosition().y - ancher.y;
float t0 = atan2(dy,dx); //my current angle
float k = ((dy) *vx - (dx) * vy) / (dx * dx+dy * dy); //previus angular velocity
k -= gravity * cos(t0) *dt; // new angular velocity (gravity is positive)
t0 += k * dt - acc * cos(t0) *dt * dt / 2; // rotate the rope
float dx1 = r0 * cos(t0); // new position (r0 is rope length)
float dy1 = r0 * sin(t0);
vx = (dx1 - dx) / dt; //calculate velocity
vy = (dy1 - dy) / dt;
physics
platformer
rope-physics
Ali1S232
fuente
fuente
Respuestas:
Si desea un swing rígido, por lo que la distancia al punto de rotación es constante, simplemente trate el personaje como un punto en un círculo centrado en el punto de rotación. Dale una velocidad angular unidimensional (a lo largo del círculo). Cada cuadro debe ser la aceleración angular
accelerationDueToGravity * cos(angleOfPlayerOnCircle)
(con 0 grados apuntando a la derecha).Si desea que la cuerda se alargue / acorte, puede usar el esquema anterior y solo variar el radio de cada cuadro.
fuente
Después de muchos intentos fui con box2d.
En general, hay dos enfoques para esta simulación o al menos encontré 2:
en cada senario tienes que tener un ancher (que en mi caso era una caja estática). es mejor si baja el peso de las partes de la cuerda (ya sea que use formas circulares o rectangulares), por ejemplo, para tener una física más realista, configuré su densidad en 0.1 y para la caja conectada al final de la cuerda usé la densidad 10.
Otra cosa que debe preocuparse acerca de cómo su segmento de cuerda reacciona entre sí. Solo quería que mi cuerda se moviera libremente en la escena, así que marqué todos los accesorios de la cuerda como sensores. Es posible que necesite un enfoque diferente.
Lo siguiente de lo que debe preocuparse es la cantidad de iteraciones que está pasando a la actualización mundial: para un segmento bajo de cuerda (tal vez 8 como máximo) no hay necesidad de usar un valor de iteración alto tal vez 10/10, que sugirió box2d. es suficiente, pero si aumenta el número de segmento, por ejemplo, probé 30 segmentos, con un número bajo de iteraciones, su cuerda parece aumentar su longitud más de lo que debería, por lo que necesitará quizás 40/40 iteraciones para resolver esas situaciones.
después de algunas pruebas, parece que el cuadro 2d está diseñado para escenas con tamaños de objeto de 0.1m a 10m y el tamaño máximo sugerido para escenas grandes es de unos 50mx50m. Básicamente, necesita escalar su objeto para que coincida con estos parámetros. En mi caso, primero intenté pasar las posiciones de píxeles directamente a box2d, pero parecía que había algunos límites de velocidad que impedían que el mundo se moviera tan rápido como debería, por lo que tuve que escalar mi escena alrededor de 64 veces para obtener los mejores resultados. aunque no me hice la prueba, hay algunos límites en box2d que te impiden usar escenas más grandes. por ejemplo, hay un valor definido en el
b2Setting.h
archivo#define b2_maxTranslation 2.0f
, puede cambiar la configuración de box2d, pero parece que no es recomendable.fuente
¿Ha considerado reducir la velocidad del movimiento de balanceo en función de qué tan lejos está la cuerda de la plomada (el centro)?
fuente
Cuando el jugador está más allá de la longitud de la cuerda, el jugador será empujado inmediatamente hacia atrás con una fuerza igual a la distancia que la ha pasado. Esto debería funcionar sin sentirse elástico, y debería sentirse intuitivo para el jugador. Sin embargo, es posible que tengas que ajustar tu física para obtener los mejores resultados para tu juego.
Cuando se ata la cuerda. Guardar un
maxLength
valorCada actualización, verifique
distance
entreplayer
, yattachPoint
Si normalmente
distance
es menor que lamaxLength
actualización, no hay efectos de la cuerda.Si la distancia es mayor que el
maxLength
, encuentre elnormal
delattachPoint
al jugador. Obtenga la diferencia entre eldistance
ymaxLength
. Agregue alplayerVelocity
,normal
multiplicado por la diferencia.Pseudocódigo:
fuente
dx = player.x - attachpoint.x
ydy = player.y - attachpoint.y
.Si nos fijamos en http://www.cocos2d-iphone.org/archives/1112 hay una implementación de una cuerda con un cuerpo rígido unido al extremo de la cuerda. Utiliza Box2D para el motor de física. Si observa el código fuente, estoy seguro de que puede implementarlo en el idioma que desee.
Además, el enlace anterior a la pregunta de Rope es mío y esta demostración (enlace proporcionado) anterior realmente ayudó.
fuente