Duda con las lecturas del teclado y el doble salto en mod_chipmunk

Started by Marc, February 17, 2013, 01:44:03 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Marc

Buenas, he estado trasteando con la mod_chipmunk y en el manual del salto de la pelota, he intentado "mejorarlo" para mi y conseguir así un doble salto, pero no va tan fino como me gustaría.

Os inserto el código del Personaje(El del manual con mi pequeña aportación) que es lo único que se necesita ahora mismo y os digo como funciona para ver si me podéis guiar, pero lo ideal sería que lo compilaráis haciendo copy_paste en el del manual y lo veis vosotros mismos xD

Lo que me pasa es que si igualo la tecla de salto a "_1" cuando pulso por primera vez me hace el salto del case 1 y del case 3 a la vez, siendo un salto de 200 y de una tirada y si el salto del case 3 lo configuro con "_2" si que funciona al 100%, pero claro lo que quiero es que me entre en el case 0 y hasta que no se suelte la tecla y se vuelva a pulsar no se haga ese doble_salto.

  • **** Pseudocodigo del salto / doble salto
  • * Si pulso salto, que salte
  • * ¿Salto se a dejado de pulsar?
  • *>>> SI => Go case 3
  • *>>> NO => Seguimo en case 1
  • *>>> Angulo salto == Angulo Suelo -> Reseteamos "estado salto"
  • *Salto se a dejado de pulsar y se a vuelto a pulsar
    • *>>> El personaje vuelve a saltar tomando como referencia el angulo del primer salto y se resetea, para no poder hacer saltos infinitos
    switch( estado_salto )
    case 0:
    // estado de: se puede saltar..
    if(key(_1))
    Physics_entity_add_velocity( 100.0, angulo_suelo );
    estado_salto = 3;
    angulo_suelo2=angulo_suelo;
    end
    end
    case 1:
    if(!key(_1))
    estado_salto = 2;
    end
    end
    case 2:
    if( angulo_suelo != 0.0 )
    estado_salto = 0;
    end
    end
    case 3:
    if(key(_2))
    Physics_entity_add_velocity( 100.0, angulo_suelo2 );
    estado_salto = 1;
    angulo_suelo2=angulo_suelo;
    end

    if( angulo_suelo != 0.0 )
    estado_salto = 0;
    end
    end
    end



    process Personaje(x,y);
    private
    float angulo_suelo,angulo_suelo2;
    int estado_salto = 2;
    begin
    ctype = c_scroll;
    scroll.camera = id;
    graph = g_ball;
    // Definición de las propiedades de este cuerpo: [ masa, elasticidad, fricción ].
    Physics_entity_build( 10.0, 0.1, 0.3 );
    write_var(0,10,100,3,angulo_suelo);
    loop
    // Codigo de ejemplo para saltar XD.. es ridículamente simple..
    angulo_suelo = Physics_entity_get_collision( TYPE_WORLD );

    switch( estado_salto )
    case 0:
    // estado de: se puede saltar..
    if(key(_1))
    Physics_entity_add_velocity( 100.0, angulo_suelo );
    estado_salto = 3;
    angulo_suelo2=angulo_suelo;
    end
    end
    case 1:
    if(!key(_1))
    estado_salto = 2;
    end
    end
    case 2:
    if( angulo_suelo != 0.0 )
    estado_salto = 0;
    end
    end
    case 3:
    if(key(_2))
    Physics_entity_add_velocity( 100.0, angulo_suelo2 );
    estado_salto = 1;
    angulo_suelo2=angulo_suelo;
    end

    if( angulo_suelo != 0.0 )
    estado_salto = 0;
    end
    end
    end




    if(key(_a))
    Physics_entity_add_velocity( 2.0, 180000.0 ); // parametros de velocidad: [ modulo, angulo ] aplica una fuerza hacia la izquierda.
    end
    if(key(_d))
    Physics_entity_add_velocity( 2.0, 0.0 ); // parametros de velocidad: [ modulo, angulo ] aplica una fuerza hacia la derecha.
    end
    if(key(_W))
    Physics_entity_add_velocity( 5.0, -90000.0 ); // parametros de velocidad: [ modulo, angulo ] aplica una fuerza hacia arriba.
    end

    if(key(_SPACE))
    Physics_entity_brake(10.0); // Freno en un 10%/frame a la entidad.
    end

    if(Physics_entity_get_vx() > 200.0) // Si supero la velocidad en X..
    Physics_entity_set_vx(200.0); // la limito..
    end
    if(Physics_entity_get_vx() < -200.0) // Si supero la velocidad en X..
    Physics_entity_set_vx(-200.0); // la limito..
    end
    frame;
    end
    end
    //.............................................................

Marc