5 //これらのクラスとメインマネージャーは直接プロパティを参照し合うので注意
\r
7 function NetworkManager(mManager){
\r
9 this.syncIntervalMs = 128;
\r
11 window.setInterval(this.syncTimerTickEventListener, this.syncIntervalMs);
\r
14 NetworkManager.prototype = {
\r
15 //from http://hakuhin.jp/js/xmlhttprequest.html
\r
16 CreateRequestObject: function(){
\r
20 // XMLHttpRequest オブジェクトを作成
\r
21 rq = new XMLHttpRequest();
\r
23 // Internet Explorer
\r
25 rq = new ActiveXObject('MSXML2.XMLHTTP.6.0');
\r
28 rq = new ActiveXObject('MSXML2.XMLHTTP.3.0');
\r
31 rq = new ActiveXObject('MSXML2.XMLHTTP');
\r
38 RequestObjectDisableCache: function(rq){
\r
39 //call after open request.
\r
41 //http://vird2002.s8.xrea.com/javascript/XMLHttpRequest.html
\r
42 rq.setRequestHeader('Pragma', 'no-cache'); // HTTP/1.0 における汎用のヘッダフィールド
\r
43 rq.setRequestHeader('Cache-Control', 'no-cache'); // HTTP/1.1 におけるキャッシュ制御のヘッダフィールド
\r
44 rq.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT');
\r
47 sendRequestSync: function(mode, url, data){
\r
49 var q = this.CreateRequestObject();
\r
50 q.open(mode, url, false);
\r
51 q.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
\r
52 this.RequestObjectDisableCache(q);
\r
55 alert("ネットワークにアクセスできません。" + q.status + ":" + q.statusText);
\r
56 }else if((200 <= q.status && q.status < 300) || (q.status == 304)){
\r
57 var res = q.responseText;
\r
58 if(isValidResponseText(res)){
\r
62 alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
\r
66 sendRequestAsync: function(mode, url, data, callback){
\r
69 var q = this.CreateRequestObject();
\r
71 q.onreadystatechange = function(){
\r
72 if(q.readyState == 4){
\r
74 alert("ネットワークにアクセスできません。" + q.status + ":" + q.statusText);
\r
75 }else if((200 <= q.status && q.status < 300) || (q.status == 304)){
\r
76 var res = q.responseText;
\r
77 if(isValidResponseText(res)){
\r
81 alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
\r
85 q.open(mode, url, true);
\r
86 q.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
\r
87 this.RequestObjectDisableCache(q);
\r
92 if(mainManager.userID != 0){
\r
93 var s = mainManager.runningStage;
\r
94 if(s && s.pendingGlobalStageObjectList.length > 0){
\r
95 console.log("Network:Send request to add " + s.pendingGlobalStageObjectList.length + " own object(s).");
\r
96 //サーバーにオブジェクト追加情報をアップロード
\r
98 var res = this.sendRequestSync("POST", URL_PCD_Root + "update.php?uid=" + mainManager.userID + "&action=add", s.pendingGlobalStageObjectData.data);
\r
101 var retArray = eval(res);
\r
102 this.timeStamp = retArray[0];
\r
103 //割り当てられたobjectIDを設定する
\r
104 for(var i = 0, k = s.pendingGlobalStageObjectList.length; i < k; i++){
\r
105 console.log("Network:Object has allocated ID:" + retArray[1][i]);
\r
106 s.pendingGlobalStageObjectList[i].objectID = retArray[1][i];
\r
107 s.globalStageObjectList.push(s.pendingGlobalStageObjectList[i]);
\r
110 s.pendingGlobalStageObjectData = new RequestData();
\r
111 s.pendingGlobalStageObjectList = new Array();
\r
113 //ユーザーIDが設定されている=オンライン状態
\r
116 var aData = new RequestData();
\r
118 s.appendSyncDataTo(aData);
\r
122 var res = this.sendRequestSync("POST", URL_PCD_Root + "update.php?uid=" + mainManager.userID + "&action=refresh", aData.data);
\r
126 syncSub: function(res){
\r
128 var s = mainManager.runningStage;
\r
129 var retArray = eval(res);
\r
130 this.timeStamp = retArray[0];
\r
132 for(var i = 0; i < retArray[3].length; i++){
\r
133 console.log("Network:removeObject:ObjectID=" + retArray[3][i] + "\n");
\r
134 var anObject = s.getGlobalStageObject(retArray[3][i]);
\r
136 s.removeStageObject(anObject);
\r
140 for(var i = 0; i < retArray[1].length; i++){
\r
141 //mainManager.debugOut("Network:refreshObject:ObjectID=" + retArray[1][i] + "\n");
\r
142 var anArray = retArray[1][i];
\r
143 var anObject = s.getGlobalStageObject(anArray[0]);
\r
145 anObject.origin.x = anArray[1];
\r
146 anObject.origin.y = anArray[2];
\r
147 anObject.movingSpeed.x = anArray[3];
\r
148 anObject.movingSpeed.y = anArray[4];
\r
149 anObject.attribute = eval(anArray[6]);
\r
150 anObject.updateAttribute();
\r
154 for(var i = 0; i < retArray[2].length; i++){
\r
155 var anArray = retArray[2][i];
\r
156 var args = eval(anArray[7]);
\r
157 var anObject = eval("new " + anArray[5] + "(s, args, true);");
\r
159 console.log("Network:addObject:ObjectID=" + anArray[0] + "\n");
\r
160 anObject.objectID = anArray[0];
\r
161 anObject.ownerUID = anArray[8];
\r
162 anObject.origin.x = anArray[1];
\r
163 anObject.origin.y = anArray[2];
\r
164 anObject.movingSpeed.x = anArray[3];
\r
165 anObject.movingSpeed.y = anArray[4];
\r
166 anObject.attribute = eval(anArray[6]);
\r
167 anObject.updateAttribute();
\r
168 s.addStageObject(anObject, true, true);
\r
172 mainManager.userManager.userList = retArray[4];
\r
175 joinStage: function(stage){
\r
176 if(mainManager.userID != 0){
\r
178 var res = this.sendRequestSync("POST", URL_PCD_Root + "update.php?uid=" + mainManager.userID + "&action=add", null);
\r
182 var retArray = eval(res);
\r
183 this.timeStamp = retArray[0];
\r
184 for(var i = 0; i < retArray[2].length; i++){
\r
185 var anArray = retArray[2][i];
\r
186 var args = eval(anArray[7]);
\r
187 var anObject = eval("new " + anArray[5] + "(stage, args, true);");
\r
189 mainManager.debugOut("Network:addObject:ObjectID=" + anArray[0] + "\n");
\r
190 anObject.objectID = anArray[0];
\r
191 anObject.ownerUID = anArray[8];
\r
192 anObject.origin.x = anArray[1];
\r
193 anObject.origin.y = anArray[2];
\r
194 anObject.movingSpeed.x = anArray[3];
\r
195 anObject.movingSpeed.y = anArray[4];
\r
196 anObject.attribute = eval(anArray[6]);
\r
197 //stage.addStageObject(anObject, true, true);
\r
203 syncTimerTickEventListener: function(event){
\r
204 mainManager.networkManager.sync();
\r
208 function UIManager(mManager){
\r
210 //キーボード状態を格納するプロパティの設定
\r
211 this.keyState = new Object();
\r
212 this.keyState.goLeft = false;
\r
213 this.keyState.goRight = false;
\r
214 this.keyState.goUp = false;
\r
215 this.keyState.goDown = false;
\r
216 this.keyState.fire = false;
\r
217 this.keyState.select = false;
\r
218 this.keyState.numbers = [false, false, false, false, false, false, false, false, false, false]; // 0 - 9
\r
222 window.addEventListener('keydown', this.keyDownEventListener, true);
\r
224 window.addEventListener('keyup', this.keyUpEventListener, true);
\r
226 UIManager.prototype = {
\r
229 cursorLeft: 37, //左カーソル
\r
230 cursorRight: 39, //右カーソル
\r
231 cursorUp: 38, //上カーソル
\r
232 cursorDown: 40, //下カーソル
\r
237 select: 13 //13 : enter
\r
239 setKeyFromEvent: function(event, state){
\r
240 var keyCode = event.keyCode;
\r
241 if(keyCode == mainManager.UIManager.keyID.cursorLeft){
\r
242 mainManager.UIManager.keyState.cursorLeft = state
\r
244 if(keyCode == mainManager.UIManager.keyID.cursorRight){
\r
245 mainManager.UIManager.keyState.cursorRight = state
\r
247 if(keyCode == mainManager.UIManager.keyID.cursorUp){
\r
248 mainManager.UIManager.keyState.cursorUp = state
\r
250 if(keyCode == mainManager.UIManager.keyID.cursorDown){
\r
251 mainManager.UIManager.keyState.cursorDown = state
\r
253 if(keyCode == mainManager.UIManager.keyID.goLeft){
\r
254 mainManager.UIManager.keyState.goLeft = state
\r
256 if(keyCode == mainManager.UIManager.keyID.goRight){
\r
257 mainManager.UIManager.keyState.goRight = state
\r
259 if(keyCode == mainManager.UIManager.keyID.jump){
\r
260 mainManager.UIManager.keyState.jump = state
\r
262 if(keyCode == mainManager.UIManager.keyID.fire){
\r
263 mainManager.UIManager.keyState.fire = state
\r
265 if(keyCode == mainManager.UIManager.keyID.select){
\r
266 mainManager.UIManager.keyState.select = state;
\r
268 if(48 <= keyCode && keyCode <= 57){
\r
269 var keyNo = keyCode - 48; //押されたキーの値
\r
270 mainManager.UIManager.keyState.numbers[keyNo] = state;
\r
273 if(mainManager.runningStage){
\r
280 event.preventDefault();
\r
285 keyDownEventListener:function(event){
\r
286 UIManager.prototype.setKeyFromEvent(event, true);
\r
288 if(mainManager.runningStage){
\r
289 mainManager.runningStage.keyDown(event);
\r
292 keyUpEventListener:function(event){
\r
293 UIManager.prototype.setKeyFromEvent(event, false);
\r
295 if(mainManager.runningStage){
\r
296 mainManager.runningStage.keyUp(event);
\r
299 clearInput: function(){
\r
300 this.keyState.goLeft = false;
\r
301 this.keyState.goRight = false;
\r
306 function UserManager(mManager){
\r
307 this.userList = {};
\r
308 //ingredientListはSelectWidgetItemClassの配列
\r
309 this.ingredientList = new Array();
\r
310 this.maxIngredients = 10;
\r
311 //breadListはパンの得点数値の配列
\r
312 this.breadList = new Array();
\r
314 this.characterBaseClass = MainCharacterClass_Man;
\r
316 UserManager.prototype = {
\r
317 loginAs: function(userNameStr){
\r
318 //呼び出し元stageにauthformがあることを前提とする
\r
319 var i = userNameStr.indexOf("@");
\r
320 var url = URL_PCD_Auth + "?action=join&name=" + encodeURIComponent(mainManager.runningStage.authform.userName.value);
\r
323 var userName = userNameStr.substring(0, i);
\r
324 var stageName = userNameStr.substring(i + 1);
\r
325 url = URL_PCD_Auth + "?action=devjoin&name=" + encodeURIComponent(userName) + "&stage=" + encodeURIComponent(stageName);
\r
327 var res = mainManager.networkManager.sendRequestSync("GET", url, null);
\r
330 var result = eval(res);
\r
331 if(result[3] == 0){
\r
332 alert("ログインできません。データベース通信エラーです。");
\r
334 } else if(result[3] == 11){
\r
335 alert("すでにその名前は使われています。他の名前を試してください。");
\r
337 } else if(result[3] == 10){
\r
338 alert("ID:" + result[0] + " でログインしました。");
\r
339 mainManager.userID = result[0];
\r
340 mainManager.timeStamp = result[1];
\r
342 var r = eval(result[4]);
\r
344 this.characterBaseClass = r;
\r
347 mainManager.loadStageFromNetwork(result[2]);
\r
352 getUserNameByUID: function(uid){
\r
353 if(uid in this.userList){
\r
354 return this.userList[uid];
\r
356 return "Anonymous";
\r
358 addIngredientItem: function(item){
\r
360 if(this.ingredientList.length < this.maxIngredients){
\r
361 this.ingredientList.push(item);
\r
366 getSumPoint: function(){
\r
368 for(var i = 0, k = this.breadList.length; i < k; i++){
\r
369 p += this.breadList[i];
\r
371 for(var i = 0, k = this.ingredientList.length; i < k; i++){
\r
372 if(this.ingredientList[i].point < 0){
\r
373 p += this.ingredientList[i].point;
\r
384 function Point2D(x, y){
\r
388 Point2D.prototype = {
\r
392 function Rectangle(x, y, width, height){
\r
393 this.origin = new Point2D(x,y);
\r
394 this.size = new Point2D(width,height);
\r
396 Rectangle.prototype = {
\r
400 function OffsetBox(top, bottom, left, right){
\r
402 this.bottom = bottom;
\r
404 this.right = right;
\r
406 OffsetBox.prototype = {
\r
410 function RequestData(){
\r
411 //FormDataがIEで動かないので代替
\r
415 RequestData.prototype = {
\r
416 append: function(name, data){
\r
417 this.data += this.getURLEncodedString(name) + "=" + this.getURLEncodedString(data) + "&";
\r
420 getURLEncodedString: function(str){
\r
421 return encodeURIComponent(str).replace(/%20/g, '+');
\r