¿Cómo creo un terreno curvo en un juego de cornetworkingor 2D?

Si utilizo un map basado en mosaicos, puedo tener solo objects rectangulares.

¿Cuál es una estrategia para crear un terreno inclinado o curvo en ese caso? ¿Debería usar un map basado en mosaicos, o debería definir puntos de esquina en el map y crear el terreno mediante progtwigción?

Hay una manera fácil de simular esto en un juego de fichas 2D. Primero creas un mosaico que contiene la forma curva (usando alpha 0 para el "espacio vacío"). Luego, para cada píxel en el eje x, almacena la altura del punto más alto que tiene un alfa distinto de cero. Mientras su personaje está sobre uno de estos mosaicos curvos, su rutina de colisión luego verifica la position del eje x del personaje en relación con el mosaico y usa el valor de altura que almacenó para determinar la position apropiada del eje y para el personaje. También puede almacenar un ángulo para cada unidad del eje x si desea que su personaje gire en function de la pendiente actual.

Esta implementación es muy fácil de hacer y se ejecuta muy rápido ya que los cálculos se realizan en el momento del layout (o en el time de carga si elige hacerlo en el código) y la detección de colisión solo requiere una búsqueda.

Aquí hay una image de ejemplo (muy simple):

enter image description here

En x = 5, la altura es de 10 píxeles (por lo que y = 10), y en x = 15, la altura es de 30 píxeles (debe almacenar esto para cada valor de x ).
Además, debido a la pendiente (mayoritariamente) uniforme, el ángulo es de aproximadamente 45 grados para TODOS los valores de x; esto obviamente variará en function del tipo de mosaico que tenga, y puede calcularlo fácilmente, o simplemente aproximarlo visualmente.

EDITAR: según lo solicitado, algunos códigos básicos:

Aquí es importante que las posiciones del player y del tile estén en el mismo "espacio" (por ejemplo, ambas están en el espacio mundial) para que el valor de búsqueda del índice de la matriz [tile.left, tile.right] resultado un valor en el range [tile.left, tile.right] . Además, la testing de si el jugador está sobre un mosaico probablemente sea algo más escalable en una implementación real, pero esto servirá para ilustrar la idea.

 // check if player is within the bounds of the tile and find their height if ( player.x >= tile.left && player.x <= tile.right && player.y >= tile.top && player.y <= tile.bottom ) { player.y = LookupY[player.x - tile.left]; // Set Player Y from X Relative to Tile } 

La generación de la tabla LookupY dependerá en gran medida de la API utilizada para los charts, por lo que dejaré los detalles técnicos, pero el algorithm básico se vería como sigue:

 LookupY[x-axis size]; // Array sized to each x-axis pixel for ( x = each x-axis pixel ) { // Loop for each x-axis pixel (left->right) for ( y = each y-axis pixel ) { // Loop for each y-axis pixel (top->bottom) /* extract the pixel's ALPHA value here (API specific code) */ if ( alpha != 0 ) { // Stop when first non-zero alpha is found LookupY[x] = TileHeight - y; // Calculate Height from Bottom of Texture break; // Stop testing on y-axis; height is found } } } 

Esta es una implementación muy básica y dado que la pregunta no especifica ningún idioma específico y / o API, realmente no puedo elaborar mucho más, pero no dude en preguntar si algo aún no está claro.

Sugeriría que eche un vistazo a la detección de colisiones de azulejos. Puede tener fácilmente un mosaico en forma de pendiente y hacer que el cuadro delimitador tenga forma de triángulo. Es cierto que solo puede tener objects en forma de rectángulo en lo que respecta a los charts, pero para las colisiones, dependiendo de cómo lo escriba, podría tener cualquier forma.

Si realmente no has investigado la detección de colisiones (y no te culpo, no es lo primero que piensas de un juego de fichas), encontré un buen artículo sobre Java utilizando treees cuádruples.

http://gamedev.tutsplus.com/tutorials/implementation/quick-tip-use-quadtrees-to-detect-likely-collisions-in-2d-space/