Mostrar Mensajes

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

Mensajes - Jangse

46
Si pongo este código en el evento CREATE se crean 5 pelotas en posiciones aleatorias:

for (i = 1; i <= 5; i += 1)
{   
    instance_create(random(400),random(400),obj_pelota);
}


Pero si pongo este otro, solo se crea una. Osea, que las variables durante el ciclo FOR tienen el mismo valor:

a = random(400);
b = random(400);

for (i = 1; i <= 5; i += 1)
{   
    instance_create(a,b,obj_pelota);
}


¿Durante cada paso del ciclo no se debería actualizar la variable 'a' y 'b' con otro valor 'random'?
47
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.

48
Cita de: gortz en Febrero 28, 2014, 11:05:01 PM
Si quieres que aparezcan en cualquier lugar del cuarto sin saber sus dimensiones puedes usar room_width y room_height, tambien si tienes otros elementos en el cuarto como muros que tengan activado la propiedad Solid es posible que aparezcan encima asi que debes limitarlo con un if place_empty()

La cosa está que no sé que tres funciones aplicar para esto:

Cuando el enemigo es creado aleatoriamente en el evento CREATE CONTROLADOR, el enemigo se mueve en la cuadricula gracias a la función place_snapped en su evento propio STEP. Cuando ubicaba yo los enemigos en el editor de la room no tenia este problema. Ya que estaban bien puestos de forma manual.

Pero claro, al usar random, cada uno aparece donde le sale de las narices. Y claro, un enemigo se bloquea en un muro. El otro da vueltas sobre si mismo por estar fuera de la cuadricula (no funciona en ese caso el place_snapped), etc...

Tengo este problema:

1. Que los objetos cuando aparezcan lo hagan en 'zonas libres' y alineados con el grid.

Entonces se deberá usar una mezcla de estas funciones ¿No?:

-place_snapped
-place_free
-place_empty
49
Cita de: ocarina en Febrero 28, 2014, 06:55:24 PM
amigo lo que pasa es que pones el instance_create en el create del objeto enemigo o me equivoco??
si es asi cada vez q se cree un nuevo enemigo este también va a ejecutar el mismo codigo y asi susesivamente para cada objeto enemigo creado!!
puedes poner otro objeto no se obj_poner_enemigos y pones el repet y todo el resto

Tenias razón. Ahora va bien. A veces no se si me equivoco con el código o el orden donde lo pongo con los eventos/objetos.

Ponía en el Create del mismo enemigo el instance_create de si mismo.

He creado un objeto general para poner los CREATE de cada enemigo. Y luego, en cada enemigo los eventos para controlar sus comportamientos.

Gracias...
50
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?
51
Preguntas y respuestas / instance_create, una duda...
Febrero 28, 2014, 06:46:08 PM
Quizás a estas altura de la película es tonto preguntar esto. Pero estoy haciendo pruebas para colocar los enemigos de forma aleatoria cada vez que inicia el juego. Osea, en evento Create se crean los enemigos con un:

repeat (5)
{
    instance_create(irandom(x),irandom(y),enemigo);
}


Y luego, en el evento Step, había pensado poner lo movimientos del enemigo que persigue al personaje.

Cual a sido mi sorpresa que se ha inundado el juego con tropecientos enemigos ¿El repeat(5), no debería haber creado solo 5?

Cómo esto me ha sorprendido, he realizado esta prueba con el evento Create:

instance_create(100,100,enemigo);

Pero al iniciar el juego da error. Lo que quiero es colocar el enemigo por código. Osea, no pegandolo en el editor de room.

Pone que se crea un bucle infinito y tal... :(
52
Acabo de probar tú código pero no funciona, vampy. El personaje es transportado hacia la puerta, pero al moverse se paraliza. Pero los enemigos siguen su camino. De momento lo que ha funcionado es el código que he puesto subrayado mas arriba. Pero quiero entender bien este tema. De todas formas gracias por los aportes, eh...
53
Cita de: penumbra en Febrero 26, 2014, 08:56:08 PM

Por eso si usas alarmas en STEP deben de ir dentro de alguna condición, para que el STEP no las "arranque" paso a paso.

¿Pues por que no se me ejecuta si yo la tengo dentro de esta condición?:

if (instance_number(obj_Enemigo_A) == 0) and room == PLAYA
{
    obj_heroe.x = 1024; obj_heroe.y = 832;
    alarm[0] = 30 * 5;
}


Luego, en el evento Alarm 0, tengo puesto unas líneas de código. Pero jamás se me ejecutan...

Alarm 0:

sleep(3000);
sound_play(nuestrosonido);
instance_destroy();



CÓDIGO QUE FUNCIONA:

Este código realiza de forma aproximada lo que quiero hacer. Pero me gustaría testearlo con alarmas. Es la función que me paso Killer:

if (instance_number(obj_Enemigo_A) == 0) and room == PLAYA
{
    obj_heroe.x = 1024; obj_heroe.y = 832;
    screen_redraw(); // función de Killer
    sleep (3000);
    sound_play(snd_abre_reja);
    instance_destroy();
}
54
Cita de: Killer en Febrero 25, 2014, 11:21:50 PM
En serio, solo pon screen_redraw() antes del sleep en tu código original.

Eso a funcionado a la primera. Dude en hacerlo antes. Por que hace tiempo tenía un problema con otro código y me recomendaron no usar esta función nunca. Cosa que no entendí, pero bueno...

Mas o menos, decían, que esta función consumía muchos recursos por que debía dibujar la pantalla entera de nuevo. Y podía hacer lag en el juego.

55
Cita de: gortz en Febrero 26, 2014, 08:21:51 AM
tienes que espera a que el sonido se detenga para que despues destruir la puerta

if !sound_isplaying(snd_abre_reja) instance_destroy();

Quería hacer el código mediante alarmas. Y esa función que has puesto, la he mirado en manual pero no le pillo mucho como trabaja.

La duda es si siempre hay que poner un evento CREATE cuando se crea una alarma. Por que si hago una llamada desde un STEP a la alarma, esta no se ejecuta. Y desde un CREATE, sí.
56
Lamento ser tan pesado, pero de momento no me funciona con vuestros códigos.

Me explico:

OBJETO PUERTA

Evento ALARM 0

sound_play(snd_abre_reja);
instance_destroy();


Evento STEP

if (instance_number(obj_Enemigo_A) == 0) and room == PLAYA
{
    alarm[0] = 30*10;
}


He quitado la línea en STEP  obj_heroe.x = 1024; obj_heroe.y = 832; por que me pasaba algo raro. El personaje, cuando era transportado allí, se movía un solo pixel y ya ya no se podía mover mas.

Total, que parece que la alarma no me funciona. Ya que llego hasta allí, después de eliminar todos lo enemigos, pero pasados 10 segundos (30*10), la puerta sigue cerrada ¿Ahora que hago mal?

57
Cita de: penumbra en Febrero 24, 2014, 09:14:10 PM
Nunca he usado sleep, pero no creo que funcione como intentas. No hay manera de que el sleep sepa que quieres "detener" solamente la apertura de la puerta. el sleep detiene TODO el juego, o eso creo, no importa dese qué instancia lo llames.

Lo que debes hacer es mover al personaje primero, y luego hacer que la puerta se abra, cosa que sucede al revés. Por ejemplo, ya sé que es un bloque y que todo se ejecuta cuando la condición se cumple, pero siendo estrictos, ahí estás reproduciendo el sonido de la puerta antes de mover al jugador, y sería más lógico mover al jugador y hasta después abrir la puerta y reproducir el sonido. Ayudaría que pusieras el código con el que se abre la puerta y mencionaras exactamente en qué momento lo llamas.

No, si no hay mas código que ese. Un simple instance_destroy() de la puerta. De todas formas, según mi código, primero muevo el personaje. Porque esta primero que el instance_destroy().

Ahora lo he modificado a:

{
   
   
    obj_heroe.x = 1024; obj_heroe.y = 832;
    sound_play(snd_abre_reja);
    instance_destroy();
}


Pero pasa todo tan rápido que cuando llega el personaje y se reproduce el sonido, la puerta ya se ha destruido.

Todo el código está en el objeto puerta. Probé ponerlo en el objeto jugador, pero se bloqueaba. Se quedaba inmóvil nuestro personaje.
58
Cita de: Mgbu en Febrero 24, 2014, 08:46:40 PM
La fórmula que en realidad necesitarías es otra. Porque lo único que querés calcular es la aceleración (la fuerza no es necesaria)
Podés ver esta parte de Wikipedia, pero la cosa es que en la tierra todas las cosas caen a la misma velocidad (sin tener en cuenta el rozamiento) y si hacés los cálculos vas a ver que la aceleración de los objetos al nivel del mar en la tierra es de más o menos 9.8m/s2
Entonces en tu juego lo único que tenés que hacer es acelerar hacia abajo el personaje a 9.8m/s2. Para entender mejor que significa m/s2 podés pensar que por cada segundo, el personaje tiene que acelerar 9.8m/s, que es lo mismo que acelerar 35,3km/h en cada segundo. pero es más fácil medir la velocidad en m/s cuando hacés el juego:
Entonces cómo hacer eso en GM? Si usas la variable vspeed vas a tener que cambiar el valor en cada step. Si el personaje acelera 9.8m/s en un segundo ¿Cuánto acelera en cada step? Calculalo con 9.8/cantidaddestepsporsegundo y vas a obtener 0.3266m/s/step si la room_speed es 30
El problema ahora es que está la velocidad medida en metros/segundo, pero vspeed debe estar en píxeles/step. Entonces si dividimos 0.3266m/s/step/cantidaddestepsporsegundo con una room_speed de 30 tenemos 0,010888889m/step/step. Por último para pasar de metros a píxeles tenés que dividir 0,010888889m/step/step/pixelespormetro, píxeles por metro depende del tamaño de tu personaje, si tu personaje mide 2m y tiene un sprie de 32pixeles de altura, entonces pixelespormetro sería 16, quedando 0,00068055556pixeles/step/step
Entonces en el evento step tenemos que acelerar al personaje hacia abajo, lo podés hacer con vspeed+=0,00068055556

Espero que no haya hecho mal las cuentas  :P

No veas! Casi mejor poner gravity = 12 y tiro millas ¡Pero no! Cuando haga un plataformas lo pondré en practica. Me lo guardo hasta entonces. Gracias...
59
Bueno, supongo que no. Pero explicaré lo que me ocurre.

Cuando creamos una condición del tipo IF, el bloque que creamos entre corchetes se ejecuta de forma secuencial. Osea, una instrucción detrás de la otra. Pues con este código me va al revés:

if (instance_number(obj_Enemigo_A) == 0) and room == PLAYA
{
    //sound_play(snd_abre_reja);
   
    obj_heroe.x = 1024; obj_heroe.y = 832;
    sleep(5000);
    instance_destroy();
}


El código está en el objeto puerta. En su evento Step. Cuando en la room no quedan enemigos, una puerta que estaba cerrada se abre. El jugador es transportado al lado de esa puerta para que nos haga ver que se ha abierto.

Pero quiero que el jugador llegue a ese lugar, y aún veamos esa puerta cerrada. Creía que con el sleep resultaría así. Pero no.

Ocurre esto:

En el sitio que estamos, se produce la parada del sleep (5 segundos) y luego nos transporta al lado de la puerta. Pero ya está abierta. Cosa que no entiendo.

¿No debería transportarnos primero, luego la parada del sleep y después que se abra la puerta? Pregunto...
60
Gracial Elvis. Yo también lo miraré por que tampoco me aclaro...