Entonces, después de algunas horas de búsqueda en Internet, todavía tengo que encontrar una respuesta agradable sobre cómo manejar plataformas móviles en un juego de plataformas 2D. Así que decidí hacer un prototipo simple donde interactúes con 2 plataformas diferentes, una que se mueve verticalmente y otra horizontalmente. Me encantaría obtener ayuda para analizar y ver qué no funciona y cómo solucionarlo. He enviado el archivo .fla + .as archivo a continuación, acompañado con un enlace al .swf jugable.
El objetivo es hacer que el Héroe interactúe con las plataformas como si fueran objetos sólidos sobre los que pueda pararse, empujarse, saltar sobre / debajo, etc.
Los problemas con mi prototipo son estos:
Cuando te paras en la plataforma que se mueve horizontalmente, sin moverte (sin tocar ninguna tecla), el Héroe se mueve junto con la plataforma, pero con un ligero retraso, el héroe se desliza un poco hacia atrás.
Cuando te paras en la plataforma en movimiento horizontal y saltas, te mueves junto con la plataforma en el aire (algunos juegos prefieren tenerlo así, pero no se siente natural y no se quiere aquí). Lo que podría ser causado por el héroe que retiene la velocidad en el eje X desde la plataforma.
Cuando saltas hacia la parte inferior de la plataforma en movimiento vertical, mientras la plataforma se mueve hacia abajo, te hundes dentro de ella por un breve segundo. El héroe penetra como si la colisión no existiera por un momento.
Cuando saltas sobre una plataforma que se mueve verticalmente, la velocidad en el eje Y se mantiene, por lo que cuando sales de la plataforma, caes a una velocidad más alta. Con la velocidad de la velocidad retenida, se agrega + gravedad (esto se debe principalmente a que no puedo encontrar una manera de restablecer la velocidad en el eje Y a 0 cuando aterrizas en la plataforma, sin que el jugador se congele en el aire).
Soy un programador novato, así que estoy seguro de que hay MEJORES formas de hacer esto, y me encantaría escucharlos a todos. Cualquier idea sobre cómo mejorar el código u otros métodos en los que puede implementar plataformas móviles en un juego basado en Tile es bienvenida. Al final, estoy tratando de encontrar una forma sólida de manejar plataformas móviles en plataformas 2D.
SWF jugable: http://dl.dropbox.com/u/28271061/PlatformerhowtoFLA.html (moverse con las teclas de flecha, saltar con la tecla X, correr con la tecla Z)
Código fuente AS-file: http://dl.dropbox.com/u/28271061/Platformerhowto.as
SourcefileFLA: http://dl.dropbox.com/u/28271061/PlatformerhowtoFLA.fla
Si prefiere leer el código a través de Pastie en línea: http://pastie.org/2266764
Respuestas:
Separemos su problema en sus problemas distintos ...
Una palabra sobre la calidad del código
Tu código actualmente tiene tus plataformas controlando directamente la velocidad de tu jugador e incluso la constante de gravedad del mundo . Es hacky, y es de procedimiento cuando debe estar orientado a objetos. Una vez que comiences a expandir este juego, las cosas se pondrán feas rápidamente .
Necesita refactorizar su código. Implemente una clase de jugador, una clase de plataforma y una clase de piso. Separe sus preocupaciones: haga que el jugador interprete los controles del teclado y controle cómo corre y salta, y haga que las plataformas alteren su impulso según sea necesario (agregando su propia velocidad a la velocidad ya determinada del jugador, cuando sea necesario).
Haga que su jugador determine dónde está en lo que respecta a un objeto de tipo piso (las plataformas y los pisos tendrían un
BodyType = BodyTypes.Floor
o algo así) y determinar por sí mismo dónde está en relación con el objeto, cómo debe reaccionar y si está cayendo o no. en el piso.Esto puede merecer un tema separado ya que es un tema bastante diferente de todo lo que has mencionado. Sin embargo, tendrás que hacerlo en algún momento.
Inercia horizontal / vertical al salir de una plataforma
Para resolver sus problemas de velocidad vertical y horizontal, tenga en cuenta dos cosas:
Su jugador simplemente sufre de inercia : su impulso se mantiene hasta que algo lo detiene.
Solución: Ambos problemas se resolverían con la solución de jSepia a ¿Cómo manejo las plataformas móviles en un juego de plataformas? ya que separaría completamente el proceso de movimiento del jugador de cómo las plataformas lo mueven. Simplemente no caerías más rápido caminando desde una plataforma vertical y no preservarías tu impulso horizontal saltando de una horizontal, porque las plataformas ya no afectarán vx y vy de tu jugador .
Nota: Es posible que tenga algunas dificultades para implementar la solución de jSepia antes de que se refactorice su código.
Deslizarse de lado a lado alrededor de la plataforma horizontal
Su jugador no se mueve horizontalmente tan rápido como se mueve la plataforma. No es obvio para mí por qué. Este problema probablemente también se resolvería implementando la solución de jSepia y refactorizando adecuadamente su código (este último simplemente haría obvia la causa).
Detección de colisión: superposición con la plataforma vertical
Vea la línea 381 de Pastie: cada paso es restablecer la vy del jugador a 0 siempre que el jugador colisione con la parte inferior de la plataforma vertical. En el siguiente paso, vy aumenta con la aceleración de la gravedad y luego el jugador se mueve (y luego se restablece a 0 nuevamente).
Esto significa que mientras su jugador colisione con la parte inferior de la plataforma, se moverá hacia abajo a una velocidad constante (la constante de gravedad). La plataforma vertical es más rápida que eso, por lo que se superpone. Si la plataforma vertical se moviera a una distancia mayor, se deslizaría a través de él hasta que el jugador se registrara como parado en la plataforma.
Solución: no restablezca la vy del jugador a 0. Simplemente configure la vy del jugador a la velocidad vertical de la plataforma ( si la plataforma se desplaza hacia abajo ). Su jugador se alejará de la plataforma vertical al menos tan rápido como la plataforma y acelerará alejándose de ella.
fuente
Player
tiene un métodoGetPosition
y variables internasparent
(para su nodo padre) yposition
(para su posición con respecto a su padre).Player.GetPosition()
vuelveposition + parent.GetPosition()
. Su padre hace lo mismo hasta que llegas a la raíz del árbol: el nodo mundial. Cuando tu jugador se mueve, solo tratas con laposition
variable privada . Su jugador se dibuja en la pantalla del juego segúnGetPosition()
el valor de. Te dejaré descubrir cómo la transición entre nodos. ;)