Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - correojon

Páginas: 1
1
Preguntas y respuestas / Re:Problema con ataques según la distancia
« en: Marzo 20, 2020, 12:27:14 pm »
Primero, esta parte:
obj_bala.step:
if place_meeting(x,y,obj_enemigo){
    instance_destroy()
}
if distance_to_object(obj_enemigo) < obj_torre.rango_vision and object_exists(obj_enemigo){
    move_towards_point(obj_enemigo.x,obj_enemigo.y,5)
    }
object_exists(obj_enemigo) lo usamos para comprobar si existe alguna instancia del objeto obj_enemigo, por lo que es más aconsejable ponerlo antes de intentar hacer nada con obj_enemigo, como chequear la distancia o ver si estamos chocando con una instancia. Además, si chocas con un enemigo destruyes la bala, por lo que no haría falta seguir comprobando la distancia para moverse. Así que el código quedaría así:
if instance_exists(obj_enemigo){//Ojo, hay que usar instance_exists, no objec_exists. Mira las diferencias en el manual.
    if place_meeting(x,y,obj_enemigo) instance_destroy();
    else if distance_to_object(obj_enemigo) < obj_torre.rango_vision move_towards_point(obj_enemigo.x,obj_enemigo.y,5);
}

Respecto a que las balas sigan sólo al primer enemigo eso es porque estás usando obj_enemigo, que es el nombre genérico del objeto, en vez de usar el id de la instancia concreta que quieres seguir. Si no tienes clara la diferencia entre un objeto y una instancia te recomiendo que compruebes el manual porque esto es algo básico que te va a hacer falta para muchas cosas.
Volviendo a tu duda, lo que tenemos que hacer es identificar al enemigo concreto que ve la torre y decirle a  cada bala que siga a ese enemigo.
obj_torre.step:
if enemigo_detectado==noone{//Si NO hemos detectado a ningún enemigo
    var vEnemy = instance_nearest(x, y, obj_enemigo);//Me guardo la id del enemigo más cercano en una variable temporal
    if point_distance(x, y, vEnemy.x, vEnemy.y) < rango_vision{//Compruebo a ver si hay está dentro del rango
        enemigo_detectado = vEnemy;//Me guardo la id en la variable enemigo_detectado.
       tiempoDisparo = tiempoDisparoMax;//Y pongo la cuenta atrás para el tiempo de disparo
    }
}else{//Ya tenemos un enemigo_detectado
    if tiempoDisparo > 0 tiempoDisparo--;//Reduzco la cuenta atrás para disparar
    else{//Cuando la cuenta atrás se complete
        with (instance_create(x, y, obj_bala)) enemigo = enemigo_detectado;//Creo una bala y le paso la id del enemigo que había detectado
        enemigo_detectado = noone;//Marco que ya no tengo enemigo, así puedo volver a intentar detectar a otro enemigo, o al mismo si sigue dentro del rango
    }
}
He definido unas cuantas variables nuevas que tendrás que inicializar en el evento create:
enemigo_detectado = noone;//id del enemigo detectado o noone si no hemos detectado nada
tiempoDisparo = 0;//Variable para hacer la cuenta atrás del disparo
tiempoDisparoMax = 2;//Valor máximo de la cuenta atrás

Ahora, a obj_bala le tenemos que decir que use la id del enemigo que le hemos pasado. Modificamos el código que teníamos antes y donde usábamos obj_enemigo ponemos enemigo, que es la variable que hemos usado al crear la bala para guardar la id del enemigo más cercano:
obj_bala.step:
if instance_exists(enemigo){
    if place_meeting(x,y,enemigo) instance_destroy();
    else if distance_to_object(enemigo) < obj_torre.rango_vision move_towards_point(enemigo.x,enemigo.y,5);
}
En el evento create de obj_bala tienes que inicializar la variable enemigo = noone;

Con esto te debería funcionar, aunque te va  a pasar que por ejemplo si el enemigo se aleja mucho de la bala la bala se queda parada. Creo que deberías hacer que en este caso la bala siguiera recta y se destruyera al salir de la pantalla, o algo así.

Bueno de todas formas, creo que es importante que consultes el manual y que entiendas bien la diferencia entre objeto e instancia. Mira también las funciones que tienen versiones de objeto e instancia para entender bien para qué sirve cada una.
 
Ánimo!
Los siguientes usuarios dieron las gracias a este tema: Zhekken

2
A veces necesitas chequear si tu personaje está colisionando con una instancia de un objeto, pero si hay varias a la vez las funciones de colisión de GM devolverán una al azar, lo que puede no valernos para lo que queramos hacer. Por ejemplo: si nuestro personaje está encima de una plataforma que se mueve en horizontal y nos chocamos con otra que se mueve en vertical, al chequear las colisiones en código las funciones de GM (instance_place(), collision_point()...)nos devolverán una de las dos plataformas, pero no podremos acceder a la otra.

Con este código, podremos chequearlo sin problemas:
var vPlatform, vTempPlatform;

vPlatform = noone;
vTempPlatform = noone;

var iSS, vI, vExtraCheck;
for (iSS=0; iSS<instance_number(objSemisolidPlatform); iSS+=1){
    vI = instance_find(objSemisolidPlatform, iSS);
    vExtraCheck = false;
    if (vPlatform = noone) vExtraCheck = true;
    if (vExtraCheck){
        vTempPlatform = instance_place(x, y, vI);
        if (vTempPlatform != noone) vPlatform = vTempPlatform;
    }
}
Utilizando la función instance_find() y un bucle for podemos chequear todas las instancias del objeto indicado una a una. Podemos indicar el object_index de un objeto parent y todos sus hijos se chequearán también (muy útil para chequear colisiones con distintos tipos de plataformas, enemigos...).

En el ejemplo he utilizado instance_place(), pero puede utilizarse cualquier otra función de chequeo de colisiones.

Además, si tenemos instancias desactivadas (por ejemplo, plataformas fuera de la vista) la función instance_find() las descarta automáticamente, por lo que el código es bastante eficiente.

Espero que a alguien le sirva de ayuda ;)
Los siguientes usuarios dieron las gracias a este tema: Zapdos43

3
Juegos en desarrollo / Re: Reglamento y plantilla
« en: Noviembre 20, 2007, 10:14:48 am »
Cita de: Ejemplo de presentación

Chuflinautas

Plataformas

GM: Studio

Los chuflinautas son una raza que viaja por el espacio colonizando nuevos mundos. En una misión, algo sale mal y la nave de los protagonistas sufre un accidente, por lo que tienen que efectuar un aterrizaje de emergencia en un planeta desconocido. Los chuflinautas tendrán que explorar el planeta mientras buscan la forma de reparar la nave y continuar con su viaje.


http://www.chuflinautas.com/demo2.zip


El juego quedó perfecto!.

Los siguientes usuarios dieron las gracias a este tema: Kkunna

Páginas: 1