Octubre 31, 2015, 11:56:28 AM Ultima modificación: Noviembre 01, 2015, 04:20:08 PM por vzk91@gmail.com
Buenas,

Estoy siguiendo este tutorial para empezar a prototipar mi mapa con las fisicas básicas y demas. El problema que tengo es que algo estoy haciendo mal porque a la hora en la que mi player choca contra otro objeto (una casa o un arbol) en vez de chocar, desplaza al objeto. Ademas mi personaje se tuerce y ya no queda recto.

Este es mi objeto player (el Heroe):

Information about object: Obj_Hero
Sprite: Spr_Hero_Down
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent:
Mask:

Create Event:

execute code:

image_speed = 0.1;

Step Event:

execute code:

/// Depth Correction
depth = phy_position_y * -1;

execute code:

/// Handle Input Logic

if(keyboard_check(vk_left)){
    sprite_index = Spr_Hero_Left;
    phy_position_x -= 1;
}
if(keyboard_check(vk_right)){
    sprite_index = Spr_Hero_Right;
    phy_position_x += 1;
}
if(keyboard_check(vk_up)){
    sprite_index = Spr_Hero_Up;
    phy_position_y -= 1;
}
if(keyboard_check(vk_down)){
    sprite_index = Spr_Hero_Down;
    phy_position_y +=1;
}

Collision Event with object Obj_Tree_1:

execute code:

///Collide With

Collision Event with object Obj_Choza_1:

execute code:

///Collide With



Este es mi arbol:

Information about object: Obj_Tree_1
Sprite: Spr_Tree_1
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent:
Mask:

Create Event:

execute code:

depth = y * -1;



En la Room en la que estoy trabajando tengo habilitado el check Room is Physics World, con Gravity x e y a 0.

Que puede estar pasando ??

Adjunto una captura de la ejecucion para veais el problema.

LoL que risa ese bug jajaja, en fin, veo absurdo usar ese tipo de "colisiones avanzadas" puediendo usar un movimiento normal sin físicas ni nada, para ese tipo de juegos va perfectamente :/

pero si insistes, porqué no pones el código que le pusiste en vez de la info del objeto? xD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Cita de: kostra en Octubre 31, 2015, 12:11:35 PM
LoL que risa ese bug jajaja, en fin, veo absurdo usar ese tipo de "colisiones avanzadas" puediendo usar un movimiento normal sin físicas ni nada, para ese tipo de juegos va perfectamente :/

pero si insistes, porqué no pones el código que le pusiste en vez de la info del objeto? xD

Realmente lo hago asi porque es la unica forma que se jeje. Desde la info de los objetos ves todo los codigos que le puse.

Si conoces alguna guia/tutorial sobre el sistema que dices, te lo agradeceria... porque si es mas simple y va perfectamente me va a ayudar muchisimo.


Prueba en forzar que no se muevan los objectos en caso de colision.
Es decir. Si colisiona casa con heroe. Fuerza a casa a mover 0.

Parece un tonteria pero puede funcionarte.
PCNONOGames  www.pcnono.es

En las propiedades físicas de la casa marca la casilla kinematic, así ningún objeto podrá afectarle.

Para que el personaje no rote, primero establece una fricción angular alta, en el evento Create:
[gml]phy_angular_damping = 100;[/gml]
después, en el último evento previo a Draw, anula la velocidad angular y la inclinación:
[gml]
phy_angular_velocity = 0;
phy_rotation = 0;
[/gml]

Así debería funcionar, sin embargo este método está gastando recursos en exceso al estar simulando cosas innecesarias, sólo es recomendable si el escenario va a tener pocos objetos colisionables.

Cita de: Clamud en Octubre 31, 2015, 03:20:38 PM
En las propiedades físicas de la casa marca la casilla kinematic, así ningún objeto podrá afectarle.

Para que el personaje no rote, primero establece una fricción angular alta, en el evento Create:
[gml]phy_angular_damping = 100;[/gml]
después, en el último evento previo a Draw, anula la velocidad angular y la inclinación:
[gml]
phy_angular_velocity = 0;
phy_rotation = 0;
[/gml]

Así debería funcionar, sin embargo este método está gastando recursos en exceso al estar simulando cosas innecesarias, sólo es recomendable si el escenario va a tener pocos objetos colisionables.


Cual seria la forma correcta de hacerlo para no malgastar recursos ??? Porque ahora mismo mi escenario solo tiene una casa y un arbol para hacer las pruebas, pero obviamente va a tener muchos mas elementos con los que podra chocar el player....

#6 Octubre 31, 2015, 11:08:55 PM Ultima modificación: Octubre 31, 2015, 11:37:38 PM por penumbra
Cita de: vzk91@gmail.com en Octubre 31, 2015, 03:39:56 PM
Cual seria la forma correcta de hacerlo para no malgastar recursos ??? Porque ahora mismo mi escenario solo tiene una casa y un arbol para hacer las pruebas, pero obviamente va a tener muchos mas elementos con los que podra chocar el player....
Si el usuario va a tener control sobre el jugador en todo momento, entonces usar física en el jugador no me parece ventajoso y hasta te puede dar problemas a futuro en comparación con la forma "normal". Se puede usar física, no es que esté prohibido, pero no le veo mucho sentido, sin contar que la simulación de un entorno con física requiere más cálculos que un movimiento normal de objetos sin física. Y si tu juego va a ser grande, pues habrán más cálculos. No sé de algún proyecto RPG 2D que use física en el personaje principal, ya que el control se puede hacer de la manera tradicional. Me parece (opinión personal) que difícilmente se justifica usar física en el personaje principal, a menos que se quiera implementar un movimiento "raro" o "poco común" (en términos de lo que se ve comúnmente en un RPG clásico)

Generalmente se usa física en objetos inanimados que no son controlados por el jugador, como rocas que caen y rebotan, partículas/proyectiles que chocan contra otros objetos, objetos mecánicos como engranes, balancines, etc. Sé que GMS incluye un tutorial de fisica donde se controla una nave mediante funciones de física, pero es más que nada un proyecto para introducir las funciones y dar una idea de cómo usarlas, y porque la nave y los otros objetos tienen la peculiaridad de que en todo momento se ven afectados por la inercia, efecto que se consigue "naturalmente" al usar física pero que difícilmente se ve en personajes de RPGs (y que también puede conseguirse sin física, claro)

Las colisiones simples en personajes animados, como chocar contra paredes y árboles cuando se camina/corre, se pueden implementar de la manera tradicional, sin recurrir a física.

#7 Noviembre 01, 2015, 10:35:56 AM Ultima modificación: Noviembre 01, 2015, 10:37:30 AM por vzk91@gmail.com
Cita de: penumbra en Octubre 31, 2015, 11:08:55 PM
Cita de: vzk91@gmail.com en Octubre 31, 2015, 03:39:56 PM
Cual seria la forma correcta de hacerlo para no malgastar recursos ??? Porque ahora mismo mi escenario solo tiene una casa y un arbol para hacer las pruebas, pero obviamente va a tener muchos mas elementos con los que podra chocar el player....
Si el usuario va a tener control sobre el jugador en todo momento, entonces usar física en el jugador no me parece ventajoso y hasta te puede dar problemas a futuro en comparación con la forma "normal". Se puede usar física, no es que esté prohibido, pero no le veo mucho sentido, sin contar que la simulación de un entorno con física requiere más cálculos que un movimiento normal de objetos sin física. Y si tu juego va a ser grande, pues habrán más cálculos. No sé de algún proyecto RPG 2D que use física en el personaje principal, ya que el control se puede hacer de la manera tradicional. Me parece (opinión personal) que difícilmente se justifica usar física en el personaje principal, a menos que se quiera implementar un movimiento "raro" o "poco común" (en términos de lo que se ve comúnmente en un RPG clásico)

Generalmente se usa física en objetos inanimados que no son controlados por el jugador, como rocas que caen y rebotan, partículas/proyectiles que chocan contra otros objetos, objetos mecánicos como engranes, balancines, etc. Sé que GMS incluye un tutorial de fisica donde se controla una nave mediante funciones de física, pero es más que nada un proyecto para introducir las funciones y dar una idea de cómo usarlas, y porque la nave y los otros objetos tienen la peculiaridad de que en todo momento se ven afectados por la inercia, efecto que se consigue "naturalmente" al usar física pero que difícilmente se ve en personajes de RPGs (y que también puede conseguirse sin física, claro)

Las colisiones simples en personajes animados, como chocar contra paredes y árboles cuando se camina/corre, se pueden implementar de la manera tradicional, sin recurrir a física.

Gracias por la explicación.

Estoy probando ahora haciendo los objetos solidos y a la hora de mover el player compruebo con place_free si existe algo delante. Mucho mas sencillo la verdad. Entiendo que esta es la forma "normal" que me sugerias.

Solo tengo un problema con este metodo, y es que no consigo ni de coña que el player quede por detras del objeto cuando no colisiona con la mascara. Es sobre todo para hacer el efecto de que el player pasa por detras de una casa. Adjunto 2 imagenes, una con la mascara que he aplicado a mi choza y otra con el bug.

En la segunda foto veis como el personaje esta sobre el tejado y deberia estar por detras de la casa.



Y este es el codigo que tengo para mover a mi personaje ( el unico codigo que tengo despues de la limpia de las fisicas ):

if keyboard_check(vk_left) && place_free(x-2,y) {
    sprite_index = Spr_Hero_Left;
    x -= 2;
    image_speed = 0.1;
}
if keyboard_check(vk_right) && place_free(x+2,y) {
    sprite_index = Spr_Hero_Right;
    x += 2;
    image_speed = 0.1;
}
if keyboard_check(vk_up) && place_free(x,y-2) {
    sprite_index = Spr_Hero_Up;
     y -= 2;
     image_speed = 0.1;
}
if keyboard_check(vk_down) && place_free(x,y+2) {
    sprite_index = Spr_Hero_Down;
     y += 2;
     image_speed = 0.1;
}
if(keyboard_check(vk_nokey)){
    image_speed = 0;
    speed = 0;
}


Un saludo

en ese tipo de vista, tengo un truquito y es, en objetos estáticos en create, y en objetos que se mueven, como el player, en step:
depth = -y;

nada más, pero tienes que ver el origin de los objetos centrarlos por la zona mitad en la que representa que es la parte de alante y la parte de atrás, no sé explicarme xD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Cita de: kostra en Noviembre 01, 2015, 12:50:28 PM
en ese tipo de vista, tengo un truquito y es, en objetos estáticos en create, y en objetos que se mueven, como el player, en step:
depth = -y;

nada más, pero tienes que ver el origin de los objetos centrarlos por la zona mitad en la que representa que es la parte de alante y la parte de atrás, no sé explicarme xD

Buenisimo el truco, parece que ahora esta funcionando todo correctamente. Gracias !!

pues si está todo en orden, coloca [Solucionado] en el nombre del tema, editando el primer post :B
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]