-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathScenario.js
143 lines (123 loc) · 2.79 KB
/
Scenario.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
class Scenario {
/**
* create a Scenario
* @class
* @param {Object} [scenes=false] scenes.
* @example
var scenario = new Scenario({
0 : scene1,
0.4 : scene2,
0.7 : scene3
});
*/
constructor(scenes = {}) {
this.scenes = scenes;
this._startTime = 0;
this._nowTime = 0;
this._speed = 1;
this._isStart = false;
this._finishCount = 0;
}
/**
* Checks whether the scenario is finish.
* @return {Boolean} true : finish , false : not finish
*/
isFinish() {
return Object.keys(this.scenes).length <= this._finishCount
}
/**
* Add Scene in time
* @param {number} time - Play Time.
* @param {Scene} Scene - Scene.
* @return {Scenario} An instance.
* @example
var scenario = new Scenario();
scenario.addScene(0, scene1);
scenario.addScene(0.5, scene2);
scenario.addScene(1, scene3);
*/
addScene(time, scene) {
this.scenes[time] = scene;
return this;
}
tick(resolve, reject) {
if(!this._isStart)
return;
this._nowTime = Date.now();
const duration = (this._nowTime - this._startTime) / 1000 * this._speed
if(this.isFinish()) {
this.finish(resolve, reject)
return
}
this.setTime(duration, true);
const self = this;
requestAnimFrame(() => {
self.tick(resolve, reject);
});
return;
}
/**
* set Time in Scenario
* @param {number} time - Play Time.
* @param {Boolean} [isPlay=false] - Playing or Not Playing.
* @return {Scenario} An instance.
* @example
var scenario = new Scenario();
scenario.addScene(0, scene1);
scenario.addScene(0.5, scene2);
scenario.addScene(1, scene3);
*/
setTime(_time, isPlay = false) {
const self = this
const scenes = this.scenes
let distTime = 0
for(let time in scenes) {
distTime = _time - time;
if(distTime < 0)
continue;
if(!scenes[time].isFinish() && !scenes[time].isPlay()) {
scenes[time].play({time:distTime}).then(()=>{self._finishCount++})
if(!isPlay)
scenes[time].stop();
}
}
return this;
};
init() {
this._finishCount = 0;
const scenes = this.scenes
for(let time in scenes) {
scenes[time].stop();
scenes[time].setTime(0);
}
return this;
}
/**
* Play Scenario
* @return {Promise} Promise for playing state. <br/> if playing state is finish , call resolve.
*/
play() {
if(this._isStart)
return;
this.init();
this._isStart = true;
const self = this;
self._startTime = Date.now();
return new Promise(resolve => {
self.tick(resolve);
});
}
/**
* a Scenario is finish
* @param {Promise.resolve}[resolve=] if scenario is finish, call resolve function
* @return {Scenario} An instance.
*/
finish(resolve) {
this._isStart = false;
if(resolve)
resolve();
return this;
}
stop() {
}
}