Skin:
[NORMAL]
[BLUE] [DOS] [LIGHT]  / コピーするための表示 / 実行
このファイル: /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 //check.
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 //check.
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 //check. calcInfoの場合省略
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 ]; //poseRefs == actionsの1要素
70 anmGroup.seek = -1;
71 anmGroup.callbackTarget = this;
72 this.callback = function( anmGroup ) {
73 //次のポーズへ
74 anmGroup.seek ++;
75 //check. ポーズすべて終了か?
76 if( anmGroup.seek == anmGroup.action.length ) {
77 return false; //falseはanmGroupを削除し終了の意
78 }
79 //次のポーズをアニメに設定
80 anmGroup.anmArray = new Array(); //初期化
81 var item = anmGroup.action[ anmGroup.seek ]; // i == item
82 var poseName = item[ 0 ];
83 var limitMS = item[ 1 ];
84 anmGroup.svcm.doAnm( poseName, limitMS, anmGroup );
85 return true; //trueはanmGroupを削除せず続行の意
86 };
87 //アニメ開始として1回実行
88 anmGroup.callbackTarget.callback( anmGroup );
89 };
90
91 SVCM.prototype.drawByTree = function( canvas, svc ) {
92 //check.
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 //---SVCクラス
110
111 function SVC( title ) {
112 /*
113 サイドビューキャラ クラス
114 */
115 //check.
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 //すべての子の位置を抜本的に補正する(actionbaseの高さで使用)
131 this.childrenX = 0;
132 this.childrenY = 0;
133 this.usefulX = 0; //便利なXY情報。
134 this.usefulY = 0;
135 //(物体が地面と接触する位置だったり、手の平の中心だったり)
136 this.visibility = true;
137 }
138
139 SVC.prototype.draw = function( canvas, target ) {
140 /*
141 メインのdraw()から呼ばれている。
142 SVCクラスのこのdraw()は再帰呼び出しを行うことで親子関係を走査し、targetを見つけたら描画して終了する。
143 その際、各親の座標系(translate(),rotate())を経由するので、正しい位置と回転でtargetの描画を行える。
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 //check.
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 //check.
220 if( d != null ) return d;
221 }
222 }//if
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 //check.
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 }