Hola. Tengo dos bloques: el bloque A, que para el jugador 1 es un bloque s?lido y para el jugador 2 es como si no hubiera nada; y el bloque B que para el jugador 1 es como si no hubiera nada y para el jugador 2 es s?lido. El caso es que lo tengo configurado de manera que cuando el jugador 1 colisiona con el bloque A, ?ste se vuelve s?lido, y cuando llega el otro jugador y lo toca, en principio es s?lido, lo cual hace que haya un peque?o atasco, hasta que lo vuelve no s?lido y todo funciona correctamente (ocurre lo mismo con el otro bloque).

Colisi?n jugador 1 con bloque A
other.solid=true
move_contact_solid(direction, 12);
if not place_free(x,y+1){
vspeed=0;
doblesalto = 2;}
if not place_free(x,y-1){
vspeed=0}
if not place_free(x+1,y){
hspeed=0}
if not place_free(x-1,y){
hspeed=0}

Colisi?n jugador 1 con bloque B
other.solid=false

Mi pregunta es si hay alguna otra forma de programar esto para que no haya ese peque?o atasco. Creo que se puede usar la sentencia switch, pero no la domino todav?a muy bien...

Saludos y gracias de antemano.


si es que te entendi ...

es que cuando un objeto no es solido
puede haber colision

y los que son solidos el otro objeto se detiene en el contorno y no penetra para colisionar

utiliza
if distance_to_object(jugador2)<1

Replanteo todo.

El jugador 1 colisiona con el bloque A, el cual es no s?lido. Hay un peque?o atasco ah?, porque al colisionar con el bloque, penetra y se vuelve s?lido. Despu?s de eso, el bloque se queda s?lido. Cuando el jugador 2 colisiona con el bloque, al estar s?lido, primero hay otro atasco al colisionar, y luego lo traspasa, porque lo ha vuelto no s?lido. Y as? sucesivamente (Pasa lo mismo con el otro bloque pero a la inversa).

T? sugieres que cuando se acerque el jugador 1 se vuelva s?lido ?verdad? Pero si se da el caso de que jugador 1 y 2 est?n en la misma posici?n ?c?mo se queda el bloque?

Por eso no me sirve (por desgracia). :-[

Se me ocurre que podrias poner una condicion en el bloque que si los 2 estan en contacto con el bloque al mismo tiempo no cambie de estado. Talves lo que quieras es que ambos jugadores puedan atravezar el bloque desde abajo y no desde arriba sin tener que estar cambiando entre solido y no solido???

Lo que mejor me vendr?a en este caso es que el personaje reaccione de una manera u de otra al colisionar ante el bloque. Quiz?s no haya que programar el bloque, sino los eventos de colisi?n con los personajes, porque lo que quiero es que para un personaje dicho bloque sea s?lido, y para el otro no.
Cita de: 3dgeminis en Octubre 15, 2010, 07:59:48 PMTalves lo que quieras es que ambos jugadores puedan atravezar el bloque desde abajo y no desde arriba
Nop, esas no son mis intenciones. El bloque es s?lido para un personaje (mas s?lido que la galena) y para el otro personaje es como si no hubiera nada.

Pienso que lo mejor es programar a los personajes en vez de modificar s?lido y no s?lido en los bloques. Pero lo que no s? es c?mo. :-[

Pod?s hacer tu propio sistema de s?lidos y no s?lidos mediante variables, o mi preferido, crear dos tipos de plataformas, una para el p1 y otra para el p2. La idea ser?a que cada personaje reaccione s?lamente ante su tipo de plataforma, entonces simplemente agregas ambas en el mismo lugar para que no se note que hay 2 y solucionado




Cita de: Texic en Octubre 16, 2010, 04:10:28 AM
mi preferido, crear dos tipos de plataformas, una para el p1 y otra para el p2. La idea ser?a que cada personaje reaccione s?lamente ante su tipo de plataforma, entonces simplemente agregas ambas en el mismo lugar para que no se note que hay 2 y solucionado

Hay un problema con eso. Y es que mientras un objeto sea s?lido, aunque no haya acciones definidas ni un evento colision, va a 'pseudo-colisionar' con el bloque. Lo acabo de comprobar (lo que propones) y no funciona. Colisiona con el bloque creado. Puede que lo haya programado mal (no me f?o nada de m? mismo) pero no veo nada incorrecto.

Mi pregunta ahora es: ?Hay alguna forma de evitar usar la casilla s?lido de Game Maker? Es decir, programar el que la colisi?n con un objeto sea s?lida o no. Creo que eso solucionar?a mi problema.

CitarHay un problema con eso. Y es que mientras un objeto sea s?lido, aunque no haya acciones definidas ni un evento colision, va a 'pseudo-colisionar' con el bloque.
Entonces debes tener un place_free metido por ahi en el c?digo...
Bueno, siempre puedes usar la funci?n collision_point o line. Le especificas el objeto al cual se refiere la colision, almacenas su id en una variable y te fijas si tu nueva variable para s?lido est? en 1 o en 0. Bueno, te dejo un ejemplo, es en GM6, el 7 y el 8 no me andan de repente  :'(




Cita de: Texic en Octubre 16, 2010, 05:38:16 PM
Entonces debes tener un place_free metido por ahi en el c?digo...
Efectiviwonder, lo tengo para activar la gravedad:

if(place_free(x,y+1))
{
    gravity = 0.5;
}
else{
gravity=0
}

?Por qu? c?digo lo puedo sustituir?

#9 Octubre 16, 2010, 06:19:51 PM Ultima modificación: Octubre 16, 2010, 06:29:17 PM por Texic
Fijate el adjunto q te pas?
EDITO: A?n asi, se podr?a sustituir con
[gml]if(place_meeting(x,y+1,plataformap1))
{
gravity = 0.5;
}
else{
gravity=0
}[/gml]
Y en el p2 le cambias la plataforma con la que colisiona a la plataformap2. Pero lo detectaria aunq estuviera en no solido...




?Es este el c?digo que tengo que poner?a=collision_line(x,y+sprite_height+vspeed,x+25,y+sprite_height+vspeed,object1,1,1)
if a=-4 or a.solidp1=0 {vspeed+=0.5}
else {if vspeed<>-1 and vspeed<>0 {move_contact_all(270,vspeed)} vspeed=0}

Porque me da error. Dice que no sabe cu?l es la variable solidp1.

He probado a cambiarla por solid(nombredemipersonaje) pero tampoco lo reconoce.

EDITO: Acabo de ver el EDITO tuyo XD.

Sin embargo lo mejor ser?a sustituirlo con ese codigo q pusiste, solamente tienes q activar que las variables no inicializadas se traten como 0

Pero con algunas modificaciones, ya que ese +25 por ej era por ej bounding box del sprite q us? en el ejemplo





Es el 6.1 que tradujo nuestra comunidad, est? en buscar recursos. El 8 no me anda m?s




Me rindo. No se me da nada bien deshacer todo el entramado que tengo puesto ya. Me acabo de fijar que tengo muchos place_free puestos y que al cambiar algo deja de funcionarme el sistema de saltos y todo. Me conformar? con evitar poner los bloques en posiciones que puedan dar lugar a los peque?os atascos que menciono. :-\

Gracias a todos los que me hab?is ofrecido ayuda.