5 //これらのクラスとメインマネージャーは直接プロパティを参照し合うので注意
7 function NetworkManager(mManager){
9 this.syncIntervalMs = 128;
11 window.setInterval(this.syncTimerTickEventListener, this.syncIntervalMs);
13 NetworkManager.prototype = {
14 //from http://hakuhin.jp/js/xmlhttprequest.html
15 CreateRequestObject: function(){
19 // XMLHttpRequest オブジェクトを作成
20 rq = new XMLHttpRequest();
24 rq = new ActiveXObject('MSXML2.XMLHTTP.6.0');
27 rq = new ActiveXObject('MSXML2.XMLHTTP.3.0');
30 rq = new ActiveXObject('MSXML2.XMLHTTP');
37 RequestObjectDisableCache: function(rq){
38 //call after open request.
40 //http://vird2002.s8.xrea.com/javascript/XMLHttpRequest.html
41 rq.setRequestHeader('Pragma', 'no-cache'); // HTTP/1.0 における汎用のヘッダフィールド
42 rq.setRequestHeader('Cache-Control', 'no-cache'); // HTTP/1.1 におけるキャッシュ制御のヘッダフィールド
43 rq.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT');
49 if(mainManager.userID != 0){
50 //ユーザーIDが設定されている=オンライン状態
51 request = this.CreateRequestObject();
53 request.open('POST', URL_PCD_Root + "update.php?uid=" + mainManager.userID + "&action=refresh", false);
54 request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
56 aData = new RequestData();
57 if(mainManager.runningStage){
58 mainManager.runningStage.appendSyncDataTo(aData);
61 this.RequestObjectDisableCache(request);
62 request.send(aData.data);
64 if(request.status == 0){
65 alert("ネットワークにアクセスできません。" + this.status + ":" + this.statusText);
66 } else if((200 <= request.status && request.status < 300) || (request.status == 304)){
67 var res = request.responseText;
68 if(isValidResponseText(res)){
69 var retArray = eval(res);
70 this.timeStamp = retArray[0];
72 for(var i = 0; i < retArray[3].length; i++){
73 mainManager.debugOut("Network:removeObject:ObjectID=" + retArray[3][i] + "\n");
74 var anObject = mainManager.runningStage.getGlobalStageObject(retArray[3][i]);
76 mainManager.runningStage.removeStageObject(anObject);
80 for(var i = 0; i < retArray[1].length; i++){
81 //mainManager.debugOut("Network:refreshObject:ObjectID=" + retArray[1][i] + "\n");
82 var anArray = retArray[1][i];
83 var anObject = mainManager.runningStage.getGlobalStageObject(anArray[0]);
85 anObject.origin.x = anArray[1];
86 anObject.origin.y = anArray[2];
87 anObject.movingSpeed.x = anArray[3];
88 anObject.movingSpeed.y = anArray[4];
89 anObject.attribute = eval(anArray[6]);
90 anObject.updateAttribute();
94 for(var i = 0; i < retArray[2].length; i++){
95 var anArray = retArray[2][i];
96 var args = eval(anArray[7]);
97 var anObject = eval("new " + anArray[5] + "(mainManager.runningStage, args);");
99 mainManager.debugOut("Network:addObject:ObjectID=" + anArray[0] + "\n");
100 anObject.objectID = anArray[0];
101 anObject.ownerUID = anArray[8];
102 anObject.origin.x = anArray[1];
103 anObject.origin.y = anArray[2];
104 anObject.movingSpeed.x = anArray[3];
105 anObject.movingSpeed.y = anArray[4];
106 anObject.attribute = eval(anArray[6]);
107 anObject.updateAttribute();
108 mainManager.runningStage.addStageObject(anObject, true);
112 mainManager.userManager.userList = retArray[4];
116 alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
120 joinStage: function(stage){
121 //サーバーに追加オブジェクトの情報をアップロード
122 if(mainManager.userID != 0){
123 request = this.CreateRequestObject();
125 request.open('POST', URL_PCD_Root + "update.php?uid=" + mainManager.userID + "&action=add", false);
126 request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
128 aData = new RequestData();
129 stage.appendInitialSyncDataTo(aData);
131 this.RequestObjectDisableCache(request);
132 request.send(aData.data);
134 if(request.status == 0){
135 alert("ネットワークにアクセスできません。" + this.status + ":" + this.statusText);
136 }else if((200 <= request.status && request.status < 300) || (request.status == 304)){
137 var res = request.responseText;
138 if(isValidResponseText(res)){
139 var retArray = eval(res);
140 this.timeStamp = retArray[0];
141 //割り当てられたobjectIDを設定する
142 for(var i = 0; i < stage.globalStageObjectList.length; i++){
143 stage.globalStageObjectList[i].objectID = retArray[1][i];
145 //すでにステージ上にある他のユーザーのオブジェクトを追加する
146 for(var i = 0; i < retArray[2].length; i++){
147 var anArray = retArray[2][i];
148 var args = eval(anArray[7]);
149 var anObject = eval("new " + anArray[5] + "(stage, args);");
151 mainManager.debugOut("Network:addObject:ObjectID=" + anArray[0] + "\n");
152 anObject.objectID = anArray[0];
153 anObject.ownerUID = anArray[8];
154 anObject.origin.x = anArray[1];
155 anObject.origin.y = anArray[2];
156 anObject.movingSpeed.x = anArray[3];
157 anObject.movingSpeed.y = anArray[4];
158 anObject.attribute = eval(anArray[6]);
159 stage.addStageObject(anObject, true);
164 alert("サーバーがエラーを返しました。" + this.status + ":" + this.statusText);
169 syncTimerTickEventListener: function(event){
170 mainManager.networkManager.sync();
174 function UIManager(mManager){
176 //キーボード状態を格納するプロパティの設定
177 this.keyState = new Object();
178 this.keyState.goLeft = false;
179 this.keyState.goRight = false;
180 this.keyState.goUp = false;
181 this.keyState.goDown = false;
182 this.keyState.fire = false;
186 window.addEventListener('keydown', this.keyDownEventListener, true);
188 window.addEventListener('keyup', this.keyUpEventListener, true);
190 UIManager.prototype = {
193 cursorLeft: 37, //左カーソル
194 cursorRight: 39, //右カーソル
195 cursorUp: 38, //上カーソル
196 cursorDown: 40, //下カーソル
202 setKeyFromEvent: function(event, state){
203 var keyCode = event.keyCode;
204 if(keyCode == mainManager.UIManager.keyID.cursorLeft){
205 mainManager.UIManager.keyState.cursorLeft = state
207 if(keyCode == mainManager.UIManager.keyID.cursorRight){
208 mainManager.UIManager.keyState.cursorRight = state
210 if(keyCode == mainManager.UIManager.keyID.cursorUp){
211 mainManager.UIManager.keyState.cursorUp = state
213 if(keyCode == mainManager.UIManager.keyID.cursorDown){
214 mainManager.UIManager.keyState.cursorDown = state
216 if(keyCode == mainManager.UIManager.keyID.goLeft){
217 mainManager.UIManager.keyState.goLeft = state
219 if(keyCode == mainManager.UIManager.keyID.goRight){
220 mainManager.UIManager.keyState.goRight = state
222 if(keyCode == mainManager.UIManager.keyID.jump){
223 mainManager.UIManager.keyState.jump = state
225 if(keyCode == mainManager.UIManager.keyID.fire){
226 mainManager.UIManager.keyState.fire = state
229 if(mainManager.runningStage){
235 event.preventDefault();
240 keyDownEventListener:function(event){
241 UIManager.prototype.setKeyFromEvent(event, true);
243 if(mainManager.runningStage){
244 mainManager.runningStage.keyDown(event);
247 keyUpEventListener:function(event){
248 UIManager.prototype.setKeyFromEvent(event, false);
250 if(mainManager.runningStage){
251 mainManager.runningStage.keyUp(event);
254 clearInput: function(){
255 this.keyState.goLeft = false;
256 this.keyState.goRight = false;
261 function UserManager(mManager){
264 this.HP = this.max_HP;
266 UserManager.prototype = {
267 loginAs: function(userNameStr){
268 request = mainManager.networkManager.CreateRequestObject();
270 var i = userNameStr.indexOf("@");
273 var userName = userNameStr.substring(0, i);
274 var stageName = userNameStr.substring(i + 1);
275 request.open('GET', URL_PCD_Auth + "?action=devjoin&name=" + encodeURIComponent(userName) + "&stage=" + encodeURIComponent(stageName), false);
278 request.open('GET', URL_PCD_Auth + "?action=join&name=" + encodeURIComponent(mainManager.runningStage.authform.userName.value), false);
280 mainManager.networkManager.RequestObjectDisableCache(request);
283 if(request.status == 0){
284 alert("ネットワークへのアクセスに失敗しました。");
285 }else if((200 <= request.status && request.status < 300) || (request.status == 304)){
286 if(isValidResponseText(request.responseText)){
287 result = eval(request.responseText);
289 alert("ログインできません。データベース通信エラーです。");
291 } else if(result[3] == 11){
292 alert("すでにその名前は使われています。他の名前を試してください。");
294 } else if(result[3] == 10){
295 alert("ID:" + result[0] + " でログインしました。");
296 mainManager.userID = result[0];
297 mainManager.timeStamp = result[1];
298 mainManager.loadStageFromNetwork(result[2]);
303 alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
306 getUserNameByUID: function(uid){
307 if(uid in this.userList){
308 return this.userList[uid];
321 if(this.HP + p > this.max_HP){
322 this.HP = this.max_HP;
329 //終了処理および再読み込みはmainManager側で行われる。
337 function Point2D(x, y){
341 Point2D.prototype = {
345 function Rectangle(x, y, width, height){
346 this.origin = new Point2D(x,y);
347 this.size = new Point2D(width,height);
349 Rectangle.prototype = {
353 function OffsetBox(top, bottom, left, right){
355 this.bottom = bottom;
359 OffsetBox.prototype = {
363 function RequestData(){
364 //FormDataがIEで動かないので代替
367 RequestData.prototype = {
368 append: function(name, data){
369 this.data += this.getURLEncodedString(name) + "=" + this.getURLEncodedString(data) + "&";
371 getURLEncodedString: function(str){
372 return encodeURIComponent(str).replace(/%20/g, '+');