Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: DarkKRuleR en Diciembre 05, 2011, 10:39:55 AM

Título: [Resuelto] Movimiento en 3D
Publicado por: DarkKRuleR en Diciembre 05, 2011, 10:39:55 AM
Buenash! Pues estoy intentando conseguir un movimiento en 3D, he partido de la base del shooter en primera persona Doom de ejemplo y lo he convertido en un juego 3D en TERCERA persona tras mucho trabajo con las vistas, de eso estoy orgulloso. Pero del movimiento...

Quiero que, al pulsar arriba, camine hacia arriba de donde APUNTE LA VISTA. O sea...
si mantienes CONTROL y pulsas DERECHA E IZQUIERDA la vista rota alrededor del personaje.
Ahora, pulsando ARRIBA, el personaje camina al "norte", donde la vista apunta. Abajo, derecha e izquierda igual. Vamos, que se mueve en cuatro direcciones con las 4 flechas, tomando la direcci?n superior hacia donde mira la vista. Y si pulsas control, rotas esta vista.
El problema es moverlo (la vista rotando la tengo)
Us? el siguiente ejemplo que ya ven?a para MOVIMIENTO LATERAL RESPCTO LA VISTA, implementado:

//Gira a la derecha o mu?vete hacia la derecha
if keyboard_check(vk_right) {dir=0; index="run";
if !keyboard_check(vk_control) {var xn,yn; xn=x+sin(direction*pi/180)*velo; yn=y+cos(direction*pi/180)*velo;
if !place_meeting(xn,yn,obj_wall_parent) {x=xn; y=yn;}
} else {direction -= giro;}}

//Gira a la izquierda o mu?vete hacia la izquierda
if keyboard_check(vk_left) {dir=180; index="run";
if !keyboard_check(vk_control) {var xn,yn; xn=x-sin(direction*pi/180)*velo; yn=y-cos(direction*pi/180)*velo;
if !place_meeting(xn,yn,obj_wall_parent) {x=xn; y=yn;}
} else {direction += giro;}}


Si pulsas derecha o izquierda tal cual hace el c?digo de movimiento tal cual sacado del ejemplo. Pero si lo pulsas con control, no se mueve, s?lo rota la direcci?n.

1) a qu? viene multiplicar por pi/180? No es eso un factor de conversi?n para pasar de grados a radianes? Pero no se supone que sin y cos funcionan con grados y siempre le entran grados ya que la direcci?n est? en grados? no cojo eso

2) he intentado cambiar ese c?digo para que funcione para ir ARRIBA Y ABAJO. El c?digo va a derecha o izquierda desde la vista, pero no consigo cambiarlo para que vaya arriba y abajo, alguien me ayuda con eso? D:

EDIT- como v?is no usa nada de velocidades para desplazarse, hace teletransporte con x e y, pero funciona a la perfecci?n, s?lo que no se aplicarlo para el desplazamiento vertical! he probado muchas combinaciones...
Título: Re: Movimiento en 3D
Publicado por: Jucarave en Diciembre 05, 2011, 04:29:15 PM
El movimiento se hace con seno y coseno... lo de multiplicar por pi/180 es por que el calculo de esta posicion se tiene que hacer en radianes y no en grados... tambien podrias usar:

[gml]
    //Para arriba
    if (keyboard_check(vk_up)){
        x += cos(degtorad(direction))*Vel;
        y -= sin(degtorad(direction))*Vel;
    }

    //Para abajo puedes invertir el + y -
    if (keyboard_check(vk_down)){
        x -= cos(degtorad(direction))*Vel;
        y += sin(degtorad(direction))*Vel;
    }

    //Para los lados sumas 90 a la direccion
    if (keyboard_check(vk_down)){
        if (keyboard_check(vk_control)){
            direction += 6;
        }else{
            x += cos(degtorad((direction+90)))*Vel;
            y -= sin(degtorad((direction+90)))*Vel;
        }
    }

    //Y Para izquierda inviertes los + y -
    if (keyboard_check(vk_down)){
        if (keyboard_check(vk_control)){
            direction += 6;
        }else{
            x -= cos(degtorad((direction+90)))*Vel;
            y += sin(degtorad((direction+90)))*Vel;
        }
    }
[/gml]

Esa es una manera basica de escribirlo... Para ahorar codigo puedes poner

[gml]
    var adelante, lateral;
    adelante = keyboard_check(vk_up)-keyboard_check(vk_down);
    lateral = keyboard_check(vk_left)-keyboard_check(vk_right);

    if (adelante != 0){
       x += cos(degtorad(direction))*Vel*adelante;
       y -= sin(degtorad(direction))*Vel*adelante;
    }

    if (lateral != 0){
       if (keyboard_check(vk_control)){
           direction += 6*lateral;
       else{
           x += cos(degtorad((direction+90)))*Vel*lateral;
           y -= sin(degtorad((direction+90)))*Vel*lateral;
       }
    }
[/gml]

Saludos....
Título: Re: Movimiento en 3D
Publicado por: DarkKRuleR en Diciembre 05, 2011, 04:40:34 PM
Wow, genial! No entiendo c?mo no saqu? la combinacion, pero funciona, muchas gracias! S?lo he tenido que modificarlo un poco ^^ no vi que lo editaste y prob? la primera, no la resumida, pero est? bien :3
y como ya ten?a puesto en colisi?n con muro:
//Colisi?n!
x=xprevious;
y=yprevious;


No ha hecho falta de checar posici?n libre ^^ +karma pa ti, genial