Hola chicos tengo un problemilla con un engine rope que estoy probando. En el centro de la pantalla hay un personaje con gravity=1 en su evento create que va callendo hacia el suelo.
Yo he creado un obj_suelo para que aterrice sobre el. En el evento step del personaje digo if place_meeting(x,y+1,obj_suelo){gravity=0}. Pero no funciona el personaje cuando colisiona con el suelo no se detiene sobre el, sigue bajando y descendiendo.
Ademas de gravity = 0 ponele vspeed = 0
Creo que te falto eso.
Saludos.
Genial funciona :) ahora tengo otro problema :'(. Cuando el personaje aterriza casi siempre se hunde en el suelo. Tengo mascara de colision precisa tanto en personaje como en el suelo. Muestro un video del proyecto.
https://www.youtube.com/watch?v=SD2YizV55Os&feature=youtu.be (https://www.youtube.com/watch?v=SD2YizV55Os&feature=youtu.be)
Bien, pero ahí tenés un error por usar las funciones del programa y no unas hechas por vos.
Si vos pones que cuando place_meeting (x,y+1,obj_suelo){vspeed =0; gravity = 0} .... Te va a pasar lo que te pasa, y más todavía si el objeto va más rápido.
Tenes que hacer algo así :
If !place_meeting(x,y+vspeed, obj_suelo){
gravity = 0.5
} else { vspeed = 0; gravity = 0 }
//// creo que algo así andaría un poco mejor...
Va mejor ya se planta bien sobre el suelo pero antes de tocar el suelo se frena y hace un efecto raro. El codigo no tiene nada en la velocidad de caida lo unico que tiene es un evento create con gravity=1. Este es su codigo del evento step lo que mueve el personaje con la cuerda
[spoiler] //grabs objects that are sol if mouse_check_button_pressed(mb_left) or mouse_check_button_pressed(mb_left) and place_meeting(x,y+1,obj_wall) { dir=point_direction(x,y,mouse_x,mouse_y); x_change=lengthdir_x(8,dir); y_change=lengthdir_y(8,dir);
xx=x; yy=y;
for(i=0;i<1000;i+=1) { nn=instance_position(xx,yy,all); if !(nn=noone) && !(nn=id) { if nn.sol { grab=1; break; } } xx+=x_change; yy+=y_change; } }
//moves if grab { grab=mouse_check_button(mb_left); dir=point_direction(x,y,xx,yy); motion_add(dir,1.75); }[/spoiler] |
Yo uso este codigo y siempre me ha funcionado:
COLISION CON SUELO
y=yprevious
move_contact_all(270,abs(vspeed))
vspeed=0
ademas del codigo para detener la gravedad en STEP.
ahora no hace nada. Se queda trabado xD
usa SIEMPRE números múltipos de 2, así jamás tendrás errores así.