Octubre 17, 2012, 09:19:20 PM Ultima modificación: Octubre 24, 2012, 04:26:04 PM por Samigabacho
Hola a todos,
necesito iniciar en una room (la de juego) una variable que haga las funciones de reloj.
Con este variable pretendo ver cuantos segundos han pasado desde que comenzó el juego y dependiendo de el momento en el que esté, compararlo con diferentes valores de variables para que sucedan diferentes cosas.

He buscado en el foro y he visto algo así como un cronómetro que depende de los frames de la room, pero no soy capaz de adaptarlo a mi código.

Sabiendo que la room_speed es la cantodad de frames por segundo podés calcularlo fácil.
A una variable contador la iniciás en 0 en un create y con step le vas sumando uno, con la room_speed se puede sacar los segundos con un cálculo simple:
segundos=contador/room_speed
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


#2 Octubre 17, 2012, 10:15:29 PM Ultima modificación: Octubre 17, 2012, 10:22:26 PM por Samigabacho
Hola amigo Mgbu,
esto es lo que estoy haciendo pero me da error:

En el Create de un objeto_inicio:
var contadorFrame, s, d;
contadorFrame = 0;


En el Steep del mismo objeto:
contdorFrame =+1;

Y en un evento Draw:
//declaro la variable que será mi reloj interno
var relojInterno;
//s=segundos
s = contadorFrame/(room_speed);

if s < 0.01 {d = "0.00"}
if s!= 0{d = frac(s)}
s = floor(s)

if s < 10{s = "0"+string(s)}

relojInterno = string(s)+":"+string_char_at(string(d),3)+string_char_at(string(d),4)


draw_text(x+10,y-8,relojInterno) //Dibujamos relojInterno, que es la variable resultante del tiempo


pero me da el siguiente error
Citar___________________________________________
ERROR in
action number 4
of Draw Event
for object Info:

Error in code at line 4:
   s = contadorFrame/(room_speed);
       ^
at position 6: Unknown variable contadorFrame

#3 Octubre 17, 2012, 10:53:02 PM Ultima modificación: Octubre 17, 2012, 10:54:33 PM por Mgbu
Ese error dice que no existe una tal variable llamada "contadorFrame"
Me parece que pasa porque el evento Draw no está en el objeto_inicio. Porque las variables son locales a un objeto, es decir cuando tenés un objeto auto y un objeto moto, la variable velocidad será independiente entre los dos, entonces en el objeto que tiene el draw que me mostraste no existe una variable contadorFrame, porque esa variable pertenece a objeto_inicio
Eso se arregla escribiendo objeto_inicio.contadorFrame, al agregar objeto_inicio adelante le estás diciendo al juego que querés saber la variable de ese objeto

Yo siempre tengo un objeto_controlador que funciona durante todo el juego gracias a la opción "persistent", si no tenés uno la forma más fácil de hacer un contador es que tengas un objeto como ese, con el nombre que quieras. Entonces ponés el create, el Step, y el Draw en ese objeto
Te lo digo porque el obeto_inicio supongo que sólo está en la pantalla de inicio, pero cuando comience el juego el contador dejará de funcionar

También veo que es Step escribiste mal dos cosas: el combre de la variable y la operación, con =+1 estás haciendo que sea siempre 1, o sea contadorFrame es igual a 1 positivo (+1), ese signo más va adelante del igual, entonces sería "contadorFrame+=1;" "sumarle 1 a contadorFrame"

Y por último a ese evento Draw lo veo bien para ser dibujado, pero si no vas a mostrar los segundos en pantalla podés borrar todo lo que está en Draw, y dejando este código en step:
s = contadorFrame/(room_speed);
Eso guarda los segundos pasados en la variable s
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


Gracias por tu respuestas amigo Mgbu,

CitarEse error dice que no existe una tal variable llamada "contadorFrame"
Me parece que pasa porque el evento Draw no está en el objeto_inicio. Porque las variables son locales a un objeto, es decir cuando tenés un objeto auto y un objeto moto, la variable velocidad será independiente entre los dos, entonces en el objeto que tiene el draw que me mostraste no existe una variable contadorFrame, porque esa variable pertenece a objeto_inicio
Eso se arregla escribiendo objeto_inicio.contadorFrame, al agregar objeto_inicio adelante le estás diciendo al juego que querés saber la variable de ese objeto

En verdad los tres eventos están dentro del mismo objeto (que en verdad es un objeto llamado Info que está en la misma room donde se desarrolla el juego).

CitarTambién veo que es Step escribiste mal dos cosas: el combre de la variable y la operación, con =+1 estás haciendo que sea siempre 1, o sea contadorFrame es igual a 1 positivo (+1), ese signo más va adelante del igual, entonces sería "contadorFrame+=1;" "sumarle 1 a contadorFrame"
Corregido, muchas gracias!

CitarY por último a ese evento Draw lo veo bien para ser dibujado, pero si no vas a mostrar los segundos en pantalla podés borrar todo lo que está en Draw, y dejando este código en step:
Código: [Seleccionar]
s = contadorFrame/(room_speed);
Eso guarda los segundos pasados en la variable s
En verdad mi intención no es mostrarlo por pantalla, esto lo hago solamente para verificar que todo está haciendo lo que debe hacer y que mi variable se ejecuta y actualiza en tiempo real. Cuando esté lista ya no será mostrada en pantalla si no que la compararé con un if con el valor pasado por variable.
Gracias.

Sigue dando error?
Para ver la variable sin tener que hacer el draw podés correr el juego en "Debug mode" (flecha roja)
Después hacés click en Watch>Add y cuando te pide escribir ponés info.s o info.contadorFrame
Te tendría que estar mostrando el valor de esa variable en la tabla de la ventana
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


CitarSigue dando error?
Si, sigue dando error, el mimo error.

CitarPara ver la variable sin tener que hacer el draw podés correr el juego en "Debug mode" (flecha roja)
Después hacés click en Watch>Add y cuando te pide escribir ponés info.s o info.contadorFrame
Te tendría que estar mostrando el valor de esa variable en la tabla de la ventana

De todas maneras no debería dar error no?, eso quiere decir que algo no se está haciendo bien no?

Metiendo el Info.s o Info.contadorFrame aparece ERROR como value

Encontré el error! 8)

El problema es en la primera linea del create, borrala. No me había dado cuenta del error porque nunca uso la parabra "var", en Game Maker no hace falta declarar variables, simplemente asignales un valor
Yo también creía que era para declarar variables, pero las declara sólo para esa pieza de código y luego las borra, mira loq ue dice en el manual:
CitarA veces quieres variables que solo estén dentro del actual piece of code o de un script. De esta manera evitas perder memoria y estás seguro que no hay ningún conflicto con los nombres. Esto es también más rápido que usar variables globales. Para hacer esto debes declarar las variables en el comienzo del código, usando la palabra "var". Esta declaración se ve así:
var <nombrevariable1>,<nombrevariable2>,<nombrevariable3>, ...

Entonces borra eso y debería funcionar, el create quedaría simplemente así:
contadorFrame = 0;
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


#8 Octubre 18, 2012, 12:19:30 AM Ultima modificación: Octubre 18, 2012, 09:27:49 AM por Samigabacho
Amigo Mgbu eres la máquina!  :D
La verdad es que no tenía ni idea de eso, seguro que tengo que tener más de esos fallos a lo largo de mi código.
Aún no lo he probado porque ya estoy en el móvil cerca de irme a dormir, lo haré mañana. Muchas gracias!
EDITADO: No he podido evitar el modificarlo antes de irme a la cama.
Y... funciona! ya dibuja el cronometro en el juego.
Solo una cosa, cuando hago lo que me sugieres sobre info.s o info.contadorFrame el valor que muestra sigue siendo ERROR
EDITADO2: Siento contestarme de nuevo, pero ya se porqué daba ERROR info.s. Lo estaba mirando en una room distinta a donde está el objeto con mi variable