Movimiento de RPG de arriba hacia abajo con corrección?

27

Espero que todos hayamos jugado a Zelda: un enlace al pasado, corrígeme si me equivoco, pero quiero emular ese tipo de movimiento 2D de arriba hacia abajo con un toque de corrección. Se ha hecho en otros juegos, pero creo que esta referencia sería la más fácil de relacionar. Más específicamente, el tipo de movimiento y corrección del que estoy hablando es:

  • El movimiento flotante no se limita al movimiento basado en fichas como Pokemon y otros juegos donde un toque de la plataforma de movimiento te mueve un cuadrado en esa dirección cardinal. Este movimiento flotante debería ser capaz de lograr un movimiento diagonal.
  • Si caminas hacia el oeste y llegas a un muro diagonal en dirección noreste / suroeste, eres corregido a un movimiento suroeste incluso si continúas presionando a la izquierda (oeste) en el controlador. Esto debería funcionar para ambas diagonales que corrigen en ambas direcciones.
  • Si está a unos pocos píxeles de caminar directamente hacia una puerta o pasillo, se le corrige al caminar por el pasillo o por el pasillo, es decir, chocar contra la esquina hace que lo empujen hacia el pasillo / puerta.

He buscado formas eficientes de lograr esto y no he tenido suerte. Para ser claros, estoy hablando del movimiento del personaje humano, no del movimiento de un NPC. ¿Están disponibles sus recursos en este tipo de movimiento? ¿Ecuaciones o algoritmos explicados en una wiki o algo así?

Estoy usando el Marco XNA, ¿hay algo en él para ayudar con esto?

Corey Ogburn
fuente

Respuestas:

23

Bueno, el primer punto es fácil. Simplemente almacena y manipula la posición del personaje en coordenadas mundiales o de píxeles en lugar de coordenadas basadas en mosaicos. Si tenía un problema con esto, podría deberse a una elección confusa de representación para su mundo y espacio de mosaico, por lo que tal vez debería publicar más detalles al respecto / hacer una pregunta específica y separada.

Para el segundo punto, el enfoque más directo sería tomar el vector de movimiento (normalizado) del jugador y agregarlo al vector normal de la pared, luego renormalizar. El signo de los componentes del vector resultante indicará cómo se relaciona la pared con el movimiento del jugador, mientras que el vector mismo indica en qué dirección puede moverse ahora el jugador.

Para el tercer punto, suponiendo que tenga rectángulos de colisión tanto para la pared como para el jugador, debe poder determinar cuánto del rectángulo de colisión del jugador entra en contacto con el rectángulo de colisión de la pared. Si, por ejemplo, el jugador se mueve hacia la derecha y golpea una pared vertical, se compara la extensión del eje Y de los rectángulos de colisión; si la extensión del jugador excede la extensión de la pared en algún umbral, digamos el 75% de la Y del jugador extensión del eje, entonces "engañas" al jugador hacia la puerta.

He hecho una buena cantidad de suposiciones aquí sobre cómo se ve su modelo de objeto en su código y qué técnicas ha elegido, en gran parte debido a la generalidad de su pregunta. Intenté sugerir enfoques simples (aunque quizás no óptimos) por la misma razón. Si puede proporcionar información más específica, ya sea en esta pregunta o en una nueva, puedo tratar de proporcionar más detalles o una mejor idea.

Josh
fuente
Sí, hacer flotar al personaje no fue un problema. Solo asegurándome de que la gente viera que era un requisito. Me diste la respuesta clave: ¡Azulejos con vectores! No puedo creer que no haya pensado en eso. Gracias.
Corey Ogburn
En zelda , solo había un ángulo en el que podían estar, por lo que no era necesario calcular vectores normales, solo era un caso especial en el código.
BlueRaja - Danny Pflughoeft
No entiendo cómo le das a un mosaico un vector. Como se veria eso?
prueba
Es probable que un mosaico ya tenga datos como su gráfico, ya sea que sea o no pasable, etc. Este es solo otro campo. Por ejemplo: struct Tile {vector2 normal; ...} El valor de lo normal debería venir con los datos que definen el mosaico
Josh
@JoshPetrie Revisando esto. ¿No sería necesario que un mosaico que puede colisionar en múltiples direcciones tenga múltiples vectores? No estoy seguro de entender cómo un mosaico podría tener un solo vector.
prueba
4

Como una posible respuesta para el segundo punto es proyectar el vector de movimiento del jugador a lo largo del vector de la pared usando un producto de puntos (ab * normalizado (b)). Luego obtienes un vector que te dice qué tan lejos mover al jugador en la dirección de la pared, y si mueves al jugador por ese vector, obtienes un 'deslizamiento' a lo largo de la pared. Me funcionó bien en un proyecto de juego anterior.

James
fuente
3

Gran respuesta para Josh, pero agregaré algunas sugerencias: - Para obtener más información sobre el deslizamiento contra las paredes, consulte mi pregunta - de esta respuesta logré que funcione realmente bien. - Si no me equivoco, al subir por la pantalla, Link se alineará fácilmente con la cuadrícula horizontal más cercana. De esta manera, cuando llegue a las puertas, es más probable que esté correctamente alineado (podría estar equivocado). - Para que sea más fácil pasar por las puertas, asegúrate de que la caja de colisión de tu personaje sea mucho más pequeña que el ancho de la puerta.

Iain
fuente
¿O tal vez la caja de colisión sea un círculo?
Oskar Duveborn
2

Para corregir las puertas de entrada, puede hacer que el objeto de colisión para la puerta sea un poco más grande que la imagen de la puerta. Esto resultaría en el mismo efecto propuesto por Josh, pero sin tener que calcular la proximidad al rectángulo de colisión del muro.

CuervosKrag
fuente