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
//.............................................................