-
Notifications
You must be signed in to change notification settings - Fork 0
/
crono.js
185 lines (171 loc) · 6.27 KB
/
crono.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*
- CRONO.JS -
Made by: Michael Primo
This Javascript framework allows you to have more control of the delays of the loops on your website, game, application, or animation.
*/
/*The main object with everything.
Callback: the function we put in the loop;
Delay: milliseconds of delay for every iteration of the loop;
Property: this will decide if the loop is finite, infinite or a check for an input;
isFirstLoop: select with true or false if you want to run the function before the loop or not;
isPause: decide if the loop start on pause or immediately.
*/
function Crono(callback, delay, property, isFirstLoop, isPause)
{
/*Initialize the rest of the variables. "timerId" store the id of setTimeout,
"start" the date milliseconds,
"remaining" can set the difference between the time before and after pressing pause and also change the delay time.
*/
let timerId, start, remaining = delay;
//this will run the callback function once if isFirstLoop is true.
this.initialSwitch = true;
//this will decide if the loop will restart or not..
this.restartSwitch = false;
//this is used for keep note of the actual loop when will be sended as a finite one.
let iCounter = 0;
//This is used for executing the loop or pausing it. False: not paused. True: paused.
if(isPause == undefined)
{
//isPause is false if this optional parameter.
isPause = false;
}
//Here is the code for pausing the loop.
this.pause = function()
{
isPause = !isPause;
//after unlocked the switch, create the pause for when the property is a loop.
if(typeof(property) === "number" && isPause == true)
{
//delete the loop
window.clearTimeout(timerId);
//set the delay time for when the loop will be resumed.
remaining -= new Date() - start;
}
if(typeof(property) === "number" && isPause == false)
{
//call the resume function.
this.resume();
}
//create then the pause for when the property is a input delay (passing a string instead of number).
else if(typeof(property) === "string" && isPause == true)
{
//register the time when the user paused the loop.
start = new Date();
}
else if(typeof(property) === "string" && isPause == false)
{
//get the difference in milliseconds between when the pause was pressed and when the loop is resumed.
remaining = Date.now() - start;
//let's make sure this[property] is a int (number).
this[property] = parseInt(this[property]);
//add the difference to the property value.
this[property] += remaining;
//call the checkDelay function.
checkDelay();
}
};
//This function is useful for executing infinite/finite loops.
let resume = function()
{
//we execute only one time the callback at the beginning if the isFirstLoop parameter is true and defined when this function is called.
if(isFirstLoop == true && this.initialSwitch == true)
{
//execute the function
callback();
//reset the switch to false, so we don't need to call again when we resume the loop.
this.initialSwitch = false;
}
//set the time where the function is called.
start = new Date();
//we use setTimeout on timerId for looping the callback and get an id from the loop.
timerId = window.setTimeout(function()
{
remaining = delay;
//if the user call the function with 0 as a property, then the loop will be endless unless the timeout is cleared/paused.
if(property == 0)
{
//we do recursion here
resume();
//and call the function of the user.
callback();
}
else
{
// this if is called the first time we call the resume() method and when we call the restart() method.
if(iCounter == undefined || this.restartSwitch == true)
{
//reset the counter and the restartSwitch.
iCounter = 0;
this.restartSwitch = false;
}
//it's like a for, but for executing delayed functions. This is used for finite loops when the property is a positive number > 0.
if(iCounter < property)
{
iCounter++;
resume();
callback();
}
}
//we use remaining instead delay, so if we pause the loop we don't reset the delay time.
}, remaining);
};
//this function is used for delay an input.
let checkDelay = function()
{
//for avoiding initialization problems, we call start as a var and set the time.
var start = new Date();
var start = start.getTime();
//this code works only if the loop is not paused.
if(isPause == false)
{
//we do the same thing as the resume() method, remember the difference between time paused and time when the loop is resumed
//for avoiding a delay time reset.
this.remaining = delay;
//give a value to the new property if it's undefined.
if(this[property] == undefined)
{
this[property] = 0;
}
//the user can do the action if start have a value bigger than the called property.
if(start >= this[property])
{
//if yes, the user can do the action he want and we set a new value for the property.
this[property] = parseInt(start + this.remaining);
return true;
}
else
{
//otherwise he need to wait when the time is like or more than the time setted on number of this[property].
return false;
}
}
}
//this is called from the user when he need to restart a finite loop.
this.restart = function()
{
//activate the switch, so we call the restart code inside resume.
this.restartSwitch = true;
//reset the counter and call the resume function.
iCounter = 0;
this.resume();
}
//we need to use these two properties for executing the code in other scripts.
this.checkDelay = checkDelay;
this.resume = resume;
//check only the input delay if property is a string.
if(typeof(property) === "string" && isPause == false)
{
this.checkDelay();
}
//resume if the property parameter is a number.
else if(typeof(property) === "number" && isPause == false)
{
this.resume();
}
//pause the function.
else if(isPause == true)
{
isPause = !isPause;
this.pause();
}
}