Abril 28, 2016, 01:30:28 AM Ultima modificación: Abril 30, 2016, 03:37:40 AM por Mataca
Hola. Estoy hace un par de horas buscandole la vuelta con los current_ para hacer un sistema en el cual cada 20 minutos puedas clickear un objeto y te de un premio, pero me esta quemando la mente y no me sale jaja.
A alguno se le ocurre alguna forma de hacerlo?

yo una vez use un sprite con 10 frames, no habia animacion, ni era visible en el juego, para hacer justo lo mismo, puse que la imagen se cambiara tan lento, que tardaba 5min para que terminara los 10 frames, asi en create puse image_speed = 0.000001 (mas o menos, lo calculaba por los fps del juego) y luego y en la funcion Animation End le puse que creara el objeto de premio... obviamente tienes que tener un objeto que creara al que tiene el sprite de 10 frames XD que maraña... bueno hace mucho que no tocaba game maker, y esta solucion no es tan elegante, es que olvide todo de lo que aprendi antes XD

¿Y por qué no usar una alarma?
[gml]
alarm[0] = room_speed * 60 * 20;
[/gml]
alaberga regué el café.

BA:STFW&RTFM

El tema es que el usuario tiene que ver cuanto le falta para poder ganarlos. La idea es que cada 20 minutos genere 10 creditos que los reclamas al tocar el boton, y sino podes ver un video de adcolony por otros 10 creditos. La segunda ya la tengo, el tema es que para el que no tiene internet pueda cada 20 minutos generar 10 creditos. La primera lo que le falta es un conteo regresivo. Una vez lo vi en un juego ("SoccerStars"), en el cual vos cada 20 minutos podes ganar monedas y mientras tanto el cartel está en rojo y te dice cuanto tiempo falta. El otro problema es que si vos cerras el juego por ejemplo la alarma se detendría, y en el caso del objeto con image_speed lento el objeto tambíen volvería a 0. Ésto haría que tenga que darle créditos al iniciar el juego, pero esto también taldría problemas porque podrían cerrar y abrir el juego para ganar todos los créditos.
Me explico?

Podrías guardar en un archivo ini la hora en la que se inició contar. Si el juego no se ha cerrado, mantener el proceso e ir contando, pero si se cierra, cuando se vuelva a abrir se compruebe la hora actual y la hora almacenada en el ini, y si la diferencia es mayor a 20 minutos, pues haces lo que tengas que hacer
alaberga regué el café.

BA:STFW&RTFM

#5 Abril 28, 2016, 07:14:45 AM Ultima modificación: Abril 28, 2016, 07:49:40 AM por Mataca
Cita de: NiuWeb en Abril 28, 2016, 06:04:44 AM
Podrías guardar en un archivo ini la hora en la que se inició contar. Si el juego no se ha cerrado, mantener el proceso e ir contando, pero si se cierra, cuando se vuelva a abrir se compruebe la hora actual y la hora almacenada en el ini, y si la diferencia es mayor a 20 minutos, pues haces lo que tengas que hacer
Creo que es una excelente idea. El problema ahora es que estoy viendo como comprobar si pasaron 20 minutos. Con el current_minute no sirve porq si por ejemplo lo hiciste a las 14:44 no existe minuto mayor a 60. Lo mismo pasa con la hora, y con el día, y con el año.
Habrá algún metodo más corto como de "if time => time+20min {haga_algo}" ?



Edito:
Encontre un conteo regresivo muy bueno. Podría implementarle un guardado en el .ini si se cierra el juego en le medio del conteo, el problema es que si el juego lo cierran forzado seguramente no guarde nada y vuelva a contar los 20 minutos al abrir el juego de nuevo.
Es el siguiente:

Create:
// We're going to be keeping track of a timer in terms of game steps
// So, if the room_speed (aka steps per second) is 30, and we want a 10 minute 30 second timer,
// We want 10.5 minutes * 60 seconds/minute * 30 steps/second = 18,000 steps
var timer_length = 10.5 // 10 minutes, 30 seconds
timer = timer_length * 60 * room_speed


Step event:
if (timer > 0) {
    timer -= 1
}

if (timer == 0) {
    // Something happens!
}



Draw event:
/*
* Before we draw the timer on the screen, we have to convert it to minutes and seconds, and format the display string.
*/

// Seconds in a minute. Self-explanatory.
var seconds_per_minute = 60

// If your room speed is 30 steps per second, then there will be 1800 steps per minute
var steps_per_minute = room_speed * seconds_per_minute

// The number of minutes is equal to how many times steps_per_minute goes into timer evenly.
// For example, if timer is at 1850, and there are 1800 steps per minute, we would
// want to display "1" as the minute value. 1850/1800 = 1.0278. Flooring that will
// strip the fraction part and leave us with 1.
var minutes = floor(timer / steps_per_minute)
var minutes_text = string(minutes)

// Optional: If you want to display a timer like 00:00, you need to prepend a "0" character for single-digit values.
if (minutes < 10) {
    minutes_text = "0" + minutes_text
}

// Earlier we calculated how many times the steps_per_minute went into the timer, taking the whole number part.
// This time, we keep only fraction part, which is a value in minutes, and then convert it to seconds by multiplying by 60
// Finally, we round it down, since we only want whole number seconds, not fractions of a second
// Example:
// 1850 steps / 1800 steps per minute = 1.028 minutes
// frac(1.028 minutes) = 0.028 minutes
// 0.028 minutes * 60 minutes per second = 1.68 seconds, round it down to 1 second.
var seconds = floor(frac(timer / steps_per_minute) * seconds_per_minute)
var seconds_text = string(seconds)

// Again, format it for single-digit values
if (seconds < 10) {
    seconds_text = "0" + seconds_text
}

// Put the text together together - 29:59
var timer_text = minutes_text + ":" + seconds_text

// Draw wherever you want
draw_text(x, y, timer_text)


#6 Abril 30, 2016, 03:37:19 AM Ultima modificación: Abril 30, 2016, 04:38:02 AM por Mataca
Bueno hice un código relativamente corto en el cual hace lo que quiero.

if global.reward == 0{
difm = 0
difh = 0
if current_minute => global.m
{
difm = current_minute - global.m
}
if current_minute < global.m
{
difm = (current_minute+60)-global.m
difh = -1 // Esto es porque le estas agregando 1 hora arriba, y se la restas a la ecuacion final
}

if current_hour > global.h
{
difh = current_hour - global.h
}
if current_hour < global.h
{
difh = (current_hour+24) - global.h
}
difm = difh*60+difm

if difm => 20
{
global.reward = 1/// Crear objeto
}}

if global.reward == 1
{
/// crear objeto reward
}


nota:
global.m es el current_minute guardado anteriormente
global.h es el current_hour guardado anteriormente