Enero 11, 2013, 06:53:04 PM Ultima modificación: Enero 12, 2013, 12:14:15 AM por sitapome
Hola! Bajé el GM 8.1 hace como 2 días e hice el primer tutorial sin problemas (en ingles), pero ya para hacer el segundo tutorial tengo muchas dudas...

Puntualmente ahora, necesito saber cosas con respecto a la room:

1) por ejemplo, hay un "objeto1" que cuando toca al "objeto2", este último desaparece y vuelve a aparecer en una posición aleatoria pero a la misma altura del "objeto1", perfecto! El problema es que a veces esa posisión aleatoria al parecer queda fuera de los límites visuales de mi room, porque el "objeto2" desaparece u.u entonces básicamente quiero saber cómo se puede hacer para que la room tenga límites, por decirlo así.


eso sería! busqué en temas del foro si había algo que me ayudara pero no encontré nada, si es que existe, por favor háganmelo saber  :-[

por fa ayúdenme! quiero mucho saber como usar el GM!  8)

Buenas :)

Para que lo que describes no suceda, necesitas decirle al programa que necesitas que chequee si el objeto está fuera de los márgenes de la room, y de cumplirse esa condición el objeto debe ejecutar una acción que lo devuelva dentro de los márgenes de la room.

De seguro ya se te había ocurrido algo así, pero no sabías exactamente cómo programarlo. La estructura que andas buscando se llama "condicional" y lo puedes estructurar de la siguiente manera:



Si te fijas, tienes un elemento que checkea si la expresión escrita dentro es verdadera, y de serlo ejecuta los elementos que tiene debajo. Eso es el condicional.

Dentro del elemento condicional tienes una expresión. Una expresión es una afirmación, y va desde algo tan sencillo como "variable == 3" que se traduce como "variable es igual a 3", hasta afirmaciones más complejas como "((variable1 == false) and (variable2 < 40)) or ((variable1 == true) and (variable2 > 24))" que se traduce como "variable1 es falso y variable2 es menor a 40, o variable1 es verdadero y variable2 es mayor que 24". ¿Complicado? Un poco, pero ya se va a volver un poco más sencillo.



La expresión dentro del condicional es
((x > 0) && (x < room_width) && (y > 0) && (y < room_height))
que significa "la posición horizontal del objeto es mayor que 0 y es menor que el ancho de la habitación, y la posición vertical del objeto es mayor que 0 y es menor que es alto de la habitación". Ten en cuenta que las variablex x e y corresponden a la posición horizontal y vertical del objeto.

Si esa expresión es falsa, es decir, si no se cumple la afirmación (si te fijas, tiene el cuadrito de NOT seleccionado, lo que significa que chequea que la expresión sea falsa, no verdadera) el código de abajo se ejecuta, que probablemente es el código que ya estás ejecutando actualmente para que el objeto cambie de posición a otra posición al azar.



Para ejecutar el cambio de posición en el objeto programamos una seguidilla de acciones que sucede al presionar la barra espaciadora, en que una instancia nueva del objeto se crea y la instancia actual es eliminada.

Ahora, si te fijas éste método tiene un problema, y es que se ejecuta en el evento Step, es decir, está constantemente ejecutándose. Un condicional sólo se ejecuta una vez, por lo tanto, si el evento fuese una condición en sí misma como una colisión con otro objeto, o presionar una tecla, y en la primera ocasión el objeto quedase fuera de la room, se ejecutase el código y el objeto volviese a quedar fuera de la room, el objeto no volvería a la vista de la room, porque el código sólo se ejecuta una vez por llamada.

Existe otro tipo de estructura que se llaman ciclos, que efectivamente se ejecutan en múltiples ocasiones hasta que la condición de término se cumpla, pero lamentablemente no hay forma de estructurar un ciclo con Drag and Drop, así que te voy a mostrar cómo hacer un ciclo do en código :D



Si te fijas, éste objeto funciona exactamente igual al anterior, sólo que en vez de ejecutar el código en un evento Step, es decir, continuamente, lo ejecuta en el evento Create, que sólo se ejecuta al momento de crearse una instancia de éste objeto. En el evento Create ponemos un elemento de ejecución de código, y dentro de éste ponemos:



Éste es el código:

while  (((x > 0) && (x < room_width) && (y > 0) && (y < room_height)) == false)
{
x = random((room_width div 16) - 1)*16;
y = random((room_height div 16) - 1)*16;
}                                         


Básicamente la estructura de un ciclo while es

while (condición)
{
código
}

donde código se ejecuta mientras la expresión condición sea verdadero. En éste caso, mientras la expresión "(((x > 0) && (x < room_width) && (y > 0) && (y < room_height)) == false)" sea verdadera, o lo que es lo mismo, que la expresión "((x > 0) && (x < room_width) && (y > 0) && (y < room_height))" sea falsa.

Ten en cuenta que la función random(número) devuelve un valor al azar entre 0 y número, y que la expresión "x = random((room_width div 16) - 1)*16" lo que hace es dividir el ancho de la habitación entre 16 sin considerar el resto de la división (es decir, siempre devuelve un número entero) y restarle 1, luego devuelve un valor al azar entre 0 y ése resultado lo multiplica por 16, y se lo asigna a la posición horizontal del objeto, teniendo el mismo resultado que eso de snap hor y snap ver en la función "Jump to Random". Lo mismo se aplica a la expresión "y = random((room_height div 16) - 1)*16" pero para la posición vertical :)

Una última cosa, si no entendiste ni pio, te dejo un editable para Game Maker 7 (que creo que sí puede abrirse en Game Maker 8.1) con todo lo que te explico acá :) ¡Ojalá te sea útil!

Cita de: calio en Enero 12, 2013, 12:48:47 AM
Buenas :)

Para que lo que describes no suceda, necesitas decirle al programa que necesitas que chequee si el objeto está fuera de los márgenes de la room, y de cumplirse esa condición el objeto debe ejecutar una acción que lo devuelva dentro de los márgenes de la room.

De seguro ya se te había ocurrido algo así, pero no sabías exactamente cómo programarlo. La estructura que andas buscando se llama "condicional" y lo puedes estructurar de la siguiente manera:



Si te fijas, tienes un elemento que checkea si la expresión escrita dentro es verdadera, y de serlo ejecuta los elementos que tiene debajo. Eso es el condicional.

Dentro del elemento condicional tienes una expresión. Una expresión es una afirmación, y va desde algo tan sencillo como "variable == 3" que se traduce como "variable es igual a 3", hasta afirmaciones más complejas como "((variable1 == false) and (variable2 < 40)) or ((variable1 == true) and (variable2 > 24))" que se traduce como "variable1 es falso y variable2 es menor a 40, o variable1 es verdadero y variable2 es mayor que 24". ¿Complicado? Un poco, pero ya se va a volver un poco más sencillo.



La expresión dentro del condicional es
((x > 0) && (x < room_width) && (y > 0) && (y < room_height))
que significa "la posición horizontal del objeto es mayor que 0 y es menor que el ancho de la habitación, y la posición vertical del objeto es mayor que 0 y es menor que es alto de la habitación". Ten en cuenta que las variablex x e y corresponden a la posición horizontal y vertical del objeto.

Si esa expresión es falsa, es decir, si no se cumple la afirmación (si te fijas, tiene el cuadrito de NOT seleccionado, lo que significa que chequea que la expresión sea falsa, no verdadera) el código de abajo se ejecuta, que probablemente es el código que ya estás ejecutando actualmente para que el objeto cambie de posición a otra posición al azar.



Para ejecutar el cambio de posición en el objeto programamos una seguidilla de acciones que sucede al presionar la barra espaciadora, en que una instancia nueva del objeto se crea y la instancia actual es eliminada.

Ahora, si te fijas éste método tiene un problema, y es que se ejecuta en el evento Step, es decir, está constantemente ejecutándose. Un condicional sólo se ejecuta una vez, por lo tanto, si el evento fuese una condición en sí misma como una colisión con otro objeto, o presionar una tecla, y en la primera ocasión el objeto quedase fuera de la room, se ejecutase el código y el objeto volviese a quedar fuera de la room, el objeto no volvería a la vista de la room, porque el código sólo se ejecuta una vez por llamada.

Existe otro tipo de estructura que se llaman ciclos, que efectivamente se ejecutan en múltiples ocasiones hasta que la condición de término se cumpla, pero lamentablemente no hay forma de estructurar un ciclo con Drag and Drop, así que te voy a mostrar cómo hacer un ciclo do en código :D



Si te fijas, éste objeto funciona exactamente igual al anterior, sólo que en vez de ejecutar el código en un evento Step, es decir, continuamente, lo ejecuta en el evento Create, que sólo se ejecuta al momento de crearse una instancia de éste objeto. En el evento Create ponemos un elemento de ejecución de código, y dentro de éste ponemos:



Éste es el código:

while  (((x > 0) && (x < room_width) && (y > 0) && (y < room_height)) == false)
{
x = random((room_width div 16) - 1)*16;
y = random((room_height div 16) - 1)*16;
}                                         


Básicamente la estructura de un ciclo while es

while (condición)
{
código
}

donde código se ejecuta mientras la expresión condición sea verdadero. En éste caso, mientras la expresión "(((x > 0) && (x < room_width) && (y > 0) && (y < room_height)) == false)" sea verdadera, o lo que es lo mismo, que la expresión "((x > 0) && (x < room_width) && (y > 0) && (y < room_height))" sea falsa.

Ten en cuenta que la función random(número) devuelve un valor al azar entre 0 y número, y que la expresión "x = random((room_width div 16) - 1)*16" lo que hace es dividir el ancho de la habitación entre 16 sin considerar el resto de la división (es decir, siempre devuelve un número entero) y restarle 1, luego devuelve un valor al azar entre 0 y ése resultado lo multiplica por 16, y se lo asigna a la posición horizontal del objeto, teniendo el mismo resultado que eso de snap hor y snap ver en la función "Jump to Random". Lo mismo se aplica a la expresión "y = random((room_height div 16) - 1)*16" pero para la posición vertical :)

Una última cosa, si no entendiste ni pio, te dejo un editable para Game Maker 7 (que creo que sí puede abrirse en Game Maker 8.1) con todo lo que te explico acá :) ¡Ojalá te sea útil!
probablemente seria mejor si le pusieras en scripts ya que como es mas facil de seguro entenderia mejor
pd:yo empecé con scripts no con d&d
CREADOR DE JUEGOS GM.


- Como hacer preguntas inteligentes
- Reglamento General

HOLA COMUNIDAD,HOLA A TODOS




uso game maker 8 pro 8) y game maker studio Master Collection