Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: BlySntK on March 08, 2012, 07:55:39 PM

Title: Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 08, 2012, 07:55:39 PM
Buenas... esa es mi duda... He probado con el algoritmo de salto que tengo poner al inicio del salto father.y--; father.x--; pero no me lo soluciona. El personaje no se mueve en un camino recto como un plataformas corriente, sino que el camino es ancho y puedo moverse de arriba hacia abajo hasta unos límites laterales, al saltarme me salta pero se me queda en el lateral superior (es lo que tiene al ser funcionalmente un plataformas). Algún consejo?
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: Yawin on March 08, 2012, 08:02:55 PM
No entiendo que tiene que hacer el personaje qué hace. Si pudieses explicarlo un poco mejor...
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 08, 2012, 09:03:56 PM
Veamos, un plataformas normal y corriente, el personaje va en línea recta (no puede ni andar hacia arriba o hacia abajo (como en un RPG o Betem'up -Tipo Final Fight-) y al saltar pues salta normal, o a la derecha o a la izquierda. Lo que necesito es que salte, por ejemplo, en diagonal; hacia abajo si vamos abajo, a la derecha si vamos a bajo y a la derecha o abajo y a la izquierda. Y viceversa para cuando queramos ir hacia arriba.
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: Rein (K´)ah Al-Ghul on March 08, 2012, 09:25:26 PM
poniendo gravedad mas con un if independiente del de movimiento horizontal (osea que no este en el ELSE del de izquierda derecha)
de forma que pueda pasar por ambas condiciones independientemente
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 08, 2012, 10:07:53 PM
Quote from: Rein (K´)ah Al-Ghul on March 08, 2012, 09:25:26 PM
poniendo gravedad mas con un if independiente del de movimiento horizontal (osea que no este en el ELSE del de izquierda derecha)
de forma que pueda pasar por ambas condiciones independientemente

No pillo :S Yo tengo un proceso gravedad general que se ocupa de todo el movimiento del personaje en todos los procesos, hay que modificar el proceso gravedad incluyendo un if que compare los movimientos del personaje o cómo...
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: Rein (K´)ah Al-Ghul on March 09, 2012, 02:00:25 AM
del mismo modo que haces que se mueva para izquierda/derecha
pero hacia arriba (poniendo un limite al salto claro)
por ejemplo:
PosicionY += ImpulosVertical - Gravedad
ImpulsoVertical -= gravedad
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 09, 2012, 07:59:39 AM
pero claro, el if del movimiento verticial arriba/abajo, independentemente del movimiento normal arriba/abajo, me dices que debo ponerle el mismo impulso que le pongo cuando le diga saltar, no?

yo tempo por ejemplo:


//Esto lo tengo para que salte
if(key(_space))
fuerza_de_gravedad=fuerza_de_salto;

//Esto para que se mueva
if(key(_left))
x-=3;

//Esto para arriba/abajo
if(key(_up))
y-=3;


Cómo sería entonces, poner otro impulsor al movimiento de arriba o abajo aplicándole la fuerza de gravedad?

algo así?

if(key(_up))
fuerza_de_gravedad=fuerza_de_salto;

pero en su proceso salto, es así?

También mencionar que la gravedad la tengo en un proceso y está más o menos entre medio de los movimientos y justo antes del salto
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: Yawin on March 09, 2012, 09:13:42 AM
O sea, lo que quieres es aplicar una gravedad, no?
En ese caso, en vez de asignarle a la y un valor. Asígnaselo a una variable a la que por ejemplo llames grav_y y vete sumándosela poco a poco a la y. No se si me explico.
Te voy a dejar el código del prota de un plataformas que hice, para ver si se entiende lo que digo. Espero que te ayude.


process prota(int eq, int iy)
   private
      int grav_y=0,grav_x=0;
      int i,j,k,idm;
      bool salto=false;
   end
   begin
      file=fpgs[1];
      graph=10;
      ctype=c_scroll;
      scroll[0].camera=id;
      size=23;
      z=0;
     
      /*delete_text(0);
      write_var(fnts[1],20,20,3,x);
      write_var(fnts[1],80,40,3,y);*/
     
      x=eq;
      y=iy;
      flags=0;
      graph=10;
      grav_y=0;
      grav_x=0;
               
      loop
         while(anim==true)
            frame;
         end
         
         if(key(_d) && map_get_pixel(fpgs[2],1,x+6,y)!=map_get_pixel(fpgs[0],6,3,0))
            // Animación de andar /////
               if(caja!=true)
                  j++;
                  if(j==2)
                     j=0;
                     if(graph<11)
                        graph=11;
                     end
                     graph++;
                     if(graph>=19)
                        graph=11;
                     end
                  end
               else
                  j++;
                  if(j==2)
                     j=0;
                     if(graph<111)
                        graph=111;
                     end
                     graph++;
                     if(graph>=119)
                        graph=111;
                     end
                  end
               end
            ////////////////////////////////
            grav_x=3;
            direc=false;
         end
         
         if(key(_a) && map_get_pixel(fpgs[2],1,x-6,y)!=map_get_pixel(fpgs[0],6,2,0))
            // Animación de andar /////
               if(caja!=true)
                  j++;
                  if(j==2)
                     j=0;
                     if(graph>9)
                        graph=8;
                     end
                     graph--;
                     if(graph<=1)
                        graph=9;
                     end
                  end
               else
                  j++;
                  if(j==2)
                     j=0;
                     if(graph>109)
                        graph=108;
                     end
                     graph--;
                     if(graph<=101)
                        graph=109;
                     end
                  end
               end
            ////////////////////////////////           
            grav_x=-3;
            direc=true;
         end
         
         if(grav_y<15)
            grav_y++;
         end
     
         if(gravedad!=false)
            flags=0;   
            if(grav_y>0)
               for(i=0;i<grav_y;i++)
                  if(!collision(type objetos) &&  !collision(type objetos) &&  map_get_pixel(fpgs[2],1,x,y+13)!=map_get_pixel(fpgs[0],6,0,0) && map_get_pixel(fpgs[2],1,x,y+13)!=map_get_pixel(fpgs[0],6,5,0))
                     y++;
                  else
                     if(grav_y>13 && salto!=false)
                        salto=false;
                        graph=10;
                     end
                  end
               end
            else
               for(i=grav_y;i<0;i++)
                  if(map_get_pixel(fpgs[2],1,x,y-13)!=map_get_pixel(fpgs[0],6,4,0))
                     y--;
                  else
                     grav_y=0;
                  end
               end
            end
         else
            flags=2;
            if(grav_y>0)
               for(i=0;i<grav_y;i++)
                  if(!collision(type objetos) &&  !collision(type objetos) && map_get_pixel(fpgs[2],1,x,y-13)!=map_get_pixel(fpgs[0],6,1,0) && map_get_pixel(fpgs[2],1,x,y-13)!=map_get_pixel(fpgs[0],6,4,0))
                     y--;
                  else
                     if(grav_y>13 && salto!=false)
                        salto=false;
                        graph=10;
                     end
                  end
               end
            else
               for(i=grav_y;i<0;i++)
                  if(map_get_pixel(fpgs[2],1,x,y+13)!=map_get_pixel(fpgs[0],6,5,0))
                     y++;
                  else
                     grav_y=0;
                  end
               end           
            end
         end
                 
         if(key(_space))
            if(grav_x>=0)
               graph=19;
            else
               graph=1;
            end
            if(grav_y>-15 && salto!=true)
               grav_y-=5;
            elsif(salto!=true)
               salto=true;
            end
         end


         x+=grav_x;
         if(grav_x<0)
            grav_x++;
         elsif(grav_x>0)
            grav_x--;
         else
            if(salto!=true)
               if(caja!=true)
                  graph=10;
               else
                  graph=110;
               end
            end
         end
         
         frame;
         
         if(y>640 && gravedad==true)
            break;
         elsif(y<0 && gravedad==false)
            break;
         elsif(idm=collision(type malos))
            break;
         end
      end
      //Si pasamos por aqui es que hemos muerto
      muerto=true;     
   end
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 09, 2012, 11:39:28 AM
Quote from: Yawin on March 09, 2012, 09:13:42 AM
O sea, lo que quieres es aplicar una gravedad, no?
En ese caso, en vez de asignarle a la y un valor. Asígnaselo a una variable a la que por ejemplo llames grav_y y vete sumándosela poco a poco a la y. No se si me explico.
Te voy a dejar el código del prota de un plataformas que hice, para ver si se entiende lo que digo. Espero que te ayude.


process prota(int eq, int iy)
   private
      int grav_y=0,grav_x=0;
      int i,j,k,idm;
      bool salto=false;
   end
   begin
      file=fpgs[1];
      graph=10;
      ctype=c_scroll;
      scroll[0].camera=id;
      size=23;
      z=0;
     
      /*delete_text(0);
      write_var(fnts[1],20,20,3,x);
      write_var(fnts[1],80,40,3,y);*/
     
      x=eq;
      y=iy;
      flags=0;
      graph=10;
      grav_y=0;
      grav_x=0;
               
      loop
         while(anim==true)
            frame;
         end
         
         if(key(_d) && map_get_pixel(fpgs[2],1,x+6,y)!=map_get_pixel(fpgs[0],6,3,0))
            // Animación de andar /////
               if(caja!=true)
                  j++;
                  if(j==2)
                     j=0;
                     if(graph<11)
                        graph=11;
                     end
                     graph++;
                     if(graph>=19)
                        graph=11;
                     end
                  end
               else
                  j++;
                  if(j==2)
                     j=0;
                     if(graph<111)
                        graph=111;
                     end
                     graph++;
                     if(graph>=119)
                        graph=111;
                     end
                  end
               end
            ////////////////////////////////
            grav_x=3;
            direc=false;
         end
         
         if(key(_a) && map_get_pixel(fpgs[2],1,x-6,y)!=map_get_pixel(fpgs[0],6,2,0))
            // Animación de andar /////
               if(caja!=true)
                  j++;
                  if(j==2)
                     j=0;
                     if(graph>9)
                        graph=8;
                     end
                     graph--;
                     if(graph<=1)
                        graph=9;
                     end
                  end
               else
                  j++;
                  if(j==2)
                     j=0;
                     if(graph>109)
                        graph=108;
                     end
                     graph--;
                     if(graph<=101)
                        graph=109;
                     end
                  end
               end
            ////////////////////////////////           
            grav_x=-3;
            direc=true;
         end
         
         if(grav_y<15)
            grav_y++;
         end
     
         if(gravedad!=false)
            flags=0;   
            if(grav_y>0)
               for(i=0;i<grav_y;i++)
                  if(!collision(type objetos) &&  !collision(type objetos) &&  map_get_pixel(fpgs[2],1,x,y+13)!=map_get_pixel(fpgs[0],6,0,0) && map_get_pixel(fpgs[2],1,x,y+13)!=map_get_pixel(fpgs[0],6,5,0))
                     y++;
                  else
                     if(grav_y>13 && salto!=false)
                        salto=false;
                        graph=10;
                     end
                  end
               end
            else
               for(i=grav_y;i<0;i++)
                  if(map_get_pixel(fpgs[2],1,x,y-13)!=map_get_pixel(fpgs[0],6,4,0))
                     y--;
                  else
                     grav_y=0;
                  end
               end
            end
         else
            flags=2;
            if(grav_y>0)
               for(i=0;i<grav_y;i++)
                  if(!collision(type objetos) &&  !collision(type objetos) && map_get_pixel(fpgs[2],1,x,y-13)!=map_get_pixel(fpgs[0],6,1,0) && map_get_pixel(fpgs[2],1,x,y-13)!=map_get_pixel(fpgs[0],6,4,0))
                     y--;
                  else
                     if(grav_y>13 && salto!=false)
                        salto=false;
                        graph=10;
                     end
                  end
               end
            else
               for(i=grav_y;i<0;i++)
                  if(map_get_pixel(fpgs[2],1,x,y+13)!=map_get_pixel(fpgs[0],6,5,0))
                     y++;
                  else
                     grav_y=0;
                  end
               end           
            end
         end
                 
         if(key(_space))
            if(grav_x>=0)
               graph=19;
            else
               graph=1;
            end
            if(grav_y>-15 && salto!=true)
               grav_y-=5;
            elsif(salto!=true)
               salto=true;
            end
         end


         x+=grav_x;
         if(grav_x<0)
            grav_x++;
         elsif(grav_x>0)
            grav_x--;
         else
            if(salto!=true)
               if(caja!=true)
                  graph=10;
               else
                  graph=110;
               end
            end
         end
         
         frame;
         
         if(y>640 && gravedad==true)
            break;
         elsif(y<0 && gravedad==false)
            break;
         elsif(idm=collision(type malos))
            break;
         end
      end
      //Si pasamos por aqui es que hemos muerto
      muerto=true;     
   end


Con el proceso personaje así, salta tanto izquierda/derecha como aribba/abajo o diagonal izquierda/derecha? Si es así lo estudiaré. Por lo visto, las variables grav_y y grav_x serán utilizadas con un proceso gravedad, no? Aunque por lo que observo... son privadas, asi que... la gravedad estará integrada en el proceso protagonita... O me estoy equivocando? Si no es como creo, díme de qué manera se podrían usar estas variables dentro de un proceso que controle la gravedad general del programa. Por ahora, yo uso dicho proceso con una única variable que recoge la gravedad exterior.
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: Yawin on March 09, 2012, 11:53:22 AM
No hace exactamente lo que tú necesitas. Pero salta. Si entiendes cómo va, no te resultará dificil hacer lo que quieres hacer.
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 09, 2012, 12:28:14 PM
Quote from: Yawin on March 09, 2012, 11:53:22 AM
No hace exactamente lo que tú necesitas. Pero salta. Si entiendes cómo va, no te resultará dificil hacer lo que quieres hacer.

Sinceramente el código, viendolo tal como esta, lo entiendo bien y sé que cambiando el contexto de algunas condiciones me funcionaría... pero, me pierdo si he de pensar en dónde y qué es lo que debo meter para conseguir lo que necesito... :S
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: Yawin on March 10, 2012, 08:24:14 AM
Pues no modifiques el mio. Haz el tuyo desde 0 recordando lo que has aprendido del mio. Y, una recomendación muy importante: hazte esquemas. Los programadores usamos mucho papel.
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 10, 2012, 10:59:37 AM
Quote from: Yawin on March 10, 2012, 08:24:14 AM
Pues no modifiques el mio. Haz el tuyo desde 0 recordando lo que has aprendido del mio. Y, una recomendación muy importante: hazte esquemas. Los programadores usamos mucho papel.

Lo sé... si soy partidario de los diagramas de flujo y dejarme explicaciones de cómo quiero los procesos internamente pero... da una pereza... a veces me sale más rentable hacerlo "sobre la marcha" aunque me salgan mucho más errores (claro que mirándolo así rentable no es...)
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: haitortiya on March 10, 2012, 11:31:29 PM
Bueno creo que puedo ayudarte, ademas es muy sencillo, mira lo hacemos asi, solo sigue tres pasos:

- Tu copias el codigo que te paso ya echo, llamado gravedad y lo incluyes en tu juego
- Al campeon le aplicas una frase muy cortita
- Luego simplemente, restale la Y, y caera solo.

(Si entiendo bien lo que has querido decir, tu quieres aplicar gravedad, este es el mejor caso que vas a tener, espero :) , y
con solo reestarle Y el tiempo que quieras, luego bajara ( Funciona con Collisiones con el mapa de durezas segun pixeles ) )
*Si necesitas ayuda por que no entiendes muy bien como funciona, dimelo y me curro mas la explicacion, ahora simplemente te lo paso

Aqui el codigo que añadiras a tu juego
PROCESS gravedad(int POINTER velocidad_gravedad,int mapa,RGB_suelo,RGB_techo);
//Proceso encargado de gestionar la gravedad de un proceso
PRIVATE
    vgravedad; // Variable para guardar temporalmente la gravedad
BEGIN
    // Coge la coordenada y a partir de la gravedad del protagonista (padre)
    vgravedad=(*velocidad_gravedad+=1); // Pero incrementada en 2
    IF (vgravedad>16) // Si es mayor de 16
        *velocidad_gravedad=16; // Haz que sea 16 la gravedad del protagonista
        vgravedad=16; // Y tambi‚n la variable temporal
    end
    IF (vgravedad<0) // Si la gravedad es negativa
        WHILE (vgravedad++!=0) // Mientras no sea cero, la incrementa
        // Si no se da con el techo
            IF (map_get_pixel( grafico [ mapa_durezas ],mapa,father.x,(father.y-graphic_info(father.file,father.graph,G_HEIGHT)*father.size/200))<>RGB_techo)
                father.y--; // Haz que el protagonista suba
            ELSE // Si no pon la gravedad a cero
                *velocidad_gravedad=0;
                BREAK;
            END
        END
    ELSE// Si la gravedad es cero o positiva
        father.y+=vgravedad; // Se suma a la coordenada del protagonista
        // Comprueba el rango vertical del movimiento del protagonista
        FROM vgravedad=-16 TO 7; // Acaba el proceso si se toca el suelo
            IF (map_get_pixel( grafico [ mapa_durezas ],mapa,father.x,(father.y+vgravedad+graphic_info(father.file,father.graph,G_HEIGHT)*father.size/200))==RGB_suelo)
                BREAK; // Sal si se encuentra con el suelo
            END
        END
        IF (vgravedad< // Si se encuentra con el suelo
            father.y+=vgravedad; // Se actualiza con el m ximo que se pueda mover
            *velocidad_gravedad=0; // Y se pone la gravedad a 0
        END
    END
END


Aqui la Linea que deveras poner en tu protagonista dentro del Loop
gravedad(&velocidad_gravedad,mapa_durezas,durezas_suelo,durezas_techo);

Y te recuerdo que...
- Donde dice mapa_durezas es un identificador, constante que identifica el mapa de dureza que estas utilizando
- Durezas_suelo, esta puesto en el codigo de gravedad, y hace referencia a el Pixel con el cual chocara en el mapa dureza
   y hara de suelo
- Dureza_techo, pues lo mismo pero de techo

*Si quieres modular la velocidad con la que afectara la gravedad, a el campeon le pones Velocidad_gravedad = ?? ( lo que
tu quieras ), yo nunca lo cambio

Si hces esto, con todos tus personajes, enemigos etc, simplemente le pones la barra esa, y le aplicas gravedad, y saltos como tu quieras.

Espero haberte ayudado, Un saludo
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 11, 2012, 02:32:01 AM
Quote from: haitortiya on March 10, 2012, 11:31:29 PM
Bueno creo que puedo ayudarte, ademas es muy sencillo, mira lo hacemos asi, solo sigue tres pasos:

- Tu copias el codigo que te paso ya echo, llamado gravedad y lo incluyes en tu juego
- Al campeon le aplicas una frase muy cortita
- Luego simplemente, restale la Y, y caera solo.

(Si entiendo bien lo que has querido decir, tu quieres aplicar gravedad, este es el mejor caso que vas a tener, espero :) , y
con solo reestarle Y el tiempo que quieras, luego bajara ( Funciona con Collisiones con el mapa de durezas segun pixeles ) )
*Si necesitas ayuda por que no entiendes muy bien como funciona, dimelo y me curro mas la explicacion, ahora simplemente te lo paso

Aqui el codigo que añadiras a tu juego
PROCESS gravedad(int POINTER velocidad_gravedad,int mapa,RGB_suelo,RGB_techo);
//Proceso encargado de gestionar la gravedad de un proceso
PRIVATE
    vgravedad; // Variable para guardar temporalmente la gravedad
BEGIN
    // Coge la coordenada y a partir de la gravedad del protagonista (padre)
    vgravedad=(*velocidad_gravedad+=1); // Pero incrementada en 2
    IF (vgravedad>16) // Si es mayor de 16
        *velocidad_gravedad=16; // Haz que sea 16 la gravedad del protagonista
        vgravedad=16; // Y tambi‚n la variable temporal
    end
    IF (vgravedad<0) // Si la gravedad es negativa
        WHILE (vgravedad++!=0) // Mientras no sea cero, la incrementa
        // Si no se da con el techo
            IF (map_get_pixel( grafico [ mapa_durezas ],mapa,father.x,(father.y-graphic_info(father.file,father.graph,G_HEIGHT)*father.size/200))<>RGB_techo)
                father.y--; // Haz que el protagonista suba
            ELSE // Si no pon la gravedad a cero
                *velocidad_gravedad=0;
                BREAK;
            END
        END
    ELSE// Si la gravedad es cero o positiva
        father.y+=vgravedad; // Se suma a la coordenada del protagonista
        // Comprueba el rango vertical del movimiento del protagonista
        FROM vgravedad=-16 TO 7; // Acaba el proceso si se toca el suelo
            IF (map_get_pixel( grafico [ mapa_durezas ],mapa,father.x,(father.y+vgravedad+graphic_info(father.file,father.graph,G_HEIGHT)*father.size/200))==RGB_suelo)
                BREAK; // Sal si se encuentra con el suelo
            END
        END
        IF (vgravedad< // Si se encuentra con el suelo
            father.y+=vgravedad; // Se actualiza con el m ximo que se pueda mover
            *velocidad_gravedad=0; // Y se pone la gravedad a 0
        END
    END
END


Aqui la Linea que deveras poner en tu protagonista dentro del Loop
gravedad(&velocidad_gravedad,mapa_durezas,durezas_suelo,durezas_techo);

Y te recuerdo que...
- Donde dice mapa_durezas es un identificador, constante que identifica el mapa de dureza que estas utilizando
- Durezas_suelo, esta puesto en el codigo de gravedad, y hace referencia a el Pixel con el cual chocara en el mapa dureza
   y hara de suelo
- Dureza_techo, pues lo mismo pero de techo

*Si quieres modular la velocidad con la que afectara la gravedad, a el campeon le pones Velocidad_gravedad = ?? ( lo que
tu quieras ), yo nunca lo cambio

Si hces esto, con todos tus personajes, enemigos etc, simplemente le pones la barra esa, y le aplicas gravedad, y saltos como tu quieras.

Espero haberte ayudado, Un saludo

Muchas gracias por haberte molestado en ayudarme haitortiya, lamentablemente esa es exactamente la gravedad que uso (y va de perlas, cierto ^_^) Pero hay un añadido en la línea clave que maneja la colision del personaje con el mapa de durezas que yo lo pongo algo más corto, quizás sea por eso por lo que sólo me salta hacia la derecha u izquierda. Usando la función map_info conseguiría, ademas de que se moviera por todo el camino (de arriba a abajo, teniendo por limites las paredes laterales) que saltara libremente al lugar que le indicara? O como ya tenía entendido, simplemente salta cuanto quiera yo ponerle...
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: haitortiya on March 11, 2012, 11:26:10 AM
Eso que has dicho de... "yo lo pongo algo más corto", si me pones un ejemplo de la linea que pones tu quizas pueda ver
si te falta algo importante, pero en si si usas el mismo codigo no le veo problema, a menos... Que lo que tu quieras es hacer
que el personaje pueda Andar hacia arriva y hacia abajo con un limite o algo, y a la vez, que pueda saltar, cambiado su Y mas
drasticamente y volviendo al punto de origen, seria eso? ( Tipo juegos como el teken 3 en su modo de aventura ).

Si es asi, se le podria buscar alguna solucion. Un saludo.
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 11, 2012, 02:13:30 PM
Quote from: haitortiya on March 11, 2012, 11:26:10 AM
Eso que has dicho de... "yo lo pongo algo más corto", si me pones un ejemplo de la linea que pones tu quizas pueda ver
si te falta algo importante, pero en si si usas el mismo codigo no le veo problema, a menos... Que lo que tu quieras es hacer
que el personaje pueda Andar hacia arriva y hacia abajo con un limite o algo, y a la vez, que pueda saltar, cambiado su Y mas
drasticamente y volviendo al punto de origen, seria eso?
( Tipo juegos como el teken 3 en su modo de aventura ).

Si es asi, se le podria buscar alguna solucion. Un saludo.

Exactamente eso, sí. Me dijo KeoH que para hacer eso había que mirarse más las teorías geométricas del escenario y jugar ya no con las coordenadas x e y, sino tambien, jugar con la profundidad, con la coordenada z; hacer como una especie de variables xi, yi, zi... cosa que todavía no comprendo bien porque sería como ir metiendose en embrollos de 3D y eso, si es así, aún no quiero aventurarme, prefiero hacer un plataformas y ponerle un RPG distinto, hacer lo que quería era sólo un mero capricho, saberlo hacer vamos... pero no necesario ni fundamental.

De hecho, si lo que estuviera haciendo fuera una aventura grafica, sin necesidad de salto, sí sabría jugar perfectamente con la coordenada z de profundidad, ahí sí que sería extremadamente simple.
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: haitortiya on March 11, 2012, 04:33:02 PM
Pues te voi a dar la solucion que uso yo, que es muy sencilla, sin comerse el coco:

- Tu tienes tu frase de la gravedad, para aplcar la gravedad, y esta dentro del Loop
  - le pones un IF / If ( estado != saltar ) y aplicas.
  - Cuando presiones por ejemplo key (_up) cambias el estado = saltar y le restas la Y

Pero en tu caso lo quieres al rebes, simplemente cambias, aplicas la gravedad cuando desees, si el estado es igual a saltar, por ejemplo
if ( estado == saltar ) ... Y asi cuando saltes tendra gravedad, y cuando no, pues subira y bajara con los limites que tu le pongas

  Asi, cuando estes saltando no aplicara gravedad, sino el salto que tu le quieras dar, y cuando no este en ese estado, pues aplicara
la gravedad. Epsero haberte ayudado, un saludo.
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 11, 2012, 04:44:35 PM
Quote from: haitortiya on March 11, 2012, 04:33:02 PM
Pues te voi a dar la solucion que uso yo, que es muy sencilla, sin comerse el coco:

- Tu tienes tu frase de la gravedad, para aplcar la gravedad, y esta dentro del Loop
  - le pones un IF / If ( estado != saltar ) y aplicas.
  - Cuando presiones por ejemplo key (_up) cambias el estado = saltar y le restas la Y

Pero en tu caso lo quieres al rebes, simplemente cambias, aplicas la gravedad cuando desees, si el estado es igual a saltar, por ejemplo
if ( estado == saltar ) ... Y asi cuando saltes tendra gravedad, y cuando no, pues subira y bajara con los limites que tu le pongas

  Asi, cuando estes saltando no aplicara gravedad, sino el salto que tu le quieras dar, y cuando no este en ese estado, pues aplicara
la gravedad. Epsero haberte ayudado, un saludo.

La única duda que tengo es por el tima del pixelado, date cuenta que el personaje, a veces estará en pleno color que sus pies detectarán y así es complicado que alguna vez sobresalga del suelo, y en cuanto saltará, por ejemplo estando demasiado abajo, al ir restándole a la Y llegará siempre hasta la parte superior donde detecte que se acaba el color y empieza otro, ¿comprendes?
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: haitortiya on March 11, 2012, 07:25:41 PM
Mmm no lo comprendo muy bien, mira te voi a ponr un ejemplo pequeño

Tu personaje:
process persojaje()

       loop

             if ( key (_space)) estado = saltar; end
             if ( key (_up)) estado = subir; end
             if ( key (_down)) estado = bajar; end

             if ( estado == saltar )         
            gravedad(&velocidad_gravedad,mapa_durezas,durezas_suelo,durezas_techo);
            y -= 10;
      else
           if ( estado == subir )
                 y -= 2; end
           if ( estado == bajar )
                 y += 2; end
      end
end

Entiendes ahora lo que te quieria decir?? pruebalo haber si te funiona, el codigo lo he echo rapido, asi que adaptalo bien :)

Un saludo
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: Rein (K´)ah Al-Ghul on March 11, 2012, 07:33:08 PM
la gravedad tendrias que tenerla siempre, si el personaje esta en una  borde y avanza al vacio caera...
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: haitortiya on March 11, 2012, 07:45:57 PM
En teoria no caeria, se me ha olvidado poner una cosa, que la he presupuesto

           if ( estado == subir and y > Loquequieras1)
                 y -= 2; end
           if ( estado == bajar and y < Loquequieras2)
                 y += 2; end


Por ese metodo, no deberia caerse por ningun lado, por que sin gravedad, no existe el vacio, se mueve por la pantalla sin mas
por lo cual aun asi no caeria, yo creo que asi esta bien, ademas ais lo uso yo.

(Les he añadido el and y +- Loquequieras ).  Un saludo
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 11, 2012, 10:54:44 PM
Gracias chicos, realmente, tal y como lo has puesto haitor, casi sería mejor hacer un switch y ponerlo, mas orden (es una opinión). Pero vamos, ya digo que la gravedad la tengo puesta y me va bastante bien. Quizás si pusiera un gif de lo que quiero, sabríais exactamente cual es el capricho que me gustaría saber. El juego lo voy a seguir desarrollando como plataformas pero vamos, que por saber eso siempre es algo bueno. Si alguno le interesa, recomiendo que vea viejas glorias del videojuego como este título: Turtles IV: Turtles in time para SNES y sabrá a lo que me refiero. Intetaré poner unas capturas aunque así no sé si captaríais algo pero, algo sería.

edito: bien, qué mejor es que poneros un link para que sepáis que clase de estilo es mi capricho, no es, por supuesto, un plataformas, sino un mata-mata (yo contra todos) arcade, pero, qué mejor manera para saber exactamente lo que quiero aprender. http://www.youtube.com/watch?v=9GBAJIAuUHQ

Sobre el video: fijaros simplemente a partir del minuto 1:27, de ahí hasta lo que queráis.
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: haitortiya on March 12, 2012, 03:32:08 PM
Vamos, el tipico efecto de esos juegos. Mirandolo asi, si nadie te da una solucion mejor, te puedo dar la que se me ha ocurrido

- Tal y como en post anteriores te pongo, tu pones ese codigo, pero a la hora de saltar, lo unico que haces es activar la gravedad
durante un tiempo ( A la vez que cambias graficos etc... ) Y ara que te funcione, tienes que pintar todo el suelo que va a pisar y un
poco mas por arriva del color del suelo, asi cuando la gravedad le afecte subira de golpe, para colocarse arriva del suelo, que basicamente
es lo que hace el codigo de gravedad, subir hasta alcanzar el punto maximo del suelo.

No se me ocurre otra cosa, pero como parche para que funcione bien, funcionara. Un saludo

*Yo uso siempre Ifs, los switch no me gustan mucho :) , pero es una mania, tu usa lo que quieras :)

Edito: Pero ahora que he visto unpoco mas el video, yo creo que en este estilo de juegos no aplican gravedad, simplemente a la hora de asltar aplican mucho mas movimiento, pero hacia arriba, prueba las dos formas. Y ya nos contaras
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 12, 2012, 04:12:27 PM
Gracias haitor de nuevo por las molestias. Así, reflexionando sobre lo comentado y viendo como estoy desarrollando y gestionando los mivimientos y el juego en general, se me ocurrió hacerlo de forma simple y básica pero con algunas cosillas avanzadas que puedo ser capaz de hacer. Y sé que me va a salir. Solo lo preguntado de los saltos y el video mostrado? Supongo que, de algún modo, utilizarían el chip de la super nintendo que le daba la capacidad de generar gráficos vectoriales para simular las tres dimensiones, lo leí hace mucho tiempo y la SNES era una de esas consolas en integrarlo, el llamado "Cerebro de la bestia" que, supuestamente, a veces trabajaba con gráficos de 16 bits reales y a veces sólo con 8 y algún bit más. Juego como ese o Super Castlevania IV, o incluso el Doom, funcionaron en la SNES con sprites dignos de una consola de las actuales pudiendo mover "3D" simulándolo. El truco estará en saber manejar vectores, seguramente. Te doy karma++ por las molestias.
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: Rein (K´)ah Al-Ghul on March 12, 2012, 04:19:48 PM
la sombra es la posicion real y cuando saltas te solapas con el resto (la Z en mejor)
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: haitortiya on March 12, 2012, 06:56:24 PM
No es ninguna molestia, aqui nos ayudamos todos.

Por ultimo voi a hacerte un ultimo comentario, y asi ya si quieres cerramos el tema, ya que ya sabes como hacerlo.
Hay un pequeño truco con todo esto de movimiento y posiciones, y yo en mis juegos lo hago muchas veces, simulando que tu
campeon tubiese alguna sombra, en el mismo grafico, pasandolo por "Automatizar" de Photoshop o algun programa parecido
coges todos los graficos de salto, y les separas la sombra unos 120px (Lo alto que quieas que sea el salto), asi, si el personaje
tiene que saltar, lo hara, y tu solo tendras que procesar los graficos, por que en el grafico ya salta.

Resumen: tu cambias el grafico y lo separas de la sombra la distancia que desees, en el codigo solo emites los graficos.

Gracias por el Karma, y espero haberte ayudado. Un saludo
Title: Re:Hacer saltos diagonales o hacia arriba o abajo
Post by: BlySntK on March 12, 2012, 07:09:25 PM
Mira, lo de la sombra no había caido, sé que en codificación, la sombra se hace con un proceso padre y otro hijo, no me acuerdo como era lo que había que poner en el proceso hijo, creo que había que jugar con el alpha, si mal no recuerdo, alpha y color negro... pero vamos... siempre puedo mirar algún codígo de los expuestos en los juegos.