Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Una mecánica de juego poca vista y muy explotable [Resuelto]  (Leído 1115 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Naitsabes0

Respuesta #15 en: Diciembre 13, 2017, 10:23:34 pm
¿Entonces porque traspaso los objetos aunque los haya activado?

 


Desconectado brunoxzx

Respuesta #16 en: Diciembre 14, 2017, 01:37:50 am
¿Entonces porque traspaso los objetos aunque los haya activado?
Traspasas los objetos porque no tienen ningún código para colisionar, tú debes hacerlos sólidos y poner el código que normalmente pones a tus muros, también puedes hacer al "obj_muro_color" hijo de tus muros normales si lo consideras conveniente.

y prueba cambiando la parte que dice esto "sign(alarm[0] mod 2)" por una que diga esto "!sign(alarm[0] mod 3)" para que parpadee bien y no se quede en blanco...

 


Desconectado Naitsabes0

Respuesta #17 en: Diciembre 14, 2017, 07:01:41 am
¿Entonces porque traspaso los objetos aunque los haya activado?
Traspasas los objetos porque no tienen ningún código para colisionar, tú debes hacerlos sólidos y poner el código que normalmente pones a tus muros, también puedes hacer al "obj_muro_color" hijo de tus muros normales si lo consideras conveniente.

y prueba cambiando la parte que dice esto "sign(alarm[0] mod 2)" por una que diga esto "!sign(alarm[0] mod 3)" para que parpadee bien y no se quede en blanco...
Honestamente no quería ponerle el estado solido, porque me puede causar problemas, pero si, creo que haciendo que su padre sea el objeto de las colisiones de murallas es una buena idea, por otro lado logre hacer 2 cosas distintas, el que funciona como suelo y el que funciona como puerta/llave, creo que a futuro tendré que cambiarle el sprite, nombre y el objeto padre, algo asi como obj_Padre_Bloque_Color_Solido y obj_Padre_Bloque_Color_Botón.


Las posibilidades son limitadas por mi imaginación, supongo que puedo dar este tema como finalizado si no fuera porque el jugador se queda inmóvil en la plataforma, en los bloques verdes el jugador mueve sus patitas, pero no puede avanzar ni saltar, claramente porque estos bloques no tienen esas físicas, por lo que su padre debería ser hijo del objeto muralla con esas físicas, pero el resultado final de eso es.


El objeto muralla no tiene códigos, simplemente el jugador lo considera solido, y por ende sus hijos también, pero al parecer los objetos, tanto bloques como pinchos se convierten en paredes comunes sin hacer nada, por lo que tendría que elegir entre una pared que me deja pegado hasta destruirse o unos bloques sin funcionamiento, creo que la 1° es mejor opción.
« última modificación: Diciembre 14, 2017, 07:14:49 am por Naitsabes0 »

 


Desconectado brunoxzx

Respuesta #18 en: Diciembre 14, 2017, 07:23:47 am
¿Como haces las físicas de tu juego, gravedad y sobre todo, cual es el código que sua tu personaje para colisionar con los muros?

 


Desconectado Naitsabes0

Respuesta #19 en: Diciembre 14, 2017, 10:51:42 am
¿Como haces las físicas de tu juego, gravedad y sobre todo, cual es el código que sua tu personaje para colisionar con los muros?
obj_Jugador
CREATE
Código: [Seleccionar]
///Variables
vsp = 0;
hsp = 0;

STEP
actions1
Código: [Seleccionar]
/// Sistema de plataformas
grav = 1;
movespeed = 4;
jumpspeed = 25;
// Gravedad
if (vsp < 15 and !place_meeting(x,y+1,obj_Solido)) vsp += grav;
// Movimiento
left = -keyboard_check(ord('A'));
right = keyboard_check(ord('D'));
move = left + right;
hsp = move * movespeed;
// Salto
jump = keyboard_check_pressed(ord('W')) and place_meeting(x,y+1,obj_Solido);
if(jump) vsp += -jumpspeed;
// Colisiones típicas
if place_meeting(x+hsp,y,obj_Solido){
    while(!place_meeting(x+sign(hsp),y,obj_Solido)) x+=sign(hsp);
    hsp = 0;
}
x += hsp;
if place_meeting(x,y+vsp,obj_Solido){
    while(!place_meeting(x,y+sign(vsp),obj_Solido)) y+=sign(vsp);
    vsp = 0;
}
y += vsp;

STEP
actions2
Código: [Seleccionar]
/// Animación y Dirección
if (hsp != 0) image_speed = 0.5;
else {
    image_speed = 0;
    image_index = 0;   
}
if (hsp < 0) image_xscale = -1;
if (hsp > 0) image_xscale = 1;

obj_Solido
Ningún evento     
Código: [Seleccionar]
///nada

obj_Muro_Color            ///Es hijo de obj_Solido
obj_Bloque_Verde        ///Es hijo de obj_Muro_Color //es solido
obj_Bloque_Amarillo    ///Es hijo de obj_Muro_Color
obj_Pincho_Verde        ///Es hijo de obj_Muro_Color //es solido
obj_Pincho_Amarillo    ///Es hijo de obj_Muro_Color

Resultado:

 


Desconectado brunoxzx

Respuesta #20 en: Diciembre 16, 2017, 01:19:33 am
A ver.... Intenta hacer al "objeto_muro_color" hijo del "obj_solido" y ademas dejarle la casilla solid marcada de tal modo que los "objeto_muro_color" funcionen bien como muros, pero no como destructibles.

Ahora hay dos cosas que podrían funcionar, la primera es cambiar el código que el "obj_jugador" tiene en el evnto step al evento "end step". Aquí pruebas si ya funciona. Si no, prueba cambiandolo al evento "begin step".

Si eso no sirve deja el código donde estaba y cambia lo último por esto:
// Colisiones típicas
var c1=instance_place(x+hsp,y,obj_Solido);
if (c1){
    while(!place_meeting(x+sign(hsp),y,obj_Solido)) x+=sign(hsp);
    hsp = 0;
    with(c1) event_perform(ev_collision, other.object_index);
}
x += hsp;
var c2=instance_place(x,y+vsp,obj_Solido);
if (c2){
    while(!place_meeting(x,y+sign(vsp),obj_Solido)) y+=sign(vsp);
    vsp = 0;
    if (c2!=c1) with(c2) event_perform(ev_collision, other.object_index);
}
y += vsp;

 


Desconectado Naitsabes0

Respuesta #21 en: Diciembre 16, 2017, 05:33:35 am
A ver.... Intenta hacer al "objeto_muro_color" hijo del "obj_solido" y ademas dejarle la casilla solid marcada de tal modo que los "objeto_muro_color" funcionen bien como muros, pero no como destructibles.

Ahora hay dos cosas que podrían funcionar, la primera es cambiar el código que el "obj_jugador" tiene en el evnto step al evento "end step". Aquí pruebas si ya funciona. Si no, prueba cambiandolo al evento "begin step".

Si eso no sirve deja el código donde estaba y cambia lo último por esto:
// Colisiones típicas
var c1=instance_place(x+hsp,y,obj_Solido);
if (c1){
    while(!place_meeting(x+sign(hsp),y,obj_Solido)) x+=sign(hsp);
    hsp = 0;
    with(c1) event_perform(ev_collision, other.object_index);
}
x += hsp;
var c2=instance_place(x,y+vsp,obj_Solido);
if (c2){
    while(!place_meeting(x,y+sign(vsp),obj_Solido)) y+=sign(vsp);
    vsp = 0;
    if (c2!=c1) with(c2) event_perform(ev_collision, other.object_index);
}
y += vsp;
Ahora los pinchos ya no le hacen nada cuando los toca desde arriba, los considera bloques, sin embargo el tacto horizontal y vertical hacia abajo lo destruyen como se puede apreciar en la imagen ¿entonces estaría programado para dañarlo solo cuando esta por abajo de el?.

 


Desconectado brunoxzx

Respuesta #22 en: Diciembre 16, 2017, 11:14:37 am
Lo que sucede Naitsabes0 es que las colisiones no se marcan porque nunca las hay. Tu código de movimiento hace que si te estas moviendo a cierta velocidad se detenga justo antes de colisionar, como si fuera un carro y frenara en seco a un centímetro de un niño que va por la calle. Entonces nunca lo atropella jeje. La solución que dí hace que se marque una colisión si el conductor ve a un niño y lleva la velocidad suficiente para aplastarlo y se supone que esto es lo que pasa con los pinchos nunca los tocas pero si llevas la velocidad suficiente dios te detiene justo antes y te marca colisión como si sí los hubieses tocado, porque el te procura y en realidad nunca mueres solo te hace pensar que lo haces transportándote al principio.

El problema es que dios se puso paranoico y para no cometer errores decidió que la fuerza de gravedad individual se detuviera si tuvieses la posibilidad de caer en un pincho (como si lo de antes no fuese suficiente) y añadio está linea al código universal de gravedad "if (vsp < 15 and !place_meeting(x,y+1,obj_Solido)) vsp += grav;", así es dios ama tanto a este individuo que ni siquiera le deja caer a más de 15 de velocidad. Total, ahora como siempre nosotros tenemos que pagar por sus errores y si queremos deshacernos de este mono morado tenemos que quitar esa parte que dice !place_meeting de tal modo que quede así "if (vsp < 15) vsp += grav;" o mejor usando la magia oculta de Soliman puede quedar así "vsp=min(15, vsp+grav)".

 


Desconectado Naitsabes0

Respuesta #23 en: Diciembre 16, 2017, 05:48:23 pm
Lo que sucede Naitsabes0 es que las colisiones no se marcan porque nunca las hay. Tu código de movimiento hace que si te estas moviendo a cierta velocidad se detenga justo antes de colisionar, como si fuera un carro y frenara en seco a un centímetro de un niño que va por la calle. Entonces nunca lo atropella jeje. La solución que dí hace que se marque una colisión si el conductor ve a un niño y lleva la velocidad suficiente para aplastarlo y se supone que esto es lo que pasa con los pinchos nunca los tocas pero si llevas la velocidad suficiente dios te detiene justo antes y te marca colisión como si sí los hubieses tocado, porque el te procura y en realidad nunca mueres solo te hace pensar que lo haces transportándote al principio.

El problema es que dios se puso paranoico y para no cometer errores decidió que la fuerza de gravedad individual se detuviera si tuvieses la posibilidad de caer en un pincho (como si lo de antes no fuese suficiente) y añadio está linea al código universal de gravedad "if (vsp < 15 and !place_meeting(x,y+1,obj_Solido)) vsp += grav;", así es dios ama tanto a este individuo que ni siquiera le deja caer a más de 15 de velocidad. Total, ahora como siempre nosotros tenemos que pagar por sus errores y si queremos deshacernos de este mono morado tenemos que quitar esa parte que dice !place_meeting de tal modo que quede así "if (vsp < 15) vsp += grav;" o mejor usando la magia oculta de Soliman puede quedar así "vsp=min(15, vsp+grav)".
Vaya este tema ha estado por 5 dias activo, pero croe que ha valido la pena.



Ahora es cuando la frase "¿donde esta tu dios ahora" tiene algo mas sentido, supongo que una fuerza mayor llamada código lo mantenía lejos del peligro, pues ya no mas.

 


Desconectado Naitsabes0

Respuesta #24 en: Diciembre 16, 2017, 11:13:24 pm
Lo que sucede Naitsabes0 es que las colisiones no se marcan porque nunca las hay. Tu código de movimiento hace que si te estas moviendo a cierta velocidad se detenga justo antes de colisionar, como si fuera un carro y frenara en seco a un centímetro de un niño que va por la calle. Entonces nunca lo atropella jeje. La solución que dí hace que se marque una colisión si el conductor ve a un niño y lleva la velocidad suficiente para aplastarlo y se supone que esto es lo que pasa con los pinchos nunca los tocas pero si llevas la velocidad suficiente dios te detiene justo antes y te marca colisión como si sí los hubieses tocado, porque el te procura y en realidad nunca mueres solo te hace pensar que lo haces transportándote al principio.

El problema es que dios se puso paranoico y para no cometer errores decidió que la fuerza de gravedad individual se detuviera si tuvieses la posibilidad de caer en un pincho (como si lo de antes no fuese suficiente) y añadio está linea al código universal de gravedad "if (vsp < 15 and !place_meeting(x,y+1,obj_Solido)) vsp += grav;", así es dios ama tanto a este individuo que ni siquiera le deja caer a más de 15 de velocidad. Total, ahora como siempre nosotros tenemos que pagar por sus errores y si queremos deshacernos de este mono morado tenemos que quitar esa parte que dice !place_meeting de tal modo que quede así "if (vsp < 15) vsp += grav;" o mejor usando la magia oculta de Soliman puede quedar así "vsp=min(15, vsp+grav)".
Me he dado cuenta de esto.


Resulta que los bloques de color amarillo funcionan como conector de los otros bloques verdes, al momento de colisionar con el amartillo este se destruye el junto con los bloques que estén en contacto, por otra parte, el bloque verde muestra que se están activando los 2 grupos de bloques, a pesar de que ambos grupos de bloques verdes no se están tocando, el bloque amartillo hace de conector, lo que debería suceder, porque este es de otro color, incluso este no parpadea antes de desaparecer.

Al parecer ese detalle era importante para que cada color sea su propio conector.

 


Desconectado brunoxzx

Respuesta #25 en: Diciembre 16, 2017, 11:32:20 pm
Upsi xP en el código del "event user 0" una parte dice esto "color==color" y eso es algo redundante, debería decir "color==ins.color".

¡Listo ahora sí se da por resuelto! (También puedes culpar a dios por esto y no a mi c:).
« última modificación: Diciembre 16, 2017, 11:42:43 pm por brunoxzx »

 


Desconectado Naitsabes0

Respuesta #26 en: Diciembre 17, 2017, 03:21:01 am
Upsi xP en el código del "event user 0" una parte dice esto "color==color" y eso es algo redundante, debería decir "color==ins.color".

¡Listo ahora sí se da por resuelto! (También puedes culpar a dios por esto y no a mi c:).
Ya que estamos con esa lógica, que dios te perdone, por otra parte convertí el amarillo en rojo, ya que es mas llamativo, ademas el amarillo es muy claro y no se nota tanto el parpadeo.

Imagínate cuantas cosas se puede hacer con esta mecánica que me ayudo a programar, por otro lado puse mi juego en itch.io https://naitsabes0.itch.io/red-heart-demo, se que se desvía del tema, pero es a la primera persona que le muestro mi actual proyecto demo fuera de la lista de juegos en desarrollo.