Hola,
Vereis,he quitado las telarañas a mi carpeta de bennu y estoy probando a hacer algo de plataformas.
El caso es,que recuerdo que en su dia en mis castlevanias etc logré con div hacer plataformas "pixel perfect",es decir,la dureza era una linea de un pixel y los pies del personaje siempre quedaban un pixel por encima del suelo.
El problema que me encuentro ahora y no se como solucioné en su momento es,que cuando salto,al incrementar el avance de y para simular una caida con gravedad,puede llegar a caer de 4 en 4 pixeles,entonces,la y del personaje,y la y de la linea de la dureza no se "encuentran",provocando que el personaje caiga al vacio.Y si hago un cuadrado enorme en lugar de una linea no cae al vacio,pero no queda pixel perfect,es decir,a veces cae mas abajo que otras,etc.
Tengo una variable en_suelo,que cuando no esta tocando suelo es false y si toca es true para controlar saltos etc.Y lo tengo asi
if(map_get_pixel(0,png_durezas,x,y)==rgb(255,0,0))
en_suelo=true;
else
en_suelo=false;
end
El punto de control del personaje esta en sus pies.
¿Hay alguna forma de comprobar los pixeles de las durezas en un "radio" o algo por el estilo?
El caso es que en su momento lo logré :o
Yo lo que hago es, con un bucle for comprobar que todos los pixeles por los que pasa en su caída no tienen esa dureza. O sea, si en un frame cae 4 píxeles, este for tiene 4 iteraciones.
Claro, es como dice Yawin. En lugar de comprobar durezas directamente en la posicion final, chequea desde la posicion actual hasta la final, pasando por cada una de las posibles. Y apenas se encuentre suelo, esa es la nueva posicion final.
en parte y lo ideal (aunque no se lo productivo que puede ser) es usar varias comprobaciones de durezas siempre que se avance ''a trompicones'', me explico:
Supongamos que la gravedad es 4, osea que cuando cae avanza 4 (y = y+4;) hay que hacer 4 comprobaciones para el pixel perfect (o mas)
quedando mas o meno el codigo asi: (suponemos que el punto decontacto del esprite es x,y)
if (map_get_pixel (0,png_durezas,x,y) == rgb(255,0,0))
en_suelo=true;
else
if (map_get_pixel (0,png_durezas,x,y-1) == rgb(255,0,0))
en_suelo=true;
else
if (map_get_pixel (0,png_durezas,x,y-2) == rgb(255,0,0))
en_suelo=true;
else
if (map_get_pixel (0,png_durezas,x,y-1) == rgb(255,0,0))
en_suelo=true;
else
en_suelo=false;
end
end
end
end
evidenemente este codigo a parte de ser un ''cognazo'' hay que comprobarlo y recomprobarlo, je je
¡Pero es mucho mejor un bucle!
for(i=y;y<i+velocidad;y++)
if (map_get_pixel (0,png_durezas,x,y) == rgb(255,0,0))
en_suelo=true;
end
end
Vale, lo entiendo a la perfeccion y ese codigo se puede optimizar incluso con un bloque FOR como ha puesto yawin, solo para ahorrarte un tocho de codigo innecesario que no te va a relantizar en juego de una manera barbara, a menos que uses un ordenador antiguo o asi
Cuando pruebes el juego hacelo mostrando en la pantalla directamente el mapa de durezas, asi vas a ver que es lo que está dibujando la plataforma. (usar como mapa de pantalla el mapa de durezas, no se si me explico)
Me suenta a que no se está dibujando o moviendo la dureza correctamente. Y de esta forma lo vas a poder ver facilmente
No te rayes, una plataforma movil es un proceso mas, usa colision y roba las x,y a ese proceso y añadele medio cuerpo...
No se si me he explicao bien