Caerse de una plataforma en un beatemup

Started by DCelso, October 20, 2009, 02:30:28 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

Hola a todos, estaba haciendo un ejemplo de como seria subir y bajar de plataformas en un beat em up pero no se me ocurre como implementar la caída de una plataforma. Actualmente entro y salgo de estas saltando, pero andando no veo como hacerlo.
Adjunto el ejemplo por si alguien sabe como hacerlo.
De camino si se le ocurre como simplificar el código para que sea más facil de entender que me lo diga también.
el código en cuestión es el siguiente

    graph = load_png("resources/player.png");
    control_point[0]=0;
    control_point[1]=graphic_info(0,graph,G_HEIGHT)/2;
    point (control_point[0],control_point[1]);
    color_blocking = map_get_pixel(0,id_hmap,2,2); // Negro
    color_elevation[0] = map_get_pixel(0,id_hmap,25,120); // blanco
    elevations[0]=0;
    color_elevation[1] = map_get_pixel(0,id_hmap,200,165); // rosa
    elevations[1]=20;

    color_falling[0]= map_get_pixel(0,id_hmap,142,168); // verde ;
    color_falling[1]= map_get_pixel(0,id_hmap,150,152); // azul ;
   
While (!key(_esc))
        current_color = map_get_pixel(0,id_hmap, x + control_point[0], y + control_point[1]);
        if (state == 0)
            if (current_color == color_falling[0])
                y++;
            end
            if (current_color == color_falling[1])
                y--;
            end
            If (key(_UP))
                If (map_get_pixel(0,id_hmap,  x + control_point[0], y + control_point[1] - 1) == current_color)
                    y--;
                End
            End
            If (key(_DOWN))
                If (map_get_pixel(0,id_hmap,  x + control_point[0], y + control_point[1] + 1) == current_color)
                    y++;
                End
            End
            If (key(_LEFT))
                flags =1;
                If (map_get_pixel(0,id_hmap,  x + control_point[0] - 1, y + control_point[1]) == current_color)
                    x--;
                End
            End
            If (key(_RIGHT))
                flags =0;
                If (map_get_pixel(0,id_hmap,  x + control_point[0] + 1 , y + control_point[1]) == current_color)
                    x++;
                End
            End
            If (key(_A))
                if (current_color == color_elevation[0])
                    src_y_elevation = elevations[0];
                elsif(current_color == color_elevation[1])
                    src_y_elevation = elevations[1];
                end
                x_direction = 0;
                If (key(_LEFT))
                    x_direction = -1;
                elsif  (key(_RIGHT))
                    x_direction = 1;                   
                end
                state = 1;
                y_jump = top_jump;
            End
        elsif (state == 1)
            if (y_jump > 0)
                y--;
                y_jump--;
            else
                state = 2;
                y_jump = top_jump;
            end
            x+=x_direction;
        elsif (state == 2)
            if (current_color == color_elevation[0])
                dst_y_elevation = elevations[0];
            elsif(current_color == color_elevation[1])
                dst_y_elevation = elevations[1];
            end
            y_elevation = dst_y_elevation - src_y_elevation;
            if (y_jump - y_elevation> 0)
                y++;
                y_jump--;
            else
                state = 0;
            end
            x+=x_direction;
        end
        Frame;
End
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Quote from: DCelso
pero andando no veo como hacerlo.
Fácil.
Si pruebas el ejemplo adjunto, Mars puede subirse al coche y bajar de este saltando pero no puede bajarse de éste andando, esta es la pregunta.
¿Como puedo modificar el código para que Mars pueda bajarse del coche andando( esto quiere decir, sin tener que dar al botón de salto simplemente guiándola hacia el borde con las teclas de dirección)?
El mapa de durezas ya tiene los colores adecuados(o debería de tenerlos) para realizar la solución.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DjSonyk

La verdad DCelso,para ese tipo de vista,yo haria el coche como un proceso que se puduiera subir y bajar de el,asi a priori, ademas lo suyo seria tener un mapa de durezas que comprobara si esta en el aire o no,por eso pienso que lo deverias tener en coche como un proceso,seria facil seria comprobar en el salto si cae encima de algun proceso,y mientras huviera collision estaria encima y cuando se acabara la colision caeria al suelo...Mucho vicio tuve yo en ese juego siendo un crio xD,si alguien quiere la version de dos la tengo por ahi  8)

DCelso

Es un ejemplo facil que he visto de un cambio de plataforma pero imagínate que no es un coche es un simple cambio de altura en el terreno, un escalón.
Yo intento ver como programar el motor para que al ir andando se cambie de estado el personaje y vaya hacia abajo hasta llegar a la nueva altura.
Si ver la imagen hmap.png verás el mapa de durezas que uso ahora para el sistema.

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DjSonyk

Ahh,bueno eso no tiene mucho problema,lo puedes hacer de al menos estas dos formas...
1 : En cada ejecución del proceso Player compruebe que tiene debajo los pies,si en el mapa de durezas por ejemplo cojo el color rojo eso quiere decir que mantien la Y, y si no hay nada entoces cae,puedes tener una variable por ejemplo Inc_Y,que este a 0 cuando el valor sea rojo, y +2 cuando este transparente,por ejemplo.Para subir un escalon deveria comprobar en el mapa de durezas si choca con el color amarillo,por ejemplo,y si es asi comprobar unos pixel mas arriba si hay rojo y si es asi creas una la animación subir escalon y cambias el valor de Inc_Y,y claro esta teniendo otra en Inc_X,para bajar no haria falta comprobar lo de amarillo,basta con lo primero que te explique en este texto.
La 2: igual pero la comprobación solo si haria si pulsaras una tecla,lo malo de esto es por ejemplo si pulsas el boton de salto y lo sueltas y caes fuera de una platarforma,escalon,que seguramente te quedarias en el aire...
Yo pienso que por una sentencia de comprobación y tres If o un Swicth tampoco es muy importante tenerlo solo al pulsar una tecla,pues no consume casi nada de velocidad...

DCelso

umn, creo que no es eso exactamente lo que busco, si juegas a los simpsons en mame mira lo que pasa cuando bajas del coche sin saltar ya sea por la izquerda o por la derecha o por arriba o por abajo. Tampoco ahora mismo se saltar hacia abajo y hacia arriba pero eso creo que no será dificil. ahora estaba concentrándome en bajar de un escalon alto (del que puedes bajar pero no puedes subir sin saltar)
Intento recrear el motor de juego de los simpsons.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DjSonyk

Si lo que deseas es con esa perpectiva,es decir tipo Final Fight,Street or Rage,Los simpons,ect... te recomiendo que en las cosas que se puedan subir ,agarrar,destrozar ,ect lo hagas como procesos,ya que si lo haces con durezas,cuando pases por arriba de ellos,no tapara los pies al personaje y parecera que estas encima del coche,aparte que te limita el movimiento,pues deves tener una dureza ,en el caso del ejemplo,que no te dejara "bajar" o lo que es lo mismo subirte en el coche,desde la parte de arriba sin saltar claro esta,ademas que te vas a volver loco ,hasta depurarlo,eso del ejemplo vendria bien si en vez de un coche por ejemplo foso...en el que te podrias caer,pero para lo contrario lo veo un poco "extraño"....De todas formas a ver que se cuentan por aqui igual te dan otra solución...  ;)

splinter_work

no entiendo tu duda real... porque si dices que tienes resuelto el salto, bajar es lo contrario... y tambien lo tendrias resuleto...

DCelso

:), si fuese tan facil no lo preguntaría.
A ver, por lo que dices creo que no viste el ejemplo porque se ve fácil el problema, pero yo te lo explico más aún si es lo que quieres:
Es algo como esto:

          _________ plataforma A
______               __________plataforma B

saltando consigo subir desde la plataforma B a la  plataforma A
cuando estoy en esta nueva plataforma puedo volver a saltar para salir hacia la plataforma B (esto funciona) pero:
si ando hacia adelante debería de caerme otra vez a la plataforma B, pues esto es lo que no consigo.
Tienes que llevar este problema a un sistema beatem up, en el que el mapa de durezas del suelo no es una línea sino un área. Actualmente si ves lo que tengo diseñado el estado 0, es andando, hay un getcurrencolor que no te permite moverte a un color distinto a el de la plataforma en la que te encuentras y es aquí donde creo que debería actuarse. En el estado de salto estado = 1 (ascendente) y estado = 2 (descendente) el color que pisas ya no se comprueba por lo que permite saltar a otra plataforma/ zonas de otro color en el mapa de durezas.
¿Queda más claro?
Quiza el problema es que ves evidente la solución y te extraña que yo no, pero estoy ultra "blocked" ahora mismo, fijo que es una chorrada,algo como if noseque cambia a estado 2. Pero no lo veo, no.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

splinter_work

a ver... cuando caes andando tienen que bajar de plataforma? y cuando saltas hacia abajo bajas de plataforma?
y entonces, por que no haces que cuando caes andando se setee el flag como si hubieses saltado hacia abajo?

en verdad me estoy perdiendo de algo...

FreeYourMind

No he probado aún tu ejemplo, pero no puedes usar la variable x,y para ello ? O variables auxiliares, o que el mapa de durezas de las plataformas utilizen otras variables distintas al suelo para posicionamiento del prota ??.

En Castle of dr. malvado me recuerdo que pasaba de nivel cuando estaba en una determinada posicion (x,y), incluso en mi remake Geca adventure, ponia el prota hablando si estaba en determinado punto del mapa, y algunos de estos puntos creo que incluso estaban encima de plataformas mobiles, si puedes filtrar por esto por ejemplo sabrias en que posición el prota esta al caer del coche y desplazar el gráfico al coincidir con esas coordenadas. De todos modos si hasta el finde no lo resuelves, ya te lo miro.

FreeYourMind

Estaba leyendo lo de los estados, y si te encuentras en el estado de la plataforma superior y pones un contador que por ejemplo moviendo el prota hacia la izquierda sume la deslocacion x caminada, como sabes la largura de la plataforma, pues cuando el prota llege a ese valor le cambias de estado al de la plataforma inferior o se lo quitas para que caiga, y le pones gravedad en ese instante para que el prota caiga. Creo que esto seria una solución aprovechando las coordenadas x.

Windgate

Oh, hace nada estaba hablando con unos alumnos de lo mismo :o

Hemos concluído en hacer un mapa de durezas basado en "carriles", diferentes colores para cada altura, y nos ha quedado claro el caso de diferente altura de plataformas horizontalmente... Para el caso vertical no hemos llegado a un algoritmo válido.

Ahora no tengo mucho tiempo pero estaré al corriente de este hilo, gran idea DCelso.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DjSonyk

DCelso :
1. Tienes mas la zona verde esta muy arriba por eso se te atasca el personaje al querer salir del coche.
2. Es lo que te llevo diciendo en todos los post,deves comprobar que no este en el aire para hacer que caiga ,el alogaritmo del salto te vale,pero lo tienes que tener fuera del salto.
3. Para plataformas de simple verticalidad,eso te vale,pero para el ejemplo que tienes tu ,que es "3D",puesto que puedes subir y bajar verticalmente,si lo quieres para algo generico aun asi no te serviria...al menos desde mi punto de vista,pues el tener esa clase de durezas a mi lo que me viene a la cabeza es una trampa en el suelo,foso,agua,ect y no un obtaculo como pretendes...