このファイル: /home/web6047/www/cgi-bin/prj/20180728-javascript/callbackを使った例(合理anmからcallback)/canvas.html
1
<!DOCTYPE html>
2
<head>
3
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
4
<title>UntitledHomepage6047Canvas</title>
5
<script>
6
7
8
9
10
11
12
13
14
15
16
console.clear();
17
console.log( "=============== script ==============" );
18
function con() { console.log( Array.prototype.join.call( arguments, " " ) ); }
19
function $( id ) { return document.getElementById( id ); }
20
var HereDocument = /\/\*\s*([^]*?)\s*\*\//;
21
22
23
24
function onloadx() {
25
26
canvasEL = $( "canvasELID" );
27
canvas = canvasEL.getContext( '2d' );
28
screenW = canvas.canvas.width;
29
screenH = canvas.canvas.height;
30
31
32
33
34
elements = new Object();
35
elements.A = new Element( 50, 300, null, null, "red" );
36
elements.B = new Element( 500, 300, null, null, "green" );
37
elements.C = new Element( 250, 300, null, null, "blue" );
38
39
40
41
anms = new Array();
42
timerMS = 100;
43
timerID = setInterval( run, timerMS );
44
45
46
47
anm = new Anm( timerMS, 2000, function() { console.log( "callback" ) } );
48
49
50
51
52
53
54
f1 = function() {
55
var cnt = this.parent.cnt;
56
var cntmax = this.parent.cntmax;
57
58
var x = cnt / cntmax;
59
x -= .5;
60
61
var y = x * x * 1000;
62
63
return y;
64
}
65
66
67
f2 = function() {
68
var cnt = this.parent.cnt;
69
var cntmax = this.parent.cntmax;
70
71
var y = Math.sin( cnt ) * 20;
72
73
return y;
74
}
75
76
77
anm.add( elements.A, "x", elements.A.x, elements.C.x );
78
anm.add( elements.A, "y", elements.A.y, elements.C.y, f1 );
79
anm.add( elements.B, "x", elements.B.x, elements.C.x );
80
anm.add( elements.B, "y", elements.B.y, elements.C.y, f2 );
81
anm.reverse = true;
82
anms.push( anm );
83
84
85
86
anm = new Anm( timerMS, 3000 );
87
88
89
f3 = function() {
90
var cnt = this.parent.cnt;
91
var cntmax = this.parent.cntmax;
92
93
var val = 255 * ( cnt / cntmax );
94
95
return "RGB(" + val + "," + val + "," + val + ")";
96
}
97
98
anm.add( document.body.style, "backgroundColor", 0, 255, f3 );
99
anm.reverse = true;
100
anms.push( anm );
101
102
}
103
function run() {
104
var drawFLG = false;
105
106
107
for( var i = 0; i < anms.length; i++ ) {
108
var anm = anms[ i ];
109
110
111
if( anm.reverse ) {
112
if( anm.direction > 0 && anm.cnt > anm.cntmax ) {
113
anm.direction *= -1;
114
anm.cnt = anm.cntmax - 1;
115
} else if( anm.direction < 0 && anm.cnt < 0 ) {
116
anm.direction *= -1;
117
anm.cnt = 1;
118
}
119
} else if( anm.cnt > anm.cntmax ) {
120
121
122
123
anms.splice( i--, 1 );
124
anm.callback();
125
continue;
126
}
127
128
129
for( var j = 0; j < anm.motions.length; j++ ) {
130
131
var motion = anm.motions[ j ];
132
133
if( motion.isNum ) {
134
135
if( motion.f )
136
motion.element[ motion.member ] = motion.sx + motion.f() - motion.firstF;
137
else
138
motion.element[ motion.member ] = motion.sx + motion.length * ( anm.cnt / anm.cntmax );
139
140
} else
141
motion.element[ motion.member ] = motion.f();
142
143
}
144
145
anm.cnt += anm.direction;
146
drawFLG = true;
147
148
}
149
150
if( drawFLG ) draw( canvas );
151
}
152
function draw( cc ) {
153
cc.clearRect( 0, 0, screenW, screenH );
154
155
for( var name in elements ) {
156
var element = elements[ name ];
157
element.draw( cc );
158
}
159
}
160
161
162
163
164
function Anm( timerMS, ms, callback ) {
165
166
167
168
this.cnt = 0;
169
this.cntmax = Math.floor( ms / timerMS );
170
171
172
this.motions = new Array();
173
this.callback = callback ? callback : function() {};
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
this.repeat = false;
189
this.reverse = false;
190
this.direction = 1;
191
}
192
Anm.prototype.add = function( element, member, sx, ex, f ) {
193
194
var motion = {
195
element : element,
196
member : member,
197
sx : sx,
198
ex : ex,
199
length : ex - sx,
200
parent : this,
201
f : f,
202
firstF : 0,
203
isNum : element[ member ].match ? false : true,
204
};
205
206
207
if( f ) {
208
motion.firstF = motion.f();
209
}
210
211
this.motions.push( motion );
212
};
213
214
215
216
217
function Element( x, y, w, h, color ) {
218
this.x = x ? x : 0;
219
this.y = y ? y : 0;
220
this.w = w ? w : 24;
221
this.h = h ? h : 24;
222
this.color = color ? color : "black";
223
}
224
Element.prototype.draw = function( cc ) {
225
cc.fillStyle = this.color;
226
cc.fillRect( this.x, this.y, this.w, this.h );
227
cc.strokeStyle = "black";
228
cc.strokeRect( this.x, this.y, this.w, this.h );
229
};
230
231
232
</script>
233
<style>
234
</style>
235
</head>
236
237
<body onload="onloadx();" style="
238
background-color : lightgray;
239
">
240
<canvas id="canvasELID" width="512" height="448" style="
241
display : block;
242
margin : auto;
243
background-color : white;
244
border : solid 1px black;
245
">There is no canvas.</canvas>
246
</body>
247
</html>