Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Marcusmaniacus en Febrero 14, 2019, 07:11:52 PM

Título: Granja
Publicado por: Marcusmaniacus en Febrero 14, 2019, 07:11:52 PM
Tengo un pequeño problema  antes programaba  pero lo deje por motivos de trabajo  :-[
Ahora que e vuelto tengo el pequeño problema de que quiero hacer un pequeño juego de gestión pero no se como hacer que los personajes se priorizen es decir  Pongo 3 Arbustos  y quiero que vallan de forma consecutiva a cada uno pero no se como hacerlo   es decir que primero por uno y después por otro   no comprendo como hacer eso  me podrían ayudar :(
Título: Re:Granja
Publicado por: BssString en Febrero 14, 2019, 07:17:11 PM
Hola Marcusmaniacus

Intenta añadir los id a una ds_queue, así puedes encolar acciones, luego vas leyendo el id que sigue para ir al arbusto que sigue.
Para crear una queue usa:
queue = ds_queue_create()
Para meter info:
ds_queue_enqueue(queue,id_del_arbusto)
Para leer info:
prox_arbusto = ds_queue_dequeue(queue)

Saludos
Título: Re:Granja
Publicado por: Marcusmaniacus en Febrero 14, 2019, 07:29:12 PM
Perdon pero como le puedo añadir id a los arbustos  o como Obtendre la id de los arbustos :V  por que se que tienen una id  por si solos pero no comprendo muy bien como usarla
Título: Re:Granja
Publicado por: BssString en Febrero 14, 2019, 08:19:41 PM
Hola Marcusmaniacus.

Cada objeto de Game Maker que colocas en una room (ya sea de forma manual en el editor de rooms o mediante el instance create) tiene un ID único que identifica a ese objeto, se puede conocer si llamas a la variable "id".

Tu solución depende de cómo gestionas el clic del mouse, una forma sencilla es la siguiente:

En un objeto control, (supongamos que se llama oControl) creas la queue para que sea única:
queue = ds_queue_create() //Esto crea una cola y guarda la cola en la variable "queue" alojada en el objeto control
En ese mismo objeto, pero en el game_end, la destruyes para evitar que quede en cache.
ds_queue_destroy(queue)

Ahora la magia, cuando clickeas un objeto arbusto, mediante el evento del mouse button del arbusto, le añades su id a la queue.
ds_queue_enqueue(oControl.queue,id) //Aquí haces referencia a la queue alojada en el objeto oControl

Ahora hay que hacer que el player camine hacia el arbusto.
En el create event del player, le pones una variable que indica el objeto hacia el que está caminando:
target = noone //noone significa que no sigue a ningún objeto

Ahora la magia más mágica, cuando hay algún arbusto en la cola, haces que el player lo detecte en su Step event y camine hacia al arbusto que hayas clickeado. Puedes añadir la condición que desees, estas son las dos condiciones clave:
if !ds_queue_empty(oControl.queue) && target = noone  {
target = ds_queue_dequeue(oControl.queue) //Esto lee el arbusto que sigue en la cola
}
//El seguimiento puede ser cualquier código, aquí va el más sencillo que se me ocurrió:
if target != noone {
var spd = 8 //La velocidad que quieras
if point_distance(x,y,target.x,target.y) < spd { //Si llegaste al arbusto, ajusta tu posición a la posición del arbusto
x = target.x
y = target.y
target = noone
}
else { //Si aún no has llegado, te acerca un paso más
var dir = point_direction(x,y,target.x,target.y)
x += lengthdir_x(spd,dir)
y += lengthdir_y(spd,dir)
}

}


Con eso debería bastar, no he probado el código así que es posible que me haya equivocado en algún paso o el nombre de alguna variable

Saludos Cordiales