//\8fÕ\93Ë\94»\92è\97pcanvas
this.collisionMapCanvas = null;
this.collisionMapContext = null;
-
//\94w\8ci\82Ì\89æ\91\9c\82Ìimg\83G\83\8c\83\81\83\93\83g\83I\83u\83W\83F\83N\83g\82ð\8ew\92è
this.background = null;
//\83\86\81[\83U\81[\82ª\91\80\8dì\82µ\82Ä\82¢\82é\83L\83\83\83\89\83N\83^\81[\83I\83u\83W\83F\83N\83g
this.userControlledCharacter = null;
-
//\83W\83\83\83\93\83v\82ª\83{\83^\83\93\89\9f\82µ\82½\8fu\8aÔ\82Ì\82Ý\82É\8eÀ\8ds\82³\82ê\82é\82½\82ß\82É\8am\94F\82·\82é\83t\83\89\83O
this.upArrowDown = false;
}
//\88È\89º\82Ì\8aÖ\90\94\82ð\83I\81[\83o\81[\83\89\83C\83h\82µ\82Ä\83X\83e\81[\83W\82ð\8dì\90¬\82·\82é\81B
keyDown: function(event){
//\83L\81[\93ü\97Í
-
},
keyUp: function(event){
//\83L\81[\93ü\97Í
},
timerTick: function(){
//\83^\83C\83}\81[
-
this.tickCount++;
- drawText(this.debugContext, "tick:" + this.tickCount, 0, 20);
-
//\91S\82Ä\82Ì\83I\83u\83W\83F\83N\83g\82ð\8cv\8eZ
for(var sp in this.stageObjectList)
{
var tickAllObjects = true;
-
- //\82Ü\82¸ \83N\83\89\83X\92è\8b`.tick() (\97á\82¦\82ÎBlockStageObjectClass.tick = function(){};) \82ª\92è\8b`\82³\82ê\82Ä\82½\82ç\8eÀ\8ds
+ //\82Ü\82¸\81A\83N\83\89\83X\92è\8b`.tick() (\97á\82¦\82ÎBlockStageObjectClass.tick = function(){};) \82ª\92è\8b`\82³\82ê\82Ä\82½\82ç\8eÀ\8ds
if(sp.tick)
{
tickAllObjects = sp.tick(this.stageObjectList[sp]);
}
-
//\8e\9f\82É\8ae\8eíStageObject\82Ìtick\82ð\8eÀ\8ds
if(tickAllObjects)
{
}
}
}
-
// \91\80\8dì\92\86\83L\83\83\83\89\82Ì\88Ú\93®\8f\88\97\9d
if(this.userControlledCharacter)
{
{
if(this.upArrowDown == false)
{
+ //\83W\83\83\83\93\83v
this.userControlledCharacter.jump();
this.upArrowDown = true;
}
} else{
this.upArrowDown = false;
}
-
if(!(this.manager.keyState.leftArrow && this.manager.keyState.rightArrow))
{
+ //\8d¶\89E
if(this.manager.keyState.leftArrow){
this.userControlledCharacter.goLeft();
}
}
}
}
-
- //\97á\82¦\82Î\8f\88\97\9d\82Ì\92x\89\84\82Å\96\9e\91«\82Édraw\82Å\82«\82È\82¢\82Æ\82«\82É\82Í\82µ\82å\82ê\82é\82æ\82¤draw\82Í\95Ê\8f\88\97\9d\82É\82µ\82½
-
},
draw: function(){
this.drawBackground();
this.drawAsPoint(0, 0);
},
drawAsPoint: function(x, y){
- //\82·\82×\82Ä\83I\83u\83W\83F\83N\83g\8dÄ\95`\89æ
+ //\82·\82×\82Ä\82Ì\83I\83u\83W\83F\83N\83g\82ð\8dÄ\95`\89æ
+ //x, y\82Í\95`\89æ\88Ê\92u\82Ì\83I\83t\83Z\83b\83g
for(var sp in this.stageObjectList)
{
- //\8e\9f\82É\8ae\8eíStageObject\82Ìdraw\82ð\8eÀ\8ds
+ //\8ae\8eíStageObject\82Ìdraw\82ð\8eÀ\8ds
for(i = 0, li = this.stageObjectList[sp].length; i < li; i++){
var stgobj = this.stageObjectList[sp][i];
var px = stgobj.origin.x - x, py = stgobj.origin.y - y;
this.stageObjectList = null;
},
addStageObject: function(aStageObject, isGlobalObject){
+ //stageObject\82ð\83\8a\83X\83g\82É\92Ç\89Á\82·\82é
//isGlobalObject:\83l\83b\83g\83\8f\81[\83N\8dX\90V\82ª\95K\97v\82È\8fê\8d\87true\82ð\93n\82·\81B\95s\97v\82È\8fê\8d\87\82Í\8fÈ\97ª\82Å\82«\82é\81B
+ //stageObjectList\82Í\83I\83u\83W\83F\83N\83g\82Ì\83N\83\89\83X\82²\82Æ\82Ì\98A\91z\94z\97ñ\82É\82È\82Á\82Ä\82¢\82é\81B
var sp = aStageObject.constructor;
if(this.stageObjectList[sp] == undefined)
{
}
},
removeStageObject: function(aStageObject){
+ //stageObject\82ð\83\8a\83X\83g\82©\82ç\8dí\8f\9c\82·\82é
var sp = aStageObject.constructor;
if(sp in this.stageObjectList)
{
removeObjectFromArray(this.stageObjectList[sp], aStageObject);
if(this.stageObjectList[sp].length == 0)
{
+ //\8bó\82É\82È\82Á\82½\83N\83\89\83X\82Ì\94z\97ñ\82Í\8dí\8f\9c\82·\82é
removeObjectFromArray(this.stageObjectList, sp);
}
}
+ //globalStageObjectList\82©\82ç\8dí\8f\9c\81B\91¶\8dÝ\82µ\82È\82¢\8fê\8d\87\82Í\89½\82à\8bN\82«\82È\82¢\82Ì\82Å\82±\82ê\82Å\91å\8fä\95v
removeObjectFromArray(this.globalStageObjectList, aStageObject);
},
eachStageObject: function(f){
+ //\83\8a\83X\83g\8fã\82Ì\82·\82×\82Ä\82Ì\83I\83u\83W\83F\83N\83g\88ê\82Â\82¸\82Â\82ð\88ø\90\94\82Æ\82µ\82Ä\8aÖ\90\94f\82ð\82»\82ê\82¼\82ê\8eÀ\8ds\82·\82é\81B
+ //\8aÖ\90\94f\82ªfalse\82ð\95Ô\82µ\82½\8fê\8d\87\81A\82»\82±\82Å\8eÀ\8ds\82ð\92\86\92f\82µ\82Äfalse\82ð\95Ô\82·\81B
for(var sp in this.stageObjectList)
{
for(i = 0; i < this.stageObjectList[sp].length; i++){
</div>
<div id="Resources">
</div>
+および
+mainManager = new GameManager();
が必要。
*/
//定数
//
-//var URL_PCD_Root = "http://localhost/pcd2013dev/www/";
+var URL_PCD_Root = "http://localhost/pcd2013dev/www/";
//var URL_PCD_Root = "http://192.168.6.242/pcd2013dev/www/";
//var URL_PCD_Root = "http://192.168.0.3/PCD2013GSCL/www/";
-var URL_PCD_Root = "http://192.168.6.242/pcd2013hikarupsp/pcd2013dev/www/";
+//var URL_PCD_Root = "http://192.168.6.242/pcd2013hikarupsp/pcd2013dev/www/";
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/";
var URL_PCD_Stage_Local = "stage/";
//
function GameManager(){
- //****コンストラクタ****
- //**インスタンス変数宣言・初期化**
//ユーザーID
this.userID = 0;
//ネットワークマネージャーの設定
//必要最低限のCanvasとコンテキストの設定
this.mainCanvas = createCanvas("MainCanvas", 640, 480, 0, 0, 1, "MainArea");
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.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;
//現在存在しているWidghetのリストを格納
this.keyState.downArrow = false;
this.keyState.leftArrow = false;
this.keyState.rightArrow = false;
-
- //ブラウザチェック
- this.checkBrowser();
-
- //**描画コンテキスト取得、設定・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;
window.setInterval(timeStampTimerTickEventListener, this.updateIntervalMs);
}
GameManager.prototype = {
- //****プロトタイプ宣言****
- //prototype以下のプロパティは、新規インスタンスに参照が引き継がれる。
keyDown: function(event){
- //****keyDown****
//コールバックではなくコールバック関数(keyDownEventListener)から呼び出されるので、thisはGameManagerのインスタンスとなる。
keyCode = event.keyCode;
switch(event.keyCode){
this.keyState.rightArrow = true;
break;
}
-
//実行中のステージに通知
if(this.runningStage){
this.runningStage.keyDown(event);
}
},
keyUp: function(event){
- //****keyUp****
//コールバックではなくコールバック関数(keyUpEventListener)から呼び出されるので、thisはGameManagerのインスタンスとなる。
keyCode = event.keyCode;
switch(event.keyCode){
}
},
timerTick: function(){
- //****timerTick****
+ //各オブジェクトの単位時間ごとの動作と再描画を行う
+ //単位時間ごとの動作
this.tickCount++;
-
- // アップデート処理
-
- if(this.runningStage){
- if(this.stagePausedFunction == null)
- {
+ if(this.stagePausedFunction == null){
+ //ポーズしていなければ更新処理
+ if(this.runningStage){
+ //ステージ
this.runningStage.timerTick();
}
- }
-
- // runningStage.timerTick() 内でpauseStage()された時、ここで再度判定しないとWidghetのtickが実行されてしまう
- if(this.stagePausedFunction == null)
- {
+ //ウィジェット
for(var i = 0; i < this.runningWidghets.length; i++){
var w = this.runningWidghets[i];
if(!w.tick()){
i--;
}
}
- }else
- {
+ } else{
+ //ポーズしているならば処理関数を実行
this.stagePausedFunction();
}
- // 描画処理
-
+ //描画処理
if(this.runningStage){
+ //ステージ
this.runningStage.draw();
}
-
+ //ウィジェット
for(var i = 0; i < this.runningWidghets.length; i++){
var w = this.runningWidghets[i];
w.draw();
}
},
timeStampTimerTick: function(){
+ //ネットワーク同期を司る
//サーバーとの同期カウンタ・タイマー
this.timeStamp += this.updateIntervalMs;
-
- //サーバーに追加情報をアップデート
- //update
+ //サーバーに更新情報をアップロード
if(this.userID != 0){
+ //ユーザーIDが設定されている=オンライン状態
request = this.networkManager.CreateRequestObject();
//同期モード
request.open('POST', URL_PCD_Root + "update.php?uid=" + this.userID + "&action=refresh", false);
aData.append(i, anObj.objectID + "," + anObj.origin.x + "," + anObj.origin.y + "," + anObj.movingSpeed.x + "," + anObj.movingSpeed.y+ "," + anObj.attribute);
}
}
-
+ //送信
this.networkManager.RequestObjectDisableCache(request);
request.send(aData.data);
-
+ //レスポンス確認
if(request.status == 0){
alert("ネットワークにアクセスできません。" + this.status + ":" + this.statusText);
}else if((200 <= request.status && request.status < 300) || (request.status == 304)){
this.runningWidghets.push(w);
},
runStage: function(stage){
- //****新たなステージを開始する****
+ //新たなステージを開始する
//実行中のステージがあれば終了処理を行わせる。
if(this.runningStage){
this.stopStage();
}
- //**新たに開始するステージの初期化**
+ //新たに開始するステージの初期化
//GameManager側の情報をGameStageに渡す。
stage.manager = this;
stage.mainCanvas = this.mainCanvas
stage.debugContext = this.debugContext
//GameStage側の初期化処理を行わせる。
stage.runStage();
- //サーバーに追加情報をアップデート
- //update
+ //サーバーに追加オブジェクトの情報をアップロード
if(this.userID != 0){
request = this.networkManager.CreateRequestObject();
//同期モード
anObj = stage.globalStageObjectList[i];
aData.append(i, anObj.origin.x.toString() + ":" + anObj.origin.y.toString() + ":" + anObj.movingSpeed.x.toString() + ":" + anObj.movingSpeed.y.toString() + ":" + anObj.className + ":" + parseArrayToStringSource(anObj.attribute) + ":" + parseArrayToStringSource(anObj.constructorArgs));
}
-
+ //送信
this.networkManager.RequestObjectDisableCache(request);
request.send(aData.data);
-
+ //レスポンス確認
if(request.status == 0){
alert("ネットワークにアクセスできません。" + this.status + ":" + this.statusText);
}else if((200 <= request.status && request.status < 300) || (request.status == 304)){
if(isValidResponseText(res)){
var retArray = eval(res);
this.timeStamp = retArray[0];
+ //割り当てられたobjectIDを設定する
for(var i = 0; i < stage.globalStageObjectList.length; i++){
stage.globalStageObjectList[i].objectID = retArray[1][i];
}
+ //すでにステージ上にある他のユーザーのオブジェクトを追加する
for(var i = 0; i < retArray[2].length; i++){
var anArray = retArray[2][i];
var args = eval(anArray[7]);
},
pauseStage: function(func){
//ステージの実行を一時停止する。一時停止中、funcに指定された関数が毎tick毎に呼ばれる
- if(this.stagePausedFunction == null)
- {
+ if(this.stagePausedFunction == null){
this.stagePausedFunction = func;
return true;
- }else
- {
+ } else{
//ステージが一時停止中のfunc()の中から二重にpauseStage()を呼んではいけない
return false;
}
},
resumeStage: function(){
- if(this.stagePausedFunction != null)
- {
+ //ステージの実行を再開する
+ if(this.stagePausedFunction != null) {
//必ずpauseStage()の引数に指定したfunc()の中から呼ばれる・・・はず。
this.stagePausedFunction = null;
return true;
- }else
- {
+ } 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側の終了処理を行わせる。
}
},
loadStageFromLocal: function(code, onLoaded){
- var ____stage = eval(code);
- mainManager.runStage(____stage);
+ var stage = eval(code);
+ mainManager.runStage(stage);
},
loadStageFromNetwork: function(name){
- //urlに存在するjavascriptファイルを利用してステージを作成する。
+ //URL_PCD_Stage/name.jsを利用してステージを作成する。
request = this.networkManager.CreateRequestObject();
//同期モード
request.open('GET', URL_PCD_Stage + name + ".js", false);
}
},
debugOut: function(str){
- if(!/*@cc_on!@*/false)
+ 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;
}
},
- checkBrowser: function(){
+ isAvailableBrowser: function(){
+ //ブラウザの判別を行う。実行不可能な場合はfalseを返す。
//http://d.hatena.ne.jp/Naotsugu/20110927/1317140891
var userAgent = window.navigator.userAgent.toLowerCase();
var appVersion = window.navigator.appVersion.toLowerCase();
} else{
this.debugOut("Browser:IE?\n");
}
+ this.isIE = true;
} else if (userAgent.indexOf('chrome') != -1) {
//chrome
this.debugOut("Browser:Chrome\n");
//unknown
this.debugOut("Browser:Unknown\n");
}
- this.debugOut(userAgent + "::" + appVersion + "\n");
+ //this.debugOut(userAgent + "::" + appVersion + "\n");
+ //描画コンテキストからHTML5対応チェック
+ if(!this.mainCanvas || !this.mainCanvas.getContext){
+ //HTML5未対応の場合
+ alert("このゲームを遊ぶためには、HTML5に対応しているブラウザ(Google Chrome等)でアクセスしてください...。");
+ return false;
+ }
+ return true;
},
};
}
-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
+ //from http://hakuhin.jp/js/xmlhttprequest.html
CreateRequestObject: function(){
var rq = null;
// XMLHttpRequest
}
function RequestData(){
+ //FormDataがIEで動かないので代替
this.data = "";
}
RequestData.prototype = {
}
}
-//
-//サブルーチン
-//
+function createAudioElement(name)
+{
+ //mp3限定
+ //not implemented
+ var at = document.createElement("audio");
+ var src = document.createElement("source");
+ src.type = "audio/mp3";
+}
function createCanvas(id, width, height, x, y, z, parent)
{
function isValidResponseText(res)
{
+ //phpからのレスポンスにエラーが含まれていないかをチェックする。
if(res.indexOf("Warning") == -1){
if(res.indexOf("error") == -1){
return true;
//
//イベントリスナー
//
-//イベントリスナーにおけるthisは、イベントリスナーを登録したオブジェクトになり、通常とは異なるので注意。
+//ã\82¤ã\83\99ã\83³ã\83\88ã\83ªã\82¹ã\83\8aã\83¼ã\81«ã\81\8aã\81\91ã\82\8bthisã\81¯ã\80\81ã\82¤ã\83\99ã\83³ã\83\88ã\83ªã\82¹ã\83\8aã\83¼ã\82\92ç\99»é\8c²ã\81\97ã\81\9fã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81¾ã\81\9fã\81¯windowã\81«ã\81ªã\82\8aã\80\81é\80\9a常ã\81¨ã\81¯ç\95°ã\81ªã\82\8bã\81®ã\81§æ³¨æ\84\8fã\80\82
function keyDownEventListener(event)
{
//Canvas直接描画関連
//
+//フォント設定方法
+//context.font = "normal 20px sans-serif";
+
+//色設定方法
+//context.fillStyle = "rgba(200,255,200,0.5)";
+//context.strokeStyle = "rgba(0, 0, 0, 0.5)";
+
function drawText(gcontext, text, x, y)
{
//背景をfillStyle