Tengo la duda si se debe emplear place_free(x,y)
para este asunto. Osea, se crea un determinado número de enemigos de forma aleatoria dentro de la room. Pero puede suceder que se superpongan encima de otros objetos y incluso encima de nuestro personaje.
Como estoy haciendo un laberinto, se daba el caso que pasaba eso. Y claro, el juego se bloqueaba. Para postre, tengo el place_snapped(x,y)
que aún me complica mas el asunto.
Yo tengo puesto el repeat(5)
para crearlos. Supongo que luego irá un IF que chequee las posiciones evitando solidos ¿No?
Subo este código para ver si alguien le puede echar un vistazo. La idea es crear enemigos (no tantos como en el archivo adjunto) y que no se pongan ni encima del muro (ladrillos naranjas) ni uno encima de otro (una pelotas verdes en el ejemplo).
Yo había creado primero un ciclo con FOR y la típica función de instance_create(x,y,objeto). Pero he probado casi de todo y no funciona. El código que pongo en el archivo lo he cogido de este foro. Pero tampoco funciona.
No me funciona ni el place_free ni el place_empty.
Me fue dificil.......
Crea un objeto para usarlo de parent
Llamalo, Coso
Ahora, todos los objetos donde no quieras que colisiones colocale ese objeto de parent (Jugador, muros, enemigos)
En el create event de el objeto creador
Citarfor (i = 1; i <= 5; i += 1)
{
instance_create (irandom(room_width),irandom(room_height),obj_enemigo);
}
En el create event de el objeto enemigo
Citarwhile place_meeting(x,y,Coso)
{x=random(room_width) y=random(room_height)}
Funciono, espero que igual a ti :D
[Gracias. Pero no es bien lo que quiero hacer. Ya que esto lo probe poniendo un evento colisión. Es decir, el enemigo al crearse aleatoriamente, si se crea encima del muro se destruye. Pero entonces no tenemos 5 enemigos. Tenemos 4. Y con tu codigo pasa algo parecido. A veces aparecen 5 y otras 4 enemigos.
Lo suyo, es que desde un comienzo, se chequeara si hay zonas libres y luego creara los enemigos. Ten en cuenta que luego en el evento STEP del enemigo lo fuerzo a que se mueva por una cuadricula de 32x32 con la funcion place_snapped(32,32). Ya se que es algo complicado. Pero si pongo los enemigos directamente en el editor de rooms no tiene gracia. Ya que cada vez que se inicia el juego aparecen en el mismo sitio.
Yo tengo este codigo en el evento CREATE del objeto controlador. Pero no funciona tampoco:
for (i = 1; i <= 5; i += 1)
{
{
if (place_free(irandom(room_height),irandom(room_width)))
{
instance_create (irandom(300),irandom(300),obj_pelota);
}
}
}
En esta captura se ve lo que ocurre. La pelota verde se crea encima del objeto muro (color naranja). Y tambien se crea una pelota encima de otra.
(http://thumbs.subefotos.com/204245588d49cc1dbc7ddc1827e18b7eo.jpg)
Quiero evitar esto. Que no se cree una pelota encima de otra y que tampoco encima del muro.
Saludos!
y si haces en un create event dentro de la bola
move_snape(a,b)
donde a y b es el tamaño de grid
ademas lo que yo hago es
for(i=0; i!=argument0;i+=1)
{
do
{
x=irandom(room_width);
y=irandom(room_height);
}
until(place_empty(x,y))
if place_empty(x,y)
{
instance_create(x,y,argument1);
}
}
Modifiqué el código y ya funciona. Se crean cinco objetos aleatorios sin tocar paredes ni a si mismos. Me faltó lo de colocarlos alineados a una rejilla, eso lo puedes completar
El problema era que estabas generando posiciones aleatorias desde el objeto controlador, pero la función place_free y similares necesitan máscaras de colisión para trabajar, y el objeto controlador no tenía sprite, así que la función no podía evaluar colisiones de manera correcta. También tenías el origen del objeto pelota en 0,0, en estos casos es mejor centrar el sprite.
Cita de: Jangse en Marzo 02, 2014, 08:31:46 PM
[Gracias. Pero no es bien lo que quiero hacer. Ya que esto lo probe poniendo un evento colisión. Es decir, el enemigo al crearse aleatoriamente, si se crea encima del muro se destruye. Pero entonces no tenemos 5 enemigos. Tenemos 4. Y con tu codigo pasa algo parecido. A veces aparecen 5 y otras 4 enemigos.
Lo suyo, es que desde un comienzo, se chequeara si hay zonas libres y luego creara los enemigos. Ten en cuenta que luego en el evento STEP del enemigo lo fuerzo a que se mueva por una cuadricula de 32x32 con la funcion place_snapped(32,32). Ya se que es algo complicado. Pero si pongo los enemigos directamente en el editor de rooms no tiene gracia. Ya que cada vez que se inicia el juego aparecen en el mismo sitio.
Yo tengo este codigo en el evento CREATE del objeto controlador. Pero no funciona tampoco:
for (i = 1; i <= 5; i += 1)
{
{
if (place_free(irandom(room_height),irandom(room_width)))
{
instance_create (irandom(300),irandom(300),obj_pelota);
}
}
}
En esta captura se ve lo que ocurre. La pelota verde se crea encima del objeto muro (color naranja). Y tambien se crea una pelota encima de otra.
(http://thumbs.subefotos.com/204245588d49cc1dbc7ddc1827e18b7eo.jpg)
Quiero evitar esto. Que no se cree una pelota encima de otra y que tampoco encima del muro.
Saludos!
Bueno, ya lo soluciono xDD, Este eres tu?
http://www.emudesc.com/threads/como-crear-objetos-aleatorios-en-posiciones-libres.555958/ (http://www.emudesc.com/threads/como-crear-objetos-aleatorios-en-posiciones-libres.555958/)
Por que no el mismo nick?
Cita de: penumbra en Marzo 02, 2014, 10:48:19 PM
Modifiqué el código y ya funciona. Se crean cinco objetos aleatorios sin tocar paredes ni a si mismos. Me faltó lo de colocarlos alineados a una rejilla, eso lo puedes completar
El problema era que estabas generando posiciones aleatorias desde el objeto controlador, pero la función place_free y similares necesitan máscaras de colisión para trabajar, y el objeto controlador no tenía sprite, así que la función no podía evaluar colisiones de manera correcta. También tenías el origen del objeto pelota en 0,0, en estos casos es mejor centrar el sprite.
Gracias penumbra. Hay que ver de cuantas formas se puede hacer una acción. Al final, lo puede solucionar gracias también a otro usuario que me ayudo. Es que no me gusta avanzar en el juego hasta que no resuelvo el código. He probado tu código y también va perfecto. Luego se trata de poner move_snap(32,32) en el evento Step de la pelota para darle movimiento. Me estudiare también tu código. Un saludo!
Cita de: TLT96
Bueno, ya lo soluciono xDD, Este eres tu?
http://www.emudesc.com/threads/como-crear-objetos-aleatorios-en-posiciones-libres.555958/ (http://www.emudesc.com/threads/como-crear-objetos-aleatorios-en-posiciones-libres.555958/)
Por que no el mismo nick?
Sí. Bueno, cuando me registro en un foro tampoco voy mirando que nick tengo en otros. Y ese código funciona a la perfección también. Es normal hacer la pregunta en varios foros. Por que como comento mas arriba, a veces pueden pasar que tarden dias en responder. O no lo hagan. Y claro, a mi no me gusta avanzar en el juego hasta que se resuelve el problema. Ahora me toca estudiar los códigos. Saludos...