Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: bygdle en Noviembre 27, 2015, 12:29:26 AM

Título: Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: bygdle en Noviembre 27, 2015, 12:29:26 AM
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?
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: penumbra en Noviembre 27, 2015, 12:44:01 AM
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°)
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: bygdle en Noviembre 27, 2015, 12:49:54 AM
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?
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: penumbra en Noviembre 27, 2015, 01:05:50 AM
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)

Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: bygdle en Noviembre 27, 2015, 01:09:56 AM
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
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: Clamud en Noviembre 27, 2015, 01:38:15 AM
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.
(http://www.fisicapractica.com/imagenes/dinamica/plano3.jpg)
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 (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.
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: bygdle en Noviembre 27, 2015, 01:43:00 AM
¿Conclusión: Me es imposible hacer eso sin reescribir prácticamente todo?
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: penumbra en Noviembre 27, 2015, 01:50:51 AM
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.
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: bygdle en Noviembre 27, 2015, 02:00:44 AM
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)
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: penumbra en Noviembre 27, 2015, 02:29:46 AM
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.
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: bygdle en Noviembre 27, 2015, 02:40:15 AM
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?
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: penumbra en Noviembre 27, 2015, 02:54:25 AM
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.
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: bygdle en Noviembre 27, 2015, 02:55:50 AM
ñope :-X Es un juego de plataformas, supongo que por la impresión que das, es algo bastante hardcore de hacer ¿no?
Pfff... :'(
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: penumbra en Noviembre 27, 2015, 03:07:26 AM
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.
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: bygdle en Noviembre 27, 2015, 03:39:32 AM
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...
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: jmbs19 en Noviembre 27, 2015, 04:01:52 AM
pero con una inclinacion de 45 grados la pendiente si no me equivoco seria 1, a partir de eso seria mas facil, si tu personaje se mueve normalmente de izquierda a derecha seria como poner

[gml]
if place_meeting(x,y,objRampa_izq)//de izquierda abajo a derecha arriba
{
  if place_free(x+3,y-3) && keyboard_check(vk_right)
  {
    x +=3;
    y -=3;
  }
}

if place_meeting(x,y,objRampa_izq)//de izquierda abajo a derecha arriba
{
  if place_free(x-3,y+3) && keyboard_check(vk_left)
  {
    x -=3;
    y +=3;
  }
}

if place_meeting(x,y,objRampa_der)//de izquierda arriba a derecha abajo
{
  if place_free(x+3,y+3) && keyboard_check(vk_right)
  {
    x +=3;
    y +=3;
  }
}

if place_meeting(x,y,objRampa_izq)//de izquierda arriba a derecha abajo
{
  if place_free(x-3,y-3) && keyboard_check(vk_left)
  {
    x -=3;
    y -=3;
  }
}
[/gml]

por supuesto esto no abarca los brincos, si por ejemplo brinca y cae en una rampa, sin embargo creo que eso se podria hacer con colisiones o algo asi
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: bygdle en Noviembre 27, 2015, 04:27:45 AM
Por ahora intentaré probarlo a ver qué tal...
Y veo que los saltos serán algo hardocre, MUYY HARDOCRE...xD
grashas! ;D ;D
Título: Re:Movimiento/deslizamiento por diagonales SIN FÍSICAS!
Publicado por: kostra en Noviembre 27, 2015, 12:54:57 PM
Cita de: NiuWeb en Noviembre 27, 2015, 02:00:44 AM
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.

Penumbra, el problema es la persona, y su interés, no la manera de enseñar, todo lo que yo he aprendido ha sido con copypaste y poniendo interés en lo que he copypasteado, y de igual manera así trato de ayudar a los más novatillos en el foro (lee mi firma xd), pero en cuanto ves que preguntan LO MISMO UNA Y OTRA VEZ, entonces ya es cuandoquitas toda esperanza al ver tan pésimo interés... Entonces lo mejor es pensar que el código que no utilizó para aprenderX persona, en el foro permanecerá para futuros X lectores conmás interés :)


Niu, no lo he probado, pero parece algo facilísimo con gravity direction, si no te gusta usarlo, tendrías que crear tu propia física (no me refiero a usar box2d del gm)