tengo una duda que seguro sera una tonteria pero no se como resolverla,
quiero hacer un objeto "no solido" que sirva de plataforma (que el personaje la atraviese desde abajo y cuando la sobrepase se haga solida), vale hasta ahi bien he conseguido hacerla para el player 1, pero el problema aparece cuando quiero que se aplique a los enemigos y al player 2 sin que interfieran las acciones entre estos. ?deberia de crear el mismo objeto varias veces y darle acciones diferentes para la colision con cada elemento(player 1, player 2...)? o ?lo podria hacer desde el mismo objeto?
espero que podais echarme un cable
Ese es el problema cuando trabajas con solidos... Lo que debes hacer es dejar los bloques como no-solidos, y luego mediante codigo organizar la colision
Mas o menos la idea es asi:
[gml]//Si la velocidad vertical es mayor a 0 es porque esta cayendo
if (vspeed > 0){
//Los proximos valores de "14" los cambias de acuerdo al tama?o de tu sprite
bloque = collision_rectangle(x-14,y+1,x+14,y+vspeed,0,0);
if (bloque){
y = bloque.y-16; //El 16 es el medio tama?o del bloque
//Cancelamos gravedad y velocidad vertical y cuadramos la colision
vspeed = 0;
gravity = 0;
//move_contact_all(270,12);
//No estoy 100% seguro del move_contact_all
}
}[/gml]
De este modo, el personaje se detendra solo cuando este cayendo, sin importar la velocidad de caida
NOTAS:
1. Debes acomodar los valores de 14 y 16 a tus necesidades
2. Si utilizas algo como "if (place_free(x,y+1)){ gravity = 0.5; }", entonces esto te dara error ya que nunca cancelara la gravedad
3. Si es el caso del 2, entonces debes cambiar el codigo de activar la gravedad por uno de colision.
4. Te haria un ejemplo, pero estoy trabajando en estos momentos XD
Saludos.
cree objetos nuevos para probar tu codigo en una nueva room solo con estos elementos, el codigo me dio error (cosas como if place free o gravity no intervienen) estuve trasteando un poco y sigo teniendo el problema de que si un objeto (enemigo) es mas grande entre el espacio entre plataformas (nosolido) este no pasa. he probado expresiones como if enemigo.bbox_botton > nosolido.bbox_top (solid=false)else(solid=true) pero nada todo lo que le ponga me interfiere luego con las demas colisiones de otros objetos. ?habria alguna manera de establecer prioridad al jugador 1 y 2 en estas colisiones? o ?se pueden hacer del mismo objeto varias variables solid? osease si el enemigo (encima) y el jugador (debajo) se encuentran en colision con la misma palataforma (nosolido) y esta conserve los valores de ambos (se comporte como 2 objetos)
adjunto imagen de lo que quiero hacer para que se entienda mejor
Lo que tu quieres es que el personaje pueda atravesar las plataformas desde abajo para estar sobre ellas, pero que cuando este sobre ellas, obviamente, que no caiga. Verdad?
Bueno, aca te dejo un ejemplo creado por el usuario: 3dgeminis.
Este ejemplo demuestra como hacer esto que tu necesitas.
Nota: Este ejemplo esta hecho con y para plataformas moviles, pero seguramente te va a servir, puedes adaptarlo a lo que tu quieres.
el personaje lo tengo resuelto lo que me dan problemas son los enemigos. estoy viendo el ejemplo y son plataformas moviles... pero bueno voy a trastearlo por si puedo acoplar estos codigos a los enemigos. gracias
?Por que no pones el mismo codigo que te di, con los enemigos?, de ese modo quitas todos los objetos solidos y se te arregla lo de poder pasar por el medio de dos bloques...
---
Saludos.
lo intente, hice el elemento bloque con el mismo nombre para notocar el codigo pero tiro este error
FATAL ERROR in
action number 1
of Create Event
for object enemi:
COMPILATION ERROR in code action
Error in code at line 4:
bloque = collision_rectangle(x-14,y+1,x+14,y+vspeed,0,0);
^
at position 13: Variable name expected.