Buenas, otra vez ando por aqui.
la pregunta es, en mitad de una partida, al crear una instancia nueva, como comprobar el espacio donde se va a posicionar si esta libre o no, y si no es asi, pues crear la instancia en otro lugar o posicion.
Echadme una mano!!!! ;)
En el evento create del objeto pon que si ocupa el lugar de otra instancia esta se destruya y cree una nueva. Te pongo un ejemplo de como sería crear un objeto de un gato que no pudiera ocupar el mismo lugar que el de un perro.
if(place_meeting(x, y, obj_perro)) {
instance_destroy();
instance_create( otra_posicion_x, otra_posicion_y, obj_gato);
}
Mejor, en vez de crear y destruir, puedes cambiar la posición de la instancia con la función "move_random", o usar éste código que viene en el manual de GM8:
[gml]
while (!place_free(x,y))
{
x = random(room_width);
y = random(room_height);
}
[/gml]
Si, también vale. Pero recuerda marcar todos los objetos que no quieras que estén en la misma posición como sólidos.
Creo que voy a utilizar una mezcla de los dos ejeplos. Jejejej.
Muchas gracias. ;D
Cita de: venus en Noviembre 08, 2014, 04:47:12 PM
Si, también vale. Pero recuerda marcar todos los objetos que no quieras que estén en la misma posición como sólidos.
Venus que quieres decir con esto?? No entiendo el porque??
Estoy utilizando game majer studio
Y no se como expresar esto para que gm studio me entienda.
Estoy utilizando esta funcion. Por favor, que alguien me la corrija, please. Bueno ahi va la funcion en una captura. Thank you.
Primero, sobre lo que dijo venus, es porque las funciones place_free y move_random evalúan la variable solid de las instancias, entonces si hay una instancia (u objeto) que no está marcado como sólido se puede crear otra instancia encima; una forma de evitar eso sería cambiar la función place_free por place_empty.
En tu código, el problema principal es que para entrar en el primer if no debe existir una instancia de objectMOTORISTA y por lo tanto las variables objectMOTORISTA.x y objectMOTORISTA.y no existen y no pueden usarse en el while. Para que funcione, el código debe dividirse en dos y usarse en dos objetos diferentes: el primer objeto debe revisar si no existe una instancia de objectMOTORISTA y crearla, en el evento create de objectMOTORISTA debe ir alguno de los códigos que te mencionamos anteriormente.
creo que el while not, no es admitido por GMstudio, ese es el raiz del problema, o me equivoco. ???
Una mano, please!! :-X
Cita de: nonoroman en Noviembre 10, 2014, 05:42:13 PM
Una mano, please!! :-X
he probado esto, pero no hay manera. Ni siquiera crea el objecto
if not(instance_exists(objectMOTORISTA))
{
randomize()
instance_create(choose(624, 784, 944, 1104), -20, objectMOTORISTA);
while (place_meeting(objectMOTORISTA.x, objectMOTORISTA.y, all))
{
randomize()
instance_create(choose(624, 784, 944, 1104), -20, objectMOTORISTA);
}
}
Te digo lo que veo:
-Creo que debería ser así: if (!instance_exists(objectMOTORISTA))
-Nunca he usado while, así que no te puedo ayudar en eso.
-Randomize() es una función ¿No? Porque no existe ese comando.
-No se si se puede poner all en place_meeting, pero nunca lo he probado.
-¿Quieres que te haga el código? Solo tienes que decirme en que coordenadas quieres que aparezca y listo. Es muy sencillo, creo que te estás complicando un poco la vida xD. Pero nos pasa a todos.
Cita de: venus en Noviembre 10, 2014, 07:29:32 PM
Te digo lo que veo:
-Creo que debería ser así: if (!instance_exists(objectMOTORISTA))
-Nunca he usado while, así que no te puedo ayudar en eso.
-Randomize() es una función ¿No? Porque no existe ese comando.
-No se si se puede poner all en place_meeting, pero nunca lo he probado.
-¿Quieres que te haga el código? Solo tienes que decirme en que coordenadas quieres que aparezca y listo. Es muy sencillo, creo que te estás complicando un poco la vida xD. Pero nos pasa a todos.
Si venus, echame una mano please.
las coordenadas concretas donde deberian de aparecer estan en el codigo que puse anteriormente en el choose.
La idea es comprobar si existe un objeto. Sino existe, entonces crearlo en unas coordenadas de x en concreto entre 4. Pero haciendolo de forma aleatoria, y cuando en aleatorio selecione el lugar x comprobar si esta ocupado, para asi, volver hacer el random de los 4 sitios posibles, hasta encontrar uno libre.
Please help me.
Esto colócalo en el evento create de objectMOTORISTA:
if(!place_free(x,y)) {
instance_destroy();
instance_create(choose(624, 784, 944, 1104), -20, objectMOTORISTA);
}
Te aviso que si y=-20, objectMOTORISTA va a aparecer fuera de la room.
Cita de: venus en Noviembre 11, 2014, 07:08:21 PM
Esto colócalo en el evento create de objectMOTORISTA:
if(!place_free(x,y)) {
instance_destroy();
instance_create(choose(624, 784, 944, 1104), -20, objectMOTORISTA);
}
Te aviso que si y=-20, objectMOTORISTA va a aparecer fuera de la room.
Muchas gracias venus.
Pero esto va a destruir el objecto con el que se encuentra, lo ideal seria no destruirlo, sino que buscara nuevamente otro lugar libre.
De todas formas muchas gracias.
En realidad da igual que se destruya, no influye en nada y va tan rápido que no se ve.
Además al estar en el ev. create gasta mucha menos capacidad.
Cita de: venus en Noviembre 11, 2014, 08:53:24 PM
En realidad da igual que se destruya, no influye en nada y va tan rápido que no se ve.
Además al estar en el ev. create gasta mucha menos capacidad.
No funciona venus, esta orden la ejecuto desde una alarm de un object controlador.
Que va controlando los pasos del juego, y en un cierto momento, crear el motorista, por ejemplo.
Con la funcion que me has pasado no se crea el motorista. no se porque.
El instance destroy() no destruira al motorista??
pufff, esto tiene que haber un metodo para hacerlo, no creo que sea imposible. ???
El código tiene que ir en el evento CREATE de objMOTORISTA.
El código que te he dado lo único que hace es que objMOTORISTA no se cree donde hay otro objeto. Ya está, nada más. El resto lo tienes que hacer tu.
El objeto controlador tiene que ser el encargado de crear al objMOTORISTA. Porque como he dicho antes el código va en el evento STEP de objMOTORISTA
Cita de: nonoroman en Noviembre 11, 2014, 08:42:29 PM
Muchas gracias venus.
Pero esto va a destruir el objecto con el que se encuentra, lo ideal seria no destruirlo, sino que buscara nuevamente otro lugar libre.
De todas formas muchas gracias.
Esta es la mejor manera, porque si quieres moverlo de sitio, que se puede, necesitas hacer un algoritmo que identifique los lugares en los que ha estado y ya había algo. Para luego seleccionar por eliminiación un lugar al que pueda moverse.
Es mas complicado y no merece la pena, ya que necesitas crear mas de 4 variables nuevas y un montón de comprobaciones que ralentizarán tu código. Prueba el código como te he dicho, es decir, en el evento correspondiente y todo irá bien.
Creo que el código es lo suficientemente sencillo como para intuir que no se coloca en el objeto controlador. Pero hay que leer detenidamente, porque luego no ves cosas como en que evento había que ponerlo.
PD: Siento escribir tantos mensajes, pero es que se me van ocurriendo casas nuevas constantemente :P
Cita de: venus en Noviembre 12, 2014, 08:50:47 PM
Creo que el código es lo suficientemente sencillo como para intuir que no se coloca en el objeto controlador. Pero hay que leer detenidamente, porque luego no ves cosas como en que evento había que ponerlo.
PD: Siento escribir tantos mensajes, pero es que se me van ocurriendo casas nuevas constantemente :P
Perdona venus por mi torpeza, voy a probar otra vez, a ver que tal.
Muchas gracias de verdad. ;)
Cita de: venus en Noviembre 12, 2014, 08:50:47 PM
Creo que el código es lo suficientemente sencillo como para intuir que no se coloca en el objeto controlador. Pero hay que leer detenidamente, porque luego no ves cosas como en que evento había que ponerlo.
PD: Siento escribir tantos mensajes, pero es que se me van ocurriendo casas nuevas constantemente :P
Hostia venus. Ya he dado con el problema. Resulta que tenia una condicion donde. Si el objecto salia de la pantalla por la parte de arriba. Es decir, y menor que 0. Entonces se destruira. Y yo creando el motorista en -20. Jajajaja. Menudo falll el mio. Y por eso no funcionaba tu codigo. Ya esta todo perfecto. Muchas gracias. Te debo una que vale por dos. Sigamos!!! ;D
Me alegro de que te haya servido, errores tontos los tenemos todos. Sino mira mis primeros mensajes en el foro XD