Hola. Estoy haciendo un juego de plataformas y no s? qu? he programado mal, pero el caso es que cuando el jugador colisiona con el objeto suelo cuando este est? puesto como una pared y pulsas el boton de saltar y el de moverse a la derecha a la vez, 'escala' la pared y llega arriba sin el menor esfuerzo. He revisado cientos de veces el codigo, cambiado por otros de otros engines e incluso borrado y vuelto a empezar pero no funciona.
Pongo aqu? el c?digo que tiene en los distintos eventos:
Evento Create:
//Variable para saber si est?s en el aire
aire=0
//Variable para saber cu?ndo puedes realizar el doble salto
doblesalto=2
//Variable para saber si est?s golpeado o no. Si lo est?s, el resto de eventos se anulan hasta que te mueves
estado=0
Evento Step:
//Activar la gravedad
if(place_free(x,y+1))
{
gravity = 0.5;
}
//L?mite de la velocidad vertical. Evita que el objeto caiga a una velocidad cada vez mayor
if (vspeed >= 12)
{
vspeed = 12;
}
//Comprobar que est? en el suelo o en el aire
if gravity=0
{
aire=0
}
else
{
aire=1
}
//Si est?s cayendo sin remedio es mejor que dejes de estar en estado golpeado
if vspeed=12{
estado=0
Evento colision con el suelo:
//Operaciones propias de la colision con un suelo
move_contact_solid(direction, 12);
if not place_free(x,y+1){
gravity=0;
vspeed=0;
doblesalto = 2;}
if not place_free(x,y-1){
vspeed=0}
if not place_free(x+1,y){
hspeed=0}
if not place_free(x-1,y){
hspeed=0}
//Si est?s en estado golpeado pasas a estado normal
if estado=1{
estado=0}
else{}
Evento keyboard left (el de right es igual salvo por el x-=4, que es x+=4):
//Si no est?s en estado golpeado te mueves
if estado=1{}
else{
x-=4;
y+=0;
}
Evento keyboard pressed up:
//Si no est?s en estado golpeado saltas
if estado=1{}
else{
//Saltar
if doblesalto>0{
vspeed=-7;
doblesalto-=1;
}
if doblesalto=0{
}
if doblesalto<0{
}}
Espero que alguien me pueda echar un cable y decirme qu? he puesto mal. :)
El problema me parece se encuentra en la parte de c?mo te mueves con los keyboard_check_left y right.
Trata de sustituirlo por esto seg?n corresponda el caso.
if estado=1
{exit;}
else{
if place_free(x-4,y)
{
x-=4
}
};
//Con esto haces que revise si no hay algo que lo obstruya m?s adelante, si hay algo deje de realizar la acci?n. Pero antes c?mo no lo revisaba por eso hacia el efecto de que "rebotaba".
Y quita eso de if gravity=0...La verdad no s? por que el quitarle la gravedad para lograr el salto, pero bueno.
Nada m?s eso de la gravedad que te menciono y pon esto:
gravity=place_free(x,y+1)*0.4
Espero te haya servido :D.
No lo he probado pero cambiar el codigo de gravedad por este
if place_free(x,y+1) gravity=0.5 else gravity=0
ademas de quitar gravity=0 en el evento de colision con los solidos
Madre m?a que fieras... llevo 3 d?as modificando c?digo sin parar y copiando cosas de diversos engines para que en 10 minutos haga unos saltos y colisiones exactamente como yo quer?a... Much?simas gracias de verdad. :) :) :)
Cita de: Kakashi en Julio 26, 2010, 08:28:18 PM
Y quita eso de if gravity=0...La verdad no s? por que el quitarle la gravedad para lograr el salto, pero bueno.
Yo tampoco lo s?, supongo que se quedar?a ah? en uno de mis numerosos intentos de que funcionara XD.
Al final he cogido lo de
if place_free(x,y+1) gravity=0.5 else gravity=0
de 3dgeminis y lo de
if estado=1
{exit;}
else{
if place_free(x-4,y)
{
x-=4
}
};
de Kakashi, por si a alguien le interesa c?mo lo he dejado al final para solucionarlo.
Gracias otra vez. :)