Holas, tengo un juego de plataformas, y está casi totalmente estructurado, así que no puedo cambiar de la nada el modo de juego normal a uno usando físicas, o las físicas de GMS al menos (Box2D, creo que era así...xD). Mi pregunta es sencilla. ¿Cómo puedo hacer que el jugador se "deslize" en plataformas diagonales?
alaberga regué el café.

BA:STFW&RTFM

La manera más fácil que se me ocurre y menos invasiva sería usando gravedad.

GM no solo permite controlar la magnitud de la gravedad, sino también la dirección, mediante la variable gravity_direction. Así que nada más sería cuestión de saber cuál es la inclinación de la plataforma para aplicar un ángulo de dirección adecuado a la gravedad. Dicho ángulo sólo debería ser válido mientras el jugador esté sobre la rampa, al momento de salir de ella, se tendría que cambiar por la dirección "normal" (270°)

He intentado esto muchas veces, y sale con error. El uso de las variables gravity & gravity_direction no ha sido de mi agrado nunca, claro está que la he usado en mis tiempos de Hiper-NooB.
¿Alguna otra idea?
alaberga regué el café.

BA:STFW&RTFM

Entonces la idea está bien, lo que falla es la implementación que haces. Yo he hecho pruebas y el método funciona.

Si sabes cuál es la pendiente de la plataforma, podrás saber cuánto tienes que mover en X y en Y al personaje, si es que quieres hacer el movimiento "manual" (sin gravity ni speed)


Disculpa la insitencia, pero no logro comprender cómo lo puedo hacer, sólo con tus ideas me es muy difícil saber qué tengo que hacer.
¿Me podrías facilitar un poco las cosas? No sé, un editable, quizás ayuda con códigos...Gracias
alaberga regué el café.

BA:STFW&RTFM

La verdad es que, si no contemplaste las plataformas diagonales desde el diseño inicial, vas a tener que re-escribir mucho código.

Creo que la sugerencia de penumbra deriva del plano inclinado como máquina simple.

Cuando un objeto está sobre un plano inclinado (sin fricción) actúa una fuerza hacia abajo, causada por la gravedad, y una fuerza perpendicular al plano (fuerza normal). La suma de esas fuerzas resulta en una fuerza paralela al plano que provoca el deslizamiento. http://www.fisicapractica.com/plano-inclinado.php

Yo tengo un método similar, pero en vez de modificar la gravedad, el objeto es desplazado en dirección perpendicular a la plataforma cuando se detecta una colisión. La colisión se podría detectar activando la colisión precisa de los sprites, sin embargo, se usa un exceso de procesamiento. Para no utilizar sprites con colisión precisa, he definido las diagonales como rectas en el plano xy. Cuando se detecta una colisión con una plataforma, se determina la colisión con la diagonal, si hay colisión el objeto se desplaza unos pixeles hacia afuera de la plataforma.
Tengo un ejemplo, pero tiene mucho código, y no es muy fácil de entender.

¿Conclusión: Me es imposible hacer eso sin reescribir prácticamente todo?
alaberga regué el café.

BA:STFW&RTFM

Yo soy el que pide disculpas. Es que en casos así, donde existen muy distintas maneras de implementar una solución, no me gusta dar código para copiar y pegar. Tengo muy poca fé en el hecho de copiar y pegar códigos, que siempre será la solución más fácil, pero que en mi opinión, muchas veces quien usa el código no entiende qué hace el código (no estoy diciendo que este sea el caso, estoy hablando de manera general). Esto seguramente está muy bien, pero entonces el término "desarrollador" queda muy diluído, porque la solución pasa por simplemente copiar y pegar código. Pero bueno, olvida mis manías de makero amargado.

Sólo quería traer la atención al hecho de que si la pendiente es 1, el jugador se moverá los mismos pixeles tanto en x como en y cuando avance por la plataforma, si la pendiente es 0.5, por cada 2 pixeles en x avanzará 1 en y, Si la pendiente es 0.3, entonces por cada 3 pixeles en x, el jugador avanzará 1 en y, etc. Esto con el fin de evitar el costo de procesar muchos cálculos o colisiones, que son otros métodos alternativos.

#8 Noviembre 27, 2015, 02:00:44 AM Ultima modificación: Noviembre 27, 2015, 02:07:32 AM por NiuWeb
Entonces, según lo que te he entendido, debería hacer algo así:
[gml]
//Colisión normal
if place_free(x+3,y) && mouse_check_button(vk_right)
x += 3;
if place_free(x-3,y) && mouse_check_button(vk_left)
x -= 3;

//Colisión diagonal
if place_meeting(x,y,objRampa)
{
  if place_free(x+3,y) && mouse_check_button(vk_right)
  {
    x +=3;
    y += 2;
  }
}
[/gml]

Bueno, sólo es una idea, pero me gustaría saber que tan bien planteada está  :D

PD: No soy de la clase de personas que les gusta copiar y pegar :) , a veces lo hago, pero antes de copiar TODO código, lo intento interpretar hasta el punto de que domine completamente, al menos la mayoría de funciones y estructuras que vienen el el código. Siempre pienso que tener un videojuego sin que sepas el significado de tus códigos es similar a que vendas pan y  te pregunten "Este pan es delicioso, ¿Cuál es la receta?" y tú respondas "Yo hago el pan pero no tengo ni idea de cómo se hace la masa", siendo que la masa es el código y la estructura, y el resto (sinceramente no sé que es el pan sin masa, pero weeno...Dx) es lo que haces tú (sprites y negocios...xD)
alaberga regué el café.

BA:STFW&RTFM

No sé cómo quieras que se comporten las rampas, pero quizás también sea posible crear un path que siga la "línea" de la rampa, y hacer que el jugador siga ese path. Obvio esto no siempre es lo deseado, dependería del juego.

Sería lo deseado, SI ESTUVIEARA HACIENDO UN JUEGO TIPO GD, pues necesito que el jugador se mueva en ambas direcciones, inclusive por la rampa.
Veo algo jodido esto... :-[
En fin, ¿El código que puse antes era más o menos como el que tu indicabas?
alaberga regué el café.

BA:STFW&RTFM

Cita de: NiuWeb en Noviembre 27, 2015, 02:40:15 AM
En fin, ¿El código que puse antes era más o menos como el que tu indicabas?
En teoría sí, pero se necesitaría más código. Lo que pasa es que sólo presté atención a lo de "deslizamiento", pero no sabía que querías subir y bajar por la rampa a voluntad. Yo pensé que sólo querías dejarte deslizar hacia abajo por la rampa.

ñope :-X Es un juego de plataformas, supongo que por la impresión que das, es algo bastante hardcore de hacer ¿no?
Pfff... :'(
alaberga regué el café.

BA:STFW&RTFM

#13 Noviembre 27, 2015, 03:07:26 AM Ultima modificación: Noviembre 27, 2015, 03:16:57 AM por penumbra
Depende de cómo se quiera implementar, pero no creo que sea algo hardcore, si no más bien relativamente sencillo. Hay muchas maneras de resolverlo, pero la más sencilla me sigue pareciendo la primera que propuse, usar gravity_direction, que permitiría tanto subir la rampa como deslizarse con muy pocas líneas de código. También dependerá de cómo son tus rampas, si son todas iguales o si tienen distintas medidas e inclinaciones.

Bueno, no me enojo con alguito de ayuda  XD XD :-[
Todas las rampas las supongo hacer con la misma inclinación (45º), que supongo es la más apropiada.Pero eso sí, en cuatro direcciones diferentes, o sea, izquierda abajo, derecha abajo, izquierda arriba y derecha arriba...
alaberga regué el café.

BA:STFW&RTFM