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
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
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
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
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;
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