このファイル: /home/web6047/www/cgi-bin/prj/20180112-SideViewCharacter Program/class_SVC.js
1
console.log( "class_SVC.js loading.." );
2
3
function SVCM( title ) {
4
this.title = title;
5
this.svcs = new Object();
6
this.mainSvc = null;
7
this.poses = new Object();
8
this.actions = new Object();
9
this.zIndex = new Array();
10
}
11
12
SVCM.prototype.addPose = function( posename, svcname, membname, value ) {
13
14
if( ! this.poses[ posename ] )
15
this.poses[ posename ] = new Array();
16
17
this.poses[ posename ].push( [ this.svcs[ svcname ], membname, value ] );
18
};
19
20
SVCM.prototype.addAction = function( actionName, poseName, limitMS ) {
21
22
if( ! this.actions[ actionName ] )
23
this.actions[ actionName ] = new Array();
24
25
this.actions[ actionName ].push( [ poseName, limitMS ] );
26
};
27
28
SVCM.prototype.doPose = function( poseName ) {
29
var pose = this.poses[ poseName ];
30
for( var i = 0; i < pose.length; i++ ) {
31
var svc = pose[ i ][ 0 ];
32
var member = pose[ i ][ 1 ];
33
var value = pose[ i ][ 2 ];
34
35
if( typeof value == "object" ) continue;
36
svc[ member ] = value;
37
}
38
};
39
40
SVCM.prototype.doAnm = function( poseName, limitMS, anmGroup ) {
41
42
var pose = this.poses[ poseName ];
43
for( var j = 0; j < pose.length; j++ ) {
44
var svc = pose[ j ][ 0 ];
45
var member = pose[ j ][ 1 ];
46
var unknown = pose[ j ][ 2 ];
47
var sx = svc[ member ];
48
49
if( typeof unknown == "object" ) {
50
var calcInfo = unknown;
51
var len = calcInfo.len;
52
var f = calcInfo.f;
53
var fsx = calcInfo.fsx;
54
var fex = calcInfo.fex;
55
var yZoom = calcInfo.yZoom;
56
var ex = sx + len;
57
anmGroup.appendAnm( svc, member, sx, ex, limitMS, f, fsx, fex, yZoom );
58
} else {
59
var ex = unknown;
60
anmGroup.appendAnm( svc, member, sx, ex, limitMS );
61
}
62
}
63
};
64
65
SVCM.prototype.doAction = function( actionName, anmGroup ) {
66
67
68
anmGroup.svcm = this;
69
anmGroup.action = this.actions[ actionName ];
70
anmGroup.seek = -1;
71
anmGroup.callbackTarget = this;
72
this.callback = function( anmGroup ) {
73
74
anmGroup.seek ++;
75
76
if( anmGroup.seek == anmGroup.action.length ) {
77
return false;
78
}
79
80
anmGroup.anmArray = new Array();
81
var item = anmGroup.action[ anmGroup.seek ];
82
var poseName = item[ 0 ];
83
var limitMS = item[ 1 ];
84
anmGroup.svcm.doAnm( poseName, limitMS, anmGroup );
85
return true;
86
};
87
88
anmGroup.callbackTarget.callback( anmGroup );
89
};
90
91
SVCM.prototype.drawByTree = function( canvas, svc ) {
92
93
if( svc == null ) svc = this.mainSvc;
94
95
this.mainSvc.draw( canvas, svc );
96
for( var i = 0; i < svc.children.length; i++ ) {
97
var childSvc = svc.children[ i ];
98
this.drawByTree( canvas, childSvc );
99
}
100
};
101
102
SVCM.prototype.drawByZIndex = function( canvas ) {
103
for( var i = 0; i < this.zIndex.length; i++ ) {
104
var childSvc = this.zIndex[ i ];
105
this.mainSvc.draw( canvas, childSvc );
106
}
107
};
108
109
110
111
function SVC( title ) {
112
113
114
115
116
if( ! title ) title = "名称未設定";
117
118
this.title = title;
119
this.varname = "noname";
120
this.x = 0;
121
this.y = 0;
122
this.imageOffsetX = 0;
123
this.imageOffsetY = 0;
124
this.theta = 0;
125
this.thetaMin = 0;
126
this.thetaMax = Math.floor( Math.PI * 2 * 1000 ) / 1000;
127
this.pictImage = null;
128
this.pathImage = null;
129
this.children = new Array();
130
131
this.childrenX = 0;
132
this.childrenY = 0;
133
this.usefulX = 0;
134
this.usefulY = 0;
135
136
this.visibility = true;
137
}
138
139
SVC.prototype.draw = function( canvas, target ) {
140
141
142
143
144
145
146
147
var drewFLG = false;
148
149
canvas.save();
150
151
canvas.translate( this.x, this.y );
152
canvas.rotate( this.theta );
153
if( this == target && this.visibility ) {
154
var drawX = this.imageOffsetX;
155
var drawY = this.imageOffsetY;
156
157
if( this.pictImage ) {
158
canvas.drawImage( this.pictImage, drawX, drawY );
159
}
160
161
if( this.pathImage ) {
162
canvas.save();
163
canvas.translate( drawX, drawY );
164
with( canvas ) {
165
eval( this.pathImage );
166
}
167
canvas.restore();
168
}
169
170
if( 1 ) {
171
172
canvas.beginPath();
173
canvas.arc(0, 0, 4, -3.14 / 4, 3.14 / 4 * 7, false);
174
canvas.lineTo(16, -16);
175
canvas.lineTo(64, -16);
176
canvas.stroke();
177
canvas.fillStyle = "blue";
178
canvas.font = "24px 'MS ゴシック'";
179
canvas.fillText(target.title, 16, -19);
180
}
181
drewFLG = true;
182
} else {
183
canvas.save();
184
canvas.translate( this.childrenX, -this.childrenY );
185
186
for( var i = 0; i < this.children.length; i++ ) {
187
var child = this.children[ i ];
188
drewFLG = child.draw( canvas, target );
189
if( drewFLG ) break;
190
}
191
canvas.restore();
192
}
193
194
canvas.restore();
195
return drewFLG;
196
};
197
198
SVC.prototype.measure = function( target, parentTheta, parentX, parentY ) {
199
200
201
202
if( parentTheta == null ) {
203
parentTheta = 0;
204
parentX = 0;
205
parentY = 0;
206
}
207
var res = kaiten( this.x, this.y, parentTheta );
208
var globalX = parentX + res.x;
209
var globalY = parentY + res.y;
210
var globalTheta = parentTheta + this.theta;
211
if( this == target && this.visibility ) {
212
var res = kaiten( this.usefulX, this.usefulY, globalTheta );
213
return { x : globalX + res.x, y : globalY + res.y, theta : globalTheta };
214
} else {
215
216
for( var i = 0; i < this.children.length; i++ ) {
217
var child = this.children[ i ];
218
var d = child.measure( target, globalTheta, globalX, globalY );
219
220
if( d != null ) return d;
221
}
222
}
223
return null;
224
}
225
226
SVC.prototype.backup = function() {
227
228
this.backupBuf = new Object();
229
for( var name in this ) {
230
var v = this[ name ];
231
switch( name ) {
232
case "x":
233
case "y":
234
case "theta":
235
this.backupBuf[ name ] = v;
236
break;
237
}
238
}
239
};
240
241
SVC.prototype.backup_restore = function() {
242
243
244
if( this.backupBuf == null ) {
245
alert( "backup_restore(): NG." );
246
return;
247
}
248
for( var name in this.backupBuf ) {
249
this[ name ] = this.backupBuf[ name ];
250
}
251
}