Exactitud con durezas

Started by Comandante, March 04, 2015, 04:18:09 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Comandante

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

Yawin

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.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

gecko

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.
Torres Baldi Studio
http://torresbaldi.com

Futu-block

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

Yawin

¡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
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Futu-block

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

gecko

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
Torres Baldi Studio
http://torresbaldi.com

Futu-block

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