OSDN Git Service

Merge branch 'master' of https://scm.sourceforge.jp/gitroot/h58pcdgame/GameScriptCore...
[h58pcdgame/GameScriptCoreLibrary.git] / www / corelib / core.js
old mode 100755 (executable)
new mode 100644 (file)
index 25d0c4c..61c9fad
 ****PCD-2013 GameScriptCoreLibrary****
 Tokyo Gakugei University Senior High School.
 
+<クライアント要件>
+Mac OSX: Safari, Chrome
+Windows: Chrome, IE(9 or later)
+
+以下の技術が実行可能である必要があります:
+HTML5
+       Canvas
+       FormData
+
 <Usage>
 HTMLソース側に、
 <div id="MainArea">
 </div>
 <div id="Resources">
 </div>
+および
+mainManager = new GameManager();
 が必要。
-
-<Javascript Tips>
-document.getElementById("main").style.display = "none";
-(mainというIDが振られている要素の表示を消す)
-this.effectSound.pause();
-this.effectSound.currentTime = 0;
-this.effectSound.play();
-this.backgroundImage = new Image();
-this.backgroundMusic = document.getElementById('BGM006');
-this.effectSound = document.getElementById('SE_Select');
-画像読み込み
-this.backgroundImage.manager = this;
-this.backgroundImage.onload = this.backgroundLoaded;
-this.backgroundImage.src = "title.gif";
-
-音楽再生
-this.backgroundMusic.loop = true;
-this.backgroundMusic.play();
-
-MicrosoftInternetExplorerでは、ローカル変数でparentを使うとappendChildが使えなくなる…。
-
-<About collision checking>(このあたりはまだドラフト)
-ステージオブジェクトの最小単位を8x8とする。
 */
 
 //
 //定数
 //
-var URL_PCD_Root = "http://192.168.6.242/pcd2013dev/www/";
+
+var loc = document.location.href;
+
+var URL_PCD_Root = loc.slice(0, loc.lastIndexOf("/") + 1);
+
 var URL_PCD_Auth = URL_PCD_Root + "auth.php";
+var URL_PCD_Audio = URL_PCD_Root + "audio/";
 var URL_PCD_Stage = URL_PCD_Root + "stage/";
 
+// ゲームを呼び出す関数      適切なdiv要素で呼び出すとゲームを初期化できる。
+// つまり、自作ゲームをしたい場合
+// audio, corelib, images, stageの各フォルダをコピーしたdirにhtmlを置き、<div>.InitGameManager() と実行するスクリプトを書く
+// stageName == nullだとステージを開始しない。指定する時は.jsおよびパスを省く
+
+//
+var CollideBody = 16;
+var CollideTop = 8;
+var CollideBottom = 4;
+var CollideLeft = 2;
+var CollideRight = 1;
+
+HTMLDivElement.prototype.InitGameManager = function(stageName)
+{
+       if(this instanceof HTMLDivElement)
+       {
+               var man = new GameManager(this, null);
+               if(stageName) man.loadStageFromNetwork.apply(man, [stageName]);
+               return man;
+       }else
+       {
+               throw new TypeError("InitGameManager はdiv要素にしか実行できません");
+       }
+};
+
 //
 //ゲームマネージャー
 //
 
-function GameManager(){
-       //****コンストラクタ****
-       //**インスタンス変数宣言・初期化**
-       //ユーザーID
+function GameManager(parent, debugTextName){
+       
+       //引数チェック
+       if(debugTextName == undefined) debugTextName = "DebugText";
+       if(parent == undefined) parent = document.getElementById("MainArea");
+       
+       //parentの初期設定
+       if(parent.style.position != 'absolute') parent.style.position = 'relative';
+       
        this.userID = 0;
-       //ネットワークマネージャーの設定
-       this.networkManager = new NetworkManager();
+       //サブマネージャーの設定
+       this.networkManager = new NetworkManager(this);
+       this.UIManager = new UIManager(this);
+       this.userManager = new UserManager(this);
+       this.mainArea = parent;
        //必要最低限のCanvasとコンテキストの設定
-       this.mainCanvas = createCanvas("MainCanvas", 640, 480, 0, 0, 1, "MainArea");
+       this.mainCanvas = createCanvas("MainCanvas", 640, 480, 0, 0, 1, parent);
        this.mainCanvas.style.border = "solid 1px";
-       this.debugCanvas = createCanvas("DebugCanvas", 640, 480, 0, 480, 2, "MainArea");
        this.mainContext = this.mainCanvas.getContext('2d');
-       this.debugContext = this.debugCanvas.getContext('2d');
-       this.debugText = document.getElementById('DebugText');
+       this.debugText = document.getElementById(debugTextName);        //要素が存在しないとnullになり、デバッグが無効になる
+       if(!this.debugText) this.debugText = null;
+       
+       //ブラウザチェック
+       this.isIE = false;
+       if(!this.isAvailableBrowser()){
+               return null;
+       }
+       //描画コンテキストの初期設定
+       this.mainContext.fillStyle = "rgba(200,255,200,0.5)";
+       this.mainContext.strokeStyle = "rgba(0, 0, 0, 0.5)";
+       this.mainContext.font = "normal 20px sans-serif";
        //実行中のGameStageオブジェクトを格納
        this.runningStage = null;
+       this.runningStageName = null;
+       //現在存在しているWidghetのリストを格納
+       this.runningWidgets = [];
+       
        //タイマーカウントを初期化
        this.tickCount = 0;
-       this.timeStamp = 0;
        //タイマーカウントの秒あたりの回数を設定
        this.tickPerSecond = 60;
-       //キーボード状態を格納するプロパティの設定
-       this.keyState = new Object();
-       this.keyState.upArrow = false;
-       this.keyState.downArrow = false;
-       this.keyState.leftArrow = false;
-       this.keyState.rightArrow = false;
-       
-       //**描画コンテキスト取得、設定・HTML5対応チェック**
-       if(!this.mainCanvas || !this.mainCanvas.getContext){
-               //HTML5未対応の場合
-               alert("このゲームを遊ぶためには、HTML5に対応しているブラウザでアクセスしてください...。");
-               return false;
-       }
-       
-       //**Canvas描画コンテキストの初期設定**
-       //mainContext
-       this.mainContext.fillStyle = "rgba(200,255,200,0.5)";
-       this.mainContext.strokeStyle = "rgba(0, 0, 0, 0.5)";
-       //debugContext
-       this.debugContext.fillStyle = "rgb(255,255,255)";
-       this.debugContext.strokeStyle = "rgb(0, 0, 0)";
-       this.debugContext.font = "normal 20px sans-serif";
+       // pauseStage()が呼ばれたときにnullじゃなくなる
+       this.stagePausedFunction = null;
        
+       this.backgroundMusic = null;
+
        //**イベントリスナー設定**
        //コールバックを行うために、イベントリスナーのmanagerプロパティにGameManagerのインスタンスを代入する。
-       //keyDown
-       keyDownEventListener.manager = this;
-       window.addEventListener('keydown', keyDownEventListener, true);
-       //keyUp
-       keyUpEventListener.manager = this;
-       window.addEventListener('keyup', keyUpEventListener, true);
        //timerTick
        timerTickEventListener.manager = this;
        window.setInterval(timerTickEventListener, 1000/this.tickPerSecond);
-       timeStampTimerTickEventListener.manager = this;
-       window.setInterval(timeStampTimerTickEventListener, 100);
+       
+       //各種コールバック(使用元のスクリプトで使う用)
+       this.stageStartedEvent = null;          //ステージが開始されたときに呼ばれる。引数: stage
+       this.stageStoppedEvent = null;          //ステージが終了されたときに呼ばれる。引数: stage
 }
 GameManager.prototype = {
-       //****プロトタイプ宣言****
-       //prototype以下のプロパティは、新規インスタンスに参照が引き継がれる。
-       keyDown: function(event){
-               //****keyDown****
-               //コールバックではなくコールバック関数(keyDownEventListener)から呼び出されるので、thisはGameManagerのインスタンスとなる。
-               keyCode = event.keyCode;
-               switch(event.keyCode){
-                       case 38:
-                               //上カーソル
-                               this.keyState.upArrow = true;
-                               event.preventDefault();
-                               break;
-                       case 40:
-                               //下カーソル
-                               this.keyState.downArrow = true;
-                               event.preventDefault();
-                               break;
-                       case 37:
-                               //左カーソル
-                               this.keyState.leftArrow = true;
-                               event.preventDefault();
-                               break;
-                       case 39:
-                               //右カーソル
-                               this.keyState.rightArrow = true;
-                               event.preventDefault();
-                               break;
+       timerTick: function(){
+               //各オブジェクトの単位時間ごとの動作と再描画を行う
+               //単位時間ごとの動作
+               this.tickCount++;
+               if(this.stagePausedFunction == null){
+                       //ポーズしていなければ更新処理
+                       if(this.runningStage){
+                               //ステージ
+                               this.runningStage.timerTick();
+                       }
                }
-
-               this.debugOut("keyDw:" + keyCode + "\n");
-               //実行中のステージに通知
+               // runningStage.timerTick() 内でpauseStage()された時、ここで再度判定しないとWidghetのtickが実行されてしまう
+               if(this.stagePausedFunction == null){
+                       //ウィジェット
+                       for(var i = 0; i < this.runningWidgets.length; i++){
+                               var w = this.runningWidgets[i];
+                               if(!w.tick()){
+                                       // Widghetのtick()からfalseで帰ってきたらWidghetを開放
+                                       this.removeWidget(w);
+                                       i--;
+                               }
+                       }
+               } else{
+                       //ポーズしているならば処理関数を実行
+                       this.stagePausedFunction();
+               }
+               
+               
+               //描画処理
                if(this.runningStage){
-                       this.runningStage.keyDown(event);
+                       //ステージ
+                       this.runningStage.draw();
                }
-       },
-       keyUp: function(event){
-               //****keyUp****
-               //コールバックではなくコールバック関数(keyUpEventListener)から呼び出されるので、thisはGameManagerのインスタンスとなる。
-               keyCode = event.keyCode;
-               switch(event.keyCode){
-                       case 38:
-                               //上カーソル
-                               this.keyState.upArrow = false;
-                               break;
-                       case 40:
-                               //下カーソル
-                               this.keyState.downArrow = false;
-                               break;
-                       case 37:
-                               //左カーソル
-                               this.keyState.leftArrow = false;
-                               break;
-                       case 39:
-                               //右カーソル
-                               this.keyState.rightArrow = false;
-                               break;
+               //ウィジェット
+               for(var i = 0; i < this.runningWidgets.length; i++){
+                       var w = this.runningWidgets[i];
+                       w.draw();
                }
-
-               this.debugOut("keyUp:" + keyCode + "\n");
-               //実行中のステージに通知
-               if(this.runningStage){
-                       this.runningStage.keyUp(event);
+               
+               //各オブジェクトの走査が終わってから、死亡判定およびステージ再読み込みを行う。
+               if(this.runningStage && this.runningStage.userControlledCharacter){
+                       if(this.runningStage.userControlledCharacter.HP == 0){
+                               this.runningStage.userControlledCharacter.HP = this.runningStage.userControlledCharacter.max_HP;
+                               this.addWidget(new MessageWidgetClass(this, ["死んでしまった……\n", null, function(w){
+                                       w.manager.UIManager.clearInput();
+                                       w.manager.runningStage.userControlledCharacter.HP = w.manager.runningStage.userControlledCharacter.max_HP;
+                                       if(w.manager.runningStageName){
+                                               w.manager.loadStageFromNetwork(w.manager.runningStageName);
+                                       } else{
+                                               //ローカルモード時は動作を停止させるだけ
+                                               w.manager.stopStage();
+                                       }
+                               }]));
+                               
+                       }
                }
        },
-       timerTick: function(){
-               //****timerTick****
-               this.tickCount++;
-               //実行中のステージに通知
-               if(this.runningStage){
-                       this.runningStage.timerTick();
-               }
+       addWidget: function(w){
+               w.attach();
+               this.runningWidgets.push(w);
        },
-       timeStampTimerTick: function(){
-               //サーバーとの同期カウンタ・タイマー
-               //100msごとに呼ばれる
-               this.timeStamp += 100;
-               drawText(this.debugContext, "timeStamp:" + this.timeStamp, 0, 40);
+       removeWidget: function(w){
+               if(removeObjectFromArray(this.runningWidgets, w))
+               {
+                       w.detach();
+               }
        },
        runStage: function(stage){
-               //****新たなステージを開始する****
+               //新たなステージを開始する
                //実行中のステージがあれば終了処理を行わせる。
                if(this.runningStage){
                        this.stopStage();
                }
-               //**新たに開始するステージの初期化**
+               //新たに開始するステージの初期化
                //GameManager側の情報をGameStageに渡す。
                stage.manager = this;
                stage.mainCanvas = this.mainCanvas
@@ -197,13 +202,41 @@ GameManager.prototype = {
                stage.debugContext = this.debugContext
                //GameStage側の初期化処理を行わせる。
                stage.runStage();
+               //ネットワーク同期初期化
+               this.networkManager.joinStage(stage);
                //runningStageに登録することで、イベントの通知が開始され、GameStageは実行状態に入る。
                this.runningStage = stage;
+               
+               if(this.stageStartedEvent)
+               {
+                       this.stageStartedEvent.apply(window, [stage]);
+               }
+               
+       },
+       pauseStage: function(func){
+               //ステージの実行を一時停止する。一時停止中、funcに指定された関数が毎tick毎に呼ばれる
+               if(this.stagePausedFunction == null){
+                       this.stagePausedFunction = func;
+                       return true;
+               } else{
+                       //ステージが一時停止中のfunc()の中から二重にpauseStage()を呼んではいけない
+                       return false;
+               }
+       },
+       resumeStage: function(){
+               //ステージの実行を再開する
+               if(this.stagePausedFunction != null) {
+                       //必ずpauseStage()の引数に指定したfunc()の中から呼ばれる・・・はず。
+                       this.stagePausedFunction = null;
+                       return true;
+               } else{
+                       return false;
+               }
        },
        stopStage: function(){
-               //****現在実行中のステージを終了する****
+               //現在実行中のステージを終了する
                if(this.runningStage){
-                       //runningStageから解除することで、イベントの通知は行われなくなる。
+                       //runningStageã\81\8bã\82\89設å®\9a解é\99¤ã\81\99ã\82\8bã\81\93ã\81¨ã\81§ã\80\81ã\82¤ã\83\99ã\83³ã\83\88ã\81®é\80\9aç\9f¥ã\81¯è¡\8cã\82\8fã\82\8cã\81ªã\81\8fã\81ªã\82\8bã\80\82
                        var aGameStage = this.runningStage;
                        this.runningStage = null;
                        //GameStage側の終了処理を行わせる。
@@ -214,341 +247,138 @@ GameManager.prototype = {
                        aGameStage.debugCanvas = null;
                        aGameStage.mainContext = null;
                        aGameStage.debugContext = null;
+                       
+                       //画面上に表示されたすべてのWidgetを解放する
+                       for(;this.runningWidgets.length>0;)
+                       {
+                               this.removeWidget(this.runningWidgets[0]);
+                       }
+                       
+                       if(this.stageStoppedEvent)
+                       {
+                               this.stageStoppedEvent.apply(window, [aGameStage]);
+                       }
                }
        },
-       loadStageFromNetwork: function(name, onLoaded){
-               //urlに存在するjavascriptファイルを利用してステージを作成する。
-               request = this.networkManager.CreateRequestObject();
-               request.onLoaded = onLoaded;
-               request.onreadystatechange = this.loadStageFromNetwork_HTTPStateChange
-               request.open('GET', URL_PCD_Stage + name + ".js");
-               request.send(null);
+       loadStageFromLocal: function(code){
+               //各種パスをローカル用に変更
+               URL_PCD_Root = "./";
+               URL_PCD_Auth = URL_PCD_Root + "auth.php";
+               URL_PCD_Audio = URL_PCD_Root + "audio/";
+               URL_PCD_Stage = URL_PCD_Root + "stage/";
+               
+               var stage = eval(code);
+               mainManager.runStage(stage);
        },
-       loadStageFromNetwork_HTTPStateChange: function(){
-               //requestコールバックなのでthisはrequest!
-               switch(this.readyState){
-                       case 0:
-                               //console.log("XMLHttpRequest created.");
-                               break;
-                       case 1:
-                               //console.log("open() called.");
-                               break;
-                       case 2:
-                               //console.log("Response header received.");
-                               break;
-                       case 3:
-                               //console.log("Response body receiving.");
-                               break;
-                       case 4:
-                               //mainManager.debugOut("send() compleated.\n");
-                               //mainManager.debugOut("status:" + this.status + ":" + this.statusText + "\n");
-                               if(this.status == 0){
-                                       alert("ネットワークにアクセスできません。" + this.status + ":" + this.statusText);
-                               }else if((200 <= this.status && this.status < 300) || (this.status == 304)){
-                                       //console.log("ACK");
-                                       stage = new GameStage();
-                                       eval(this.responseText);
-                                       if(this.onLoaded != null){
-                                               this.onLoaded(stage);
-                                       } else{
-                                               mainManager.runStage(stage);
-                                       }
-                               }else{
-                                       alert("サーバーがエラーを返しました。" + this.status + ":" + this.statusText);
-                               }
-                               break;
+       loadStageFromNetwork: function(name){
+               //URL_PCD_Stage/name.jsを利用してステージを作成する。
+               var request = this.networkManager.CreateRequestObject();
+               //同期モード
+               request.open('GET', URL_PCD_Stage + name + ".js", false);
+               this.networkManager.RequestObjectDisableCache(request);
+               request.send(null);
+               
+               if(request.status == 0){
+                       alert("ネットワークにアクセスできません。" + request.status + ":" + request.statusText);
+               }else if((200 <= request.status && request.status < 300) || (request.status == 304)){
+                       if(this.userID != 0){
+                               var rq2 = this.networkManager.CreateRequestObject();
+                               //同期モード
+                               rq2.open('GET', URL_PCD_Auth + "?action=chstg&name=" + name + "&id=" + this.userID);
+                               this.networkManager.RequestObjectDisableCache(rq2);
+                               rq2.send(null);
+                       }
+                       var stage = eval(request.responseText);
+                       this.runStage(stage);
+                       this.runningStageName = name;
+               }else{
+                       alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
                }
        },
        debugOut: function(str){
-               if(!/*@cc_on!@*/false)
+               if(this.debugText != null)
                {
-                       this.debugText.value = str.replace(/\n/g,"\r\n") + this.debugText.value;
-               }
-               else
-               {
-                       this.debugText.innerHTML = str + this.debugText.value;
+                       if(this.isIE)
+                       {
+                               //CRLF
+                               this.debugText.value = str.replace(/\n/g,"\r\n") + this.debugText.value;
+                       } else{
+                               //LF
+                               this.debugText.innerHTML = str + this.debugText.value;
+                       }
                }
        },
-};
-
-
-
-
-//
-//その他のクラス
-//
-
-function Point2D(x, y){
-       this.x = x;
-       this.y = y;
-}
-Point2D.prototype = {
-       
-}
-
-function Rectangle(x, y, width, height){
-       this.origin = new Point2D(x,y);
-       this.size = new Point2D(width,height);
-}
-Rectangle.prototype = {
-       
-}
-
-function ResourceManager(){
-       //Not implemented.
-    this.resourceObjectList = new Array();
-    
-       this.ResourceTag.prototype = {
-        
-    }
-}
-ResourceManager.prototype = {
-       //Not implemented.
-    addAudioResource: function(id, src){
-        dobj = document.createElement("audio");
-        parent = document.getElementById("Resources");
-        dobj.id = id;
-        parent.appendChild(dobj);
-        
-        this.resourceObjectList.push(dobj);
-        
-        dobj.isLoaded = false;
-        dobj.onload = this.resourceLoaded;
-        dobj.src = src;
-    },
-    resourceLoaded: function(){
-        //コールバック関数のthisはコールバック関数の設定先オブジェクト(DOMObject)となる。
-        this.isLoaded = true;
-    },
-    waitForLoadResource: function(){
-        for(;;){
-            for(i = 0; i < resourceObjectList.length; i++){
-                if(!resourceObjectList[i].isLoaded){
-                    
-                    break;
-                }
-            }
-            if(i == resourceObjectList.length){
-                return;
-            }
-        }
-    },
-}
-
-function NetworkManager(){
-
-}
-NetworkManager.prototype = {
-//from http://hakuhin.jp/js/xmlhttprequest.html
-       CreateRequestObject: function(){
-               // XMLHttpRequest
-               try{
-                       // XMLHttpRequest オブジェクトを作成
-                       return new XMLHttpRequest();
-               }catch(e){}
-               // Internet Explorer
-               try{
-                       return new ActiveXObject('MSXML2.XMLHTTP.6.0');
-               }catch(e){}
-               try{
-                       return new ActiveXObject('MSXML2.XMLHTTP.3.0');
-               }catch(e){}
-               try{
-                       return new ActiveXObject('MSXML2.XMLHTTP');
-               }catch(e){}
-               // 未対応
-               return null;
+       isAvailableBrowser: function(){
+               //ブラウザの判別を行う。実行不可能な場合はfalseを返す。
+               //http://d.hatena.ne.jp/Naotsugu/20110927/1317140891
+               var userAgent = window.navigator.userAgent.toLowerCase();
+               var appVersion = window.navigator.appVersion.toLowerCase();
+               
+               if (userAgent.indexOf('opera') != -1) {
+                       //opera
+                       this.debugOut("Browser:Opera\n");
+               } else if (userAgent.indexOf('msie') != -1) {
+                       if (appVersion.indexOf("msie 9.") != -1) {
+                               //ie9
+                               this.debugOut("Browser:IE9\n");
+                       } else if (appVersion.indexOf("msie 8.") != -1) {
+                               //ie8
+                               this.debugOut("Browser:IE8\n");
+                       } else if (appVersion.indexOf("msie 7.") != -1) {
+                               //ie7
+                               this.debugOut("Browser:IE7\n");
+                       } else if (appVersion.indexOf("msie 6.") != -1) {
+                               //ie6
+                               this.debugOut("Browser:IE6\n");
+                       } else{
+                               this.debugOut("Browser:IE?\n");
+                       }
+                       this.isIE = true;
+               } else if (userAgent.indexOf('chrome') != -1) {
+                       //chrome
+                       this.debugOut("Browser:Chrome\n");
+               } else if (userAgent.indexOf('safari') != -1) {
+                       //safari
+                       this.debugOut("Browser:Safari\n");
+               } else if (userAgent.indexOf('gecko') != -1) {
+                       //gecko
+                       this.debugOut("Browser:Gecko\n");
+               } else {
+                       //unknown
+                       this.debugOut("Browser:Unknown\n");
+               }
+               //描画コンテキストからHTML5対応チェック
+                       if(!this.mainCanvas || !this.mainCanvas.getContext){
+                               //HTML5未対応の場合
+                               alert("このゲームを遊ぶためには、HTML5に対応しているブラウザ(Google Chrome等)でアクセスしてください...。");
+                       return false;
+               }
+               return true;
        },
-       HTTPStateChange: function(){
-               //requestコールバックなのでthisはrequest!
-               switch(this.readyState){
-                       case 0:
-                               //console.log("XMLHttpRequest created.");
-                               break;
-                       case 1:
-                               //console.log("open() called.");
-                               break;
-                       case 2:
-                               //console.log("Response header received.");
-                               break;
-                       case 3:
-                               //console.log("Response body receiving.");
-                               break;
-                       case 4:
-                               //console.log("send() compleated.");
-                               //console.log("status:" + this.status + ":" + this.statusText);
-                               if(this.status == 0){
-                                       console.log("Error");
-                               }else if((200 <= this.status && this.status < 300) || (this.status == 304)){
-                                       console.log("ACK");
-                               }else{
-                                       //console.log("NAK");
-                               }
-                               alert(this.responseText);
-                               break;
+       setBackgroundMusic: function(name){
+               if(this.backgroundMusic){
+                       //再生していたら止める
+                       this.backgroundMusic.pause();
+                       this.backgroundMusic = null;
                }
-       }
-}
-
-//
-//サブルーチン
-//
-
-function createCanvas(id, width, height, x, y, z, parent)
-{
-       //識別名idで
-       //width * heightの大きさのCanvasを
-       //(x,y,z)に生成する。
-       //parentには、Canvasタグを包含することになるDOMオブジェクトのidを指定する。
-       canvas = document.createElement("canvas");
-       parent = document.getElementById(parent);
-
-       canvas.id = id;
-
-       parent.appendChild(canvas);
-
-       canvas.style.position = "absolute";
-       canvas.style.top = y + "px";
-       canvas.style.left = x + "px";
-       canvas.style.zIndex = z;
-
-       canvas.width = width;
-       canvas.height = height;
-
-       return canvas;
-}
-
-function createCanvas(id, width, height, x, y, z, parent)
-{
-       //識別名idで
-       //width * heightの大きさのCanvasを
-       //(x,y,z)に生成する。
-       //parentには、Canvasタグを包含することになるDOMオブジェクトのidを指定する。
-       canvas = document.createElement("canvas");
-       parent = document.getElementById(parent);
-
-       canvas.id = id;
-
-       parent.appendChild(canvas);
-
-       canvas.style.position = "absolute";
-       canvas.style.top = y + "px";
-       canvas.style.left = x + "px";
-       canvas.style.zIndex = z;
-
-       canvas.width = width;
-       canvas.height = height;
-
-       return canvas;
-}
-
-function createDOMObject(typestr, idstr, parentidstr)
-{
-       dobj = document.createElement(typestr);
-       parentObj = document.getElementById(parentidstr);
-       
-       dobj.id = idstr;
-       parentObj.appendChild(dobj);
-       
-       return dobj;
-}
-
-function destroyDOMObjectByID(id)
-{
-       //識別名idのDOMオブジェクトを破棄する。
-       object = document.getElementById(id);
-       parentObj = object.parentNode;
-
-       parentObj.removeChild(object);
-}
-
-function removeObjectFromArray(anArray, anObject)
-{
-       //anArray中にある全てのanObjectを削除し、空いた部分は前につめる。
-       for(i = 0; i < anArray.length; i++){
-               if(anArray[i] == anObject){
-                       anArray.splice(i, 1);
+               if(name){
+                       //引数がnullでなければaudioオブジェクトを取得
+                       this.backgroundMusic = createAudio(name);
+                       if(this.backgroundMusic){
+                               //ループを設定して再生開始
+                               this.backgroundMusic.loop = true;
+                               this.backgroundMusic.play();
+                       }
                }
-       }
-}
+       },
+};
 
 //
 //イベントリスナー
 //
-//イベントリスナーにおけるthisは、イベントリスナーを登録したオブジェクトになり、通常とは異なるので注意。
-
-function keyDownEventListener(event)
-{
-       keyDownEventListener.manager.keyDown(event);
-}
-
-function keyUpEventListener(event)
-{
-       keyUpEventListener.manager.keyUp(event);
-       event.preventDefault();
-}
+//イベントリスナーにおけるthisは、イベントリスナーを登録したオブジェクトまたはwindowになり、通常とは異なるので注意。
 
 function timerTickEventListener(event)
 {
        timerTickEventListener.manager.timerTick(event);
 }
-
-function timeStampTimerTickEventListener(event)
-{
-       timerTickEventListener.manager.timeStampTimerTick(event);
-}
-
-//
-//Canvas直接描画関連
-//
-
-function drawText(gcontext, text, x, y)
-{
-       //背景をfillStyle
-       //前景をstrokeStyleで塗りつぶした文字列を描画する
-       //塗りつぶし高さは20px固定
-       //fillTextの座標は文字列の左下!
-       textsize = gcontext.measureText(text);
-       gcontext.fillRect(x, y, textsize.width, 20);
-       gcontext.save();
-       gcontext.fillStyle = gcontext.strokeStyle;
-       gcontext.fillText(text, x, y + 20 - 1);
-       gcontext.restore();
-}
-
-function drawArcDegree(gcontext, radius, startAngleDegree, endAngleDegree, x, y, anticlockwise)
-{
-       //半径radius, 中心座標(x,y)の円弧の、
-       //startAngleDegreeからendAngleDegreeまでの範囲を、
-       //(!anticlockwise)=時計回り
-       //(anticlockwise) =反時計回り
-       //に描画する。
-       //角度は度を利用する。
-       startAngleRadian = startAngleDegree * Math.PI / 180;
-       endAngleRadian = endAngleDegree * Math.PI / 180;
-       
-       gcontext.beginPath();
-       gcontext.arc(drawCoordinatesInInteger(x), drawCoordinatesInInteger(y), drawCoordinatesInInteger(radius), startAngleRadian, endAngleRadian, anticlockwise);
-       gcontext.fill();
-       gcontext.stroke();
-       gcontext.closePath();
-}
-
-function fillRect(gContext, x, y, w, h)
-{
-       gContext.fillRect(drawCoordinatesInInteger(x), drawCoordinatesInInteger(y), drawCoordinatesInInteger(w), drawCoordinatesInInteger(h));
-}
-
-function strokeRect(gContext, x, y, w, h)
-{
-       gContext.strokeRect(drawCoordinatesInInteger(x), drawCoordinatesInInteger(y), drawCoordinatesInInteger(w), drawCoordinatesInInteger(h));
-}
-
-function drawCoordinatesInInteger(coordinateElement)
-{
-       //from http://www.html5rocks.com/ja/tutorials/canvas/performance/
-       // With a bitwise or.
-       return ((0.5 + coordinateElement) | 0);
-}
-
-