Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

* Sponsor

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 2
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!

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;
    }
}
return vPlatform;
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 ;)

3
Juegos en desarrollo / Re:Muestra tus Screenshots [¡Leer normas!]
« en: Mayo 05, 2016, 12:27:20 am »
Gracias kostra! He mejorado algunos fondos, todavía le faltan un par de cosillas pero ya casi está, ¿qué os parece? A la izquierda el viejo, a la derecha el nuevo:


king195, está mucho mejor ahora, me gustan mucho las tiles de los pueblos y el bosque.

4
Desarrollo de Scripts / Re:Dibujar sector circular
« en: Abril 12, 2016, 12:06:12 am »
Buen script, pero creo que es más sencillo hacerlo con un for:
Código: [Seleccionar]
//Hasta aquí igual
draw_vertex(xx, yy);
var i;
for (i=a1; i<=a2; i+= a3) draw_vertex(xx + lengthdir_x(r, i), yy + lengthdir_y(r, i));
if (argument6) draw_vertex(xx, yy);
//Desde aquí igual

5
Preguntas y respuestas / Re:Problemas de rendimiento.
« en: Marzo 29, 2016, 05:47:35 pm »
Cómo creas el sprite? Gestionar recursos es un proceso costoso y eso añadido a todo el código de dibujo de las superficies estará ayudando a bajar el rendimiento. Pon todo el código implicado y le echamos un vistazo, seguro q hay alguna forma de mejorar el rendimiento ;)

6
Juegos en desarrollo / Re:Muestra tus Screenshots [¡Leer normas!]
« en: Marzo 28, 2016, 11:39:24 pm »
@correojon: me gusta mucho la estética de este, el arte lo estas haciendo vos?. Espero poder ver mas de este pronto.

Saludos
Gracias! Sí, he hecho yo todo, aunque todavía faltan algunos detalles importantes, de hecho no estoy seguro de si usaré ese estilo al final...En movimiento queda mejor, tiene scroll parallax en horizontal y en vertical, aunque planificar cada plano del escenario para que encaje todo bien es un poco complicado.

Nos veremos a menudo por aquí ;)

7
Preguntas y respuestas / Re:Dibujar trayectoria parabolica
« en: Marzo 28, 2016, 11:30:48 am »
Las funciones LERP se usan para obtener una interpolación lineal, es decir: cuando sabes el valor de una función en dos puntos puedes obtener el valor en un tercer punto uniendo los puntos 1 y 2 con una recta y viendo dónde caería ese tercer punto. Además, no estás usando las fórmulas correctas del movimiento parábolico, estás usando funciones lineales (el término que multiplica a g debería ir al cuadrado) por lo que siempre te va a salir una recta.

Para lo que quieres hacer no es necesario interpolar, basta con hacer un bucle for calculando los valores del tiro parabólico en cada instante (evento Draw):

Código: [Seleccionar]
var t, drawX, drawY, v0;
vX0 = 5;//Velocidad horizontal inicial
vY0 = -10; //velocidad vertical inicial
for (t=0; t<100; t+=1){
 drawX = x + vX0*t;
 drawY = y + vY0*t + 0.5*gravity*t^2;
 draw_circle(drawX, drawY, 4);
}

Por cierto, mola mucho la estética del juego!

8
Preguntas y respuestas / Re:¿Realizar un menu de carga?
« en: Marzo 27, 2016, 10:56:50 pm »
Puedes hacerlo en cierto modo si cargas los recursos desde archivos fuera del juego. Para simular el progreso de carga, puedes dividir la carga en varios steps de manera que los recursos se vayan cargando en diferentes pasos. Por ejemplo puedes hacer algo así (esto iría en un evento draw):
Código: [Seleccionar]
switch (carga){

 case 0://Preparar carga
 draw_text(x, y, "Cargando recursos");//Puedes dibujar una barra de carga o lo que quieras
 carga = 1;
 break;

 case 1://Cargar sprites
 draw_text(x, y, "Cargando sprites");//Aquí podrías dibujar la barra más llena
 
 spritePresonaje1 = sprite_add(...);
 spritePersonaje2 = sprite_add(...);
 ...
 carga  = 2;
 break;

 case 2://Cargar fondos
 draw_text(x, y, "Cargando fondos");
 fondo1 = background_add(...);
 fondo2 = background_add(...);
 ...
 carga = 3;
 break;

 //Repetir para sonidos, música, archivos de texto, etc...

 case n://FIN, ir al nivel 1
 room_goto(nivel1);
 break;

}

No tienes control sobre la carga de cada recurso, pero de esta forma puedes simular una barra de carga. En un caso extremo, si en cada paso de carga cargas sólo un recurso (1 sprite, 1 fondo...) puedes hacer que los pasos sean más pequeños y hacer una carga más suave que vaya llenando la barra poco a poco, aunque el trabajo para hacer esto puede ser tremendo y no lo recomiendo, la verdad. Idealmente podrías calcular el tamaño total de tus recursos y aumentar la barra en función del tamaño de los recursos cargados.

Como he dicho creo que es mucho trabajo para algo que no merece la pena, es mejor emplear el tiempo en organizar mejor tus recursos y minimizar los tiempos de carga.

9
place_meeting() e instance_place() te dan información diferente:
  • place_meeting(): Devuelve true si hay colisión, false en caso contrario
  • instance_place(): Devuelve la id de la instancia con la que hay colisión, o noone si no hay colisión

De esta forma, el código:
Código: [Seleccionar]
if (place_meeting(x+hspeed,y+vspeed,obj_verde))es lo mismo que:
Código: [Seleccionar]
if (instance_place(x+hspeed,y+vspeed,obj_verde) != noone)
Si necesitas hacer algo con la instancia contra la que chocas, necesitarás usar instance_place(), por ejemplo:
Código: [Seleccionar]
var vId = instance_place(x+hspeed, y+vspeed, obj_verde);//Ahora podemos acceder al ladrillo con vId
if (vId != noone){
 ...
}

Espero que te sirva ;)

10
Juegos en desarrollo / Re:Muestra tus Screenshots [¡Leer normas!]
« en: Marzo 26, 2016, 11:26:05 pm »
^^Los iconos son geniales, pero el conjunto de la imagen queda un poco "vacía", sobre todo por la izquierda. Deberías intentar utilizar mejor el espacio de la pantalla o por lo menos añadir algún elemento decorativo o algo.

Una imagen de Kitsune World (título provisional), el juego estará basado en Super Mario World así que habrá mucho plataformeo y mucha exploración para encontrar salidas secretas. Además, también quiero intentar hacer jefes interesantes, que creo que es uno de los puntos en los que los Marios en 2D más flaquean.



Además, el juego incluirá un editor de niveles para que los jugadores creen y compartan sus propios niveles:


Espero que os guste!

11
Desarrollo de Scripts / Re: Lista de enteros sin repeticion
« en: Abril 17, 2011, 11:28:59 am »
Para este tipo de cosas creo que lo mejor es usar una cola de prioridad, meter los valores en orden y asignarles una prioridad aleatoria, así te ahorras anidar los dos bucles y el script será más rápido:

var priO, lstD, iN, maxN, maxV;
maxN = argument0;//Número de elementos
maxV = argument1;//Valor máximo
priO = ds_priority_create();
lstD = ds_list_create();

for (iN=0; iN<=maxV; iN+=1) ds_priority_add(priO, iN, random(maxV));//Añado los valores en orden pero con prioridad aleatoria
repeat (maxN) ds_list_add(lstD, ds_priority_delete_max(priO));//Voy cogiendo los valores finales según la prioridad

return lstD;

También podría hacerse con dos listas y la función ds_list_shuffle:
var lstO, lstD, iN, maxN, maxV;
maxN = argument0;//Número de elementos
maxV = argument1;//Valor máximo
lstO = ds_list_create();
lstD = ds_list_create();

for (iN=0; iN<=maxV; iN+=1) ds_list_add(lstO, iN);//Añado los valores en orden
ds_list_shuffle(lstO);//Desordeno la lista
for (iN=0; iN<maxN; iN+=1) ds_list_add(lstD, ds_list_find_value(lstO, iN));

return lstD;
Este caso será un pelín más lento que con las colas de prioridad pues necesitamos dos bucles for en lugar un for y un repeat.

12
Puedes poner una alarma en un objeto controlador y que cuando se active se eliminen varios trozos de suelo (en el ejemplo un máximo de 5):
Código: [Seleccionar]
alarm[0] = 300 + floor(random(300));//Volvemos a activar la alarma
var cnt;
cnt = 0;
with (objSuelo){
 if (random(1)<0.25){//Probabilidad de eliminar un trozo de suelo
  if (cnt < 4) cnt += 1;
  else exit;
  instance_destroy();
 }
}

13
Noticias / Re: Como hacer preguntas inteligentes
« en: Agosto 18, 2008, 04:27:26 pm »
Lo recomiendo para todo el mundo como ha dicho Kraken, no sólo para los nuevos. Gran aporte y además es bastante gracioso :)

14
Juegos completos / Re: CGM: The Game
« en: Diciembre 24, 2007, 02:22:34 am »
eh....?c?mo describirlo? En 3 palabras y un smilie: JA JA JAAAAA!!!! XD

Buen?simo, me he re?do much?simo y eso que s?lo duraba 5 minutos, no quiero ni pensar c?mo ser? la versi?n completa, espero con ansias al 25!

PD: una vez que lo completes podr?a echarte un mano para optimizarlo, yo tambi?n he notado que en algunas pantallas (sobre todo la primera) se ralentizaba bastante.

15
Juegos completos / Re: CGM: The Game
« en: Diciembre 13, 2007, 01:25:27 am »
Jeje, muy buena idea, me apunto. Me ofrezco para el papel de malo mal?simo...pero que sea muy, MUY malo, eh? XD

Para el sprite puedes poner un cuerpo cualquiera y mi avatar de cabeza, as? lo hizo FrogGer en su juego y qued? genial ;) Te paso el link al gm6, preguntale si te deja usar los sprites, tambi?n sal?a Fenris:
http://www.comunidadgm.org/index.php?page=64&accion=descargaD&download_id=1022

Páginas: 1 2

Warning: Parameter 1 to spoiler_buffer() expected to be a reference, value given in Unknown on line 0

Warning: Parameter 1 to custom_report_ob() expected to be a reference, value given in Unknown on line 0