?Hola! La verdad es que no suelo pedir ayuda, pero este tema me est? llegando a desquiciar, pese a parecerme muy sencillo en principio.

La situaci?n es: En mi juego shooter/plataformas, he creado unas "vallas" verticales para formar zonas seguras: el personaje puede atravesarlas, pero no los enemigos ni los disparos (si quieres matarlos, tienes que entrar).

Los enemigos tienen un movimiento muy sencillo: un booleano dir que indica si se mueve a izquierda (0) o derecha (1) y una variable velocidad que marca el valor absoluto de la hspeed.
Adem?s, salta cada 100 frames.

Para el movimiento, tengo este c?digo en Step:
[gml]if dir = 0{//izquierda
sprite_index = sprite_izquierda
if place_free(x-velocidad,y) && !collision_point(x-velocidad,y+vspeed,Reja_vert,0,0){hspeed=-velocidad}
else{dir = 1}}

if dir = 1{//derecha
sprite_index = sprite_derecha
if place_free(x+velocidad,y) && !collision_point(x+sprite_width+velocidad,y+vspeed,objeto_valla,0,0){hspeed=velocidad}
else{dir = 0}}[/gml]
Es decir, seg?n la variable de direcci?n, comprueba colisi?n con objetos s?lidos y con la valla (que no es s?lida, claro), y si en ambos casos no hay colisi?n, asigna la hspeed correspondiente. Si hay alguna colisi?n, se cambia la variable dir (el enemigo se girar?a para ir al otro lado).

El problema es que este c?digo no me funciona siempre, ya que a veces los enemigos traspasan las vallas.
Lo que he probado ha sido cambiar el argumento de la y en collision_point, pero tanto y como y+vspeed fallan (en ocasiones distintas, no s? exactamente cu?ndo), y el enemigo puede pasar ocasionalmente.

La otra soluci?n que se me ocurri? para hacer las vallas fue algo as? como "solidez selectiva", pero no s? si es posible hacer que un objeto sea s?lido ?nicamente para otros objetos determinados (en este caso, para los enemigos y los disparos).

Si lo veis necesario, puedo subir una demo del problema, ya que no s? determinar bien en qu? momentos falla.

Muchas gracias, un saludo!

Es bien f?cil:
[gml]if dir = 0{//izquierda
sprite_index = sprite_izquierda
objeto_valla.solid = true
if place_free(x-velocidad,y){hspeed=-velocidad}
else{dir = 1}
objeto_valla.solid = false}

if dir = 1{//derecha
sprite_index = sprite_derecha
objeto_valla.solid = true
if place_free(x+velocidad,y){hspeed=velocidad}
else{dir = 0}
objeto_valla.solid = false}[/gml]

Eso deber?a servir.
Vim.

Cita de: Wadk en Febrero 07, 2011, 03:51:45 AM
Es bien f?cil:
...
Eso deber?a servir.

?S?! Parece que sirve, ?muchas gracias! ^^