OSDN Git Service

当たり判定関連リニューアルの続き。
author西田 耀 <hikarupsp@users.sourceforge.jp>
Sat, 24 Aug 2013 19:01:09 +0000 (04:01 +0900)
committer西田 耀 <hikarupsp@users.sourceforge.jp>
Sat, 24 Aug 2013 19:01:09 +0000 (04:01 +0900)
www/corelib/classes/CharacterClass.js
www/corelib/classes/EnemyCharacterClass.js
www/corelib/classes/FreeItemClass.js
www/corelib/classes/GameStageClass.js
www/corelib/classes/HiddenBlockClass.js
www/corelib/classes/ItemClass.js
www/corelib/classes/MovableStageObjectClass.js
www/corelib/classes/OperatedCharacterClass.js
www/corelib/classes/SlopeBlockClass.js
www/corelib/classes/StageObjectClass.js

index e0e960e..318bb69 100644 (file)
@@ -83,6 +83,11 @@ var CharacterClass = function(ownerStage, args)
                                this.lastImage = null;
                        }
                }
+               if(this.movingSpeed.x < -this.hysteresis){
+                       this.direction = 0;
+               } else if(this.movingSpeed.x > this.hysteresis){
+                       this.direction = 1;
+               }
        }
 });
 
index 0b68ff4..9026582 100644 (file)
@@ -26,6 +26,7 @@ var EnemyCharacterClass = function(stage, args){
        className: "EnemyCharacterClass",
        tick : function()
        {
+               //追跡処理
                var main = this.ownerStage.userControlledCharacter;
                var distX = main.origin.x - this.origin.x;
                if(this.chasing && Math.abs(distX) <= this.chasingRange && Math.abs(this.origin.y - main.origin.y) <= this.chasingRange){
@@ -35,6 +36,32 @@ var EnemyCharacterClass = function(stage, args){
                                this.goLeft();
                        }
                }
+               //ダメージの開始・終了処理
+               if(this.collidingDirection & CollideTop){
+                       if(!this.hurting){
+                               //自分自身のダメージ有効
+                               this.hurting = true;
+                               this.hurtPerTickCount = this.hurtPerTickBase;
+                       }
+                       //if(this.damaging){
+                       //      //メインキャラクタへのダメージ無効
+                       //      this.damaging = false;
+                       //}
+               } else{
+                       if(this.hurting){
+                               //自分自身のダメージ無効
+                               this.hurting = false;
+                       }
+                       if(this.collidingDirection & (CollideLeft | CollideRight)){
+                               //if(!this.damaging){
+                               //      //メインキャラクタへのダメージ有効
+                               //      this.damaging = true;
+                               //      this.damagePerTickCount = this.damagePerTickBase;
+                               //}
+                       }
+               }
+               
+               //メインキャラへのダメージ
                if(this.damaging){
                        if(this.damagePerTickCount == this.damagePerTickBase){
                                this.ownerStage.manager.userManager.damage(this.touchDamage);
@@ -46,6 +73,7 @@ var EnemyCharacterClass = function(stage, args){
                                }
                        }
                }
+               //自分自身のダメージ
                if(this.hurting){
                        if(this.hurtPerTickCount == this.hurtPerTickBase){
                                this.HP -= this.hurt;
@@ -60,7 +88,7 @@ var EnemyCharacterClass = function(stage, args){
                                }
                        }
                }
-               
+               //落下後の死亡処理
                if(this.origin.y > 1000)
                {
                        this.ownerStage.removeStageObject(this);
@@ -77,61 +105,4 @@ var EnemyCharacterClass = function(stage, args){
                drawText(this.ownerStage.mainContext, this.HP, x, y - 20);
                this.ownerStage.mainContext.restore();
        },
-       judgeCollideRange: function(x1, y1, x2, y2, obj){
-               //objは範囲の対象となるオブジェクトのインスタンス。省略可能
-               // 1 - - +
-               // |     |
-               // |     |
-               // + - - 2
-               var retv = OperatedCharacterClass.prototype.judgeCollideRange.apply(this, arguments);
-               if(obj == this.ownerStage.userControlledCharacter){
-                       if(retv){
-                               var cd = this.judgeCollideRange_getDirection(x1, y1, x2, y2);
-                               if(cd & CollideTop){
-                                       this.hurting = true;
-                                       var tickCount = this.ownerStage.manager.tickCount;
-                                       this.hurtLastTick = tickCount;
-                               } else{
-                                       this.hurting = false;
-                                       this.hurtPerTickCount = this.hurtPerTickBase;
-                               }
-                       } else{
-                               if(this.hurting){
-                                       this.hurting = false;
-                                       this.hurtPerTickCount = this.hurtPerTickBase;
-                               }
-                       }
-               }
-               return retv;
-       },
-       isCollided : function(obj, x, y)
-       {
-               //MovableStageObjectが(x, y)のとき相手のobjと衝突するか判定
-               var retv = OperatedCharacterClass.prototype.isCollided.apply(this, arguments);
-               if(obj == this.ownerStage.userControlledCharacter){
-                       var tickCount = this.ownerStage.manager.tickCount;
-                       if(retv){
-                               if((this.collideFlag & 8) != 0){
-                                       //上から衝突された場合は自分がダメージを受ける
-                                       //this.hurting = true;
-                                       //this.hurtLastTick = tickCount;
-                               } else{
-                                       //それ以外の場合はメインキャラにダメージを与える
-                                       this.damaging = true;
-                                       this.damageLastTick = tickCount;
-                               }
-                       } else{
-                               if(this.damaging && tickCount > (this.damageLastTick + 5)){
-                                       this.damaging = false;
-                                       this.damagePerTickCount = this.damagePerTickBase;
-                               }
-                               //if(this.hurting && tickCount > (this.hurtLastTick + 5)){
-                               //      this.hurting = false;
-                               //      this.hurtPerTickCount = this.hurtPerTickBase;
-                               //}
-                       }
-               }
-               return retv
-       },
-       
 });
index fb1a51c..437c3f9 100644 (file)
@@ -49,25 +49,12 @@ var FreeItemClass = function(stage, args){
                this.ownerStage.collisionMapContext.restore();
        },
        tick: function(){
-               if(this.isCollided)
-               {
-                       for(var i = 0; i < this.collidedList.length; i++)
-                       {
-                               var character = this.collidedList[i];
-                               if(character.isCollided(this, character.origin.x, character.origin.y))
-                               {
-                                       //\8c»\8dÝ\8fÕ\93Ë\92\86\82Ì\83L\83\83\83\89\82ð\8c©\82Â\82¯\82½
-                                       return;
-                               }
-                       }
-                       
-                       //\8fÕ\93Ë\92\86\82Ì\83L\83\83\83\89\82ª\82¢\82È\82¢
-                       this.isCollided = false;
-                       this.collidedList = [];
-               }
+               this.checkCollidingDirection();
        },
+       /*
        itemAttacked : function(obj, obj_x, obj_y)
        {
+               
                var tickCount = this.ownerStage.manager.tickCount;
                if(!this.isCollided)
                {
@@ -106,4 +93,5 @@ var FreeItemClass = function(stage, args){
                this.collidedList.push(obj);
                
        }
+       */
 });
\ No newline at end of file
index f3cdf62..ebf39a3 100644 (file)
@@ -16,6 +16,7 @@ function GameStage(){
        this.debugContext = null;
        //StageObject\82Ì\83\8a\83X\83g
        this.stageObjectList = new Array();
+       this.stageObjectLinearList = new Array();
        this.globalStageObjectList = new Array();
        //\8fÕ\93Ë\94»\92è\97pcanvas
        this.collisionMapCanvas = null;
@@ -133,6 +134,7 @@ GameStage.prototype = {
                this.collisionMapCanvas = null;
                this.collisionMapContext = null;
                this.stageObjectList = new Array();
+               this.stageObjectLinearList = new Array();
                this.globalStageObjectList = new Array();
        },
        addStageObject: function(aStageObject, isGlobalObject){
@@ -145,6 +147,7 @@ GameStage.prototype = {
                        this.stageObjectList[sp] = [];
                }
                this.stageObjectList[sp].push(aStageObject);
+               this.stageObjectLinearList.push(aStageObject);
                if(isGlobalObject){
                        this.globalStageObjectList.push(aStageObject);
                }
@@ -161,6 +164,7 @@ GameStage.prototype = {
                                removeObjectFromArray(this.stageObjectList, sp);
                        }
                }
+               removeObjectFromArray(this.stageObjectLinearList, aStageObject);
                //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);
        },
index f404685..cb211bf 100644 (file)
@@ -7,40 +7,23 @@ var HiddenBlockClass = function(ownerStage, args)
        this.image0 = img;
        //画像はなし
        this.image = null;
-       this.phantomFlag = 0;
        
        this.debugMode = true;
+       
+       this.isPhantom = true;
 }.extend(BlockClass, {
-       judgeCollideRange: function(x1, y1, x2, y2, obj){
-               //objは範囲の対象となるオブジェクトのインスタンス。省略可能
-               // 1 - - +
-               // |     |
-               // |     |
-               // + - - 2
-               var retv = BlockClass.prototype.judgeCollideRange.apply(this, arguments);
-               if(retv){
-                       var cd = this.judgeCollideRange_getDirection(x1, y1, x2, y2);
-                       if(this.phantomFlag || (cd & CollideTop)){
-                               //上から当たった場合はなかったことにする
-                               retv = false;
-                               this.phantomFlag = 2;
-                       } else if(obj == this.ownerStage.userControlledCharacter && (obj.origin.y >= this.origin.y + this.size.y - 1)){
-                               //下から当たっていたら画像を表示させて、さらにこの関数をベースクラスのものに戻す。
-                               this.image = this.image0;
-                               this.judgeCollideRange = BlockClass.prototype.judgeCollideRange;
-                               this.debugDraw = BlockClass.prototype.debugDraw;
-                       } else{
-                               retv = false;
-                       }
-               } else{
-                       if(obj == this.ownerStage.userControlledCharacter){
-                               if(this.phantomFlag > 0){
-                                       this.phantomFlag--;
-                               }
-                       }
+       tick : function()
+       {
+               this.checkCollidingDirection();
+               if((this.collidingDirection & CollideLeft) && !(this.collidingDirection & CollideBody) && !(this.collidingDirection & CollideTop)){
+                       //左下から当たっていたら画像を表示させて、さらにこの関数をベースクラスのものに戻す。
+                       this.isPhantom = false;
+                       this.image = this.image0;
+                       this.judgeCollideRange = BlockClass.prototype.judgeCollideRange;
+                       this.debugDraw = BlockClass.prototype.debugDraw;
                }
-               return retv;
        },
+       
        debugDraw: function(x, y){
                //衝突マップに描画
                this.ownerStage.collisionMapContext.save();
index 64bcff5..35efb74 100644 (file)
@@ -14,14 +14,6 @@ var ItemClass = function(ownerStage, args)
        tick: function(){
        
        },
-       
-       //\83u\83\8d\83b\83N\82Ì\93\96\82½\82è\94»\92è\97Ì\88æ\82ð\95Ï\8dX\82·\82é\82½\82ß\82É\82Í\82±\82Ì\8aÖ\90\94\82ð\83I\81[\83o\81[\83\89\83C\83h\82·\82é
-       //\88ø\90\94\82É\82Í\81A\93\96\82½\82è\82ð\8am\82©\82ß\82é\97v\91f\82Ì\93\96\82½\82è\94»\92è\97Ì\88æ\82Ì 1:\8d\8fã\8b÷ 2: \89E\89º\8b÷\82Ì\8dÀ\95W\82ð\8ew\92è
-       //MovableStageObject.isCollided\82©\82ç\8cÄ\82Î\82ê\82é
-       judgeCollideRange: function(x1, y1, x2, y2){
-               return x2 >= this.origin.x && x1 < this.origin.x + this.size.x && y2 >= this.origin.y && y1 < this.origin.y + this.size.y;
-       },
-       
        itemAttacked : function(obj, obj_x, obj_y){
                //\82±\82Ì\8f\88\97\9d\82ð\8eq\83N\83\89\83X\82Å\8fã\8f\91\82«\82µ\82Ä\83A\83C\83e\83\80\82Ì\93®\8dì\82ð\92è\8b`\82·\82é
                //obj : \82±\82Ì\83A\83C\83e\83\80\82É\90G\82Á\82½\90l(MainCharacter\82È\82Ç)
index 217930b..045aa13 100644 (file)
@@ -33,15 +33,15 @@ var MovableStageObjectClass = function(stage, args)
                } else{
                        this.movingSpeed.x = 0;
                }
-               
                //\8fd\97Í
                this.movingSpeed.y += this.gravity / this.ownerStage.manager.tickPerSecond;
-
-               //\89^\93®\8f\88\97\9d (collideFlag\82Í\8fÕ\93Ë\82µ\82½\8dÛ\81A\82»\82Ì\95û\8cü(\95¡\90\94\89Â)\82ð\8e¦\82·\83t\83\89\83O\82Å\82 \82é\81BOperatedCharacterClass\82Å\83W\83\83\83\93\83v\94­\93®\8e\9e\82Ì\90Ú\92n\8am\94F\82È\82Ç\82É\8eg\82í\82ê\82é)
+               //\89^\93®\8f\88\97\9d
                this.moveTo(
                        this.origin.x + (this.movingSpeed.x / this.ownerStage.manager.tickPerSecond),
                        this.origin.y + (this.movingSpeed.y / this.ownerStage.manager.tickPerSecond)
                );
+               //\8eæ\93¾
+               this.checkCollidingDirection();
                
                //\8fÕ\93Ë\8e\9e\82Ì\89^\93®\83G\83l\83\8b\83M\81[\8fÁ\96Å\90Ý\92è
                //if((this.collidingDirection & CollideRight) != 0 && this.movingSpeed.x > 0) this.movingSpeed.x = 0;   //\89E\95û\8cü\82É\8fÕ\93Ë
@@ -53,63 +53,65 @@ var MovableStageObjectClass = function(stage, args)
        canMoveTo: function(x, y){
                //\82·\82×\82Ä\82Ì\83I\83u\83W\83F\83N\83g\82É\91Î\82µ\82Ä(x, y)\82É\82 \82é\82Æ\82«\82Ì\8e©\95ª\82Ì\8fÕ\93Ë\8fó\91Ô\82ð\92²\82×\82é\81B
                var retv = false;
-               for(var sp in this.ownerStage.stageObjectList){
-                       for(var i = 0; i < this.ownerStage.stageObjectList[sp].length; i++){
-                               var f = this.ownerStage.stageObjectList[sp][i];
-                               if(f !== this){
-                                       //\8e©\95ª\82Å\82È\82¢
-                                       if(f.isOverlappedWithLocatedObject(this, x, y)){
-                                               //\8fÕ\93Ë\90æf\82Ì\8fÕ\93Ë\94Í\88Í\93à\82É\82¢\82é
-                                               if(f.isPhantom){
-                                                       //\8fÕ\93Ë\90æf\82ª\8fÕ\93Ë\94»\92è\96³\8e\8b\82¾\82Á\82½\82ç\81A\8fÕ\93Ë\82Í\82µ\82È\82¢
-                                                       /*
-                                                       if(this.isItemCollector){
-                                                               //\8fÕ\93Ë\90æf\82ð\8eæ\93¾\82µ\82½\83A\83C\83e\83\80\82É\89Á\82¦\82é\81B
-                                                               for(var titem in items){
-                                                                       //\95¡\90\94\92Ç\89Á\82Ì\96h\8e~
-                                                                       if(titem == f){
-                                                                               continue;
-                                                                       }
+               var d = this.ownerStage.stageObjectLinearList;
+               for(var i = 0, i_max = d.length; i < i_max; i++){
+                       var f = d[i];
+                       if(f !== this){
+                               //\8e©\95ª\82Å\82È\82¢
+                               if(f.isOverlappedWithLocatedObject(this, x, y)){
+                                       //\8fÕ\93Ë\90æf\82Ì\8fÕ\93Ë\94Í\88Í\93à\82É\82¢\82é
+                                       if(f.isPhantom){
+                                               //\8fÕ\93Ë\90æf\82ª\8fÕ\93Ë\94»\92è\96³\8e\8b\82¾\82Á\82½\82ç\81A\8fÕ\93Ë\82Í\82µ\82È\82¢
+                                               /*
+                                               if(this.isItemCollector){
+                                                       //\8fÕ\93Ë\90æf\82ð\8eæ\93¾\82µ\82½\83A\83C\83e\83\80\82É\89Á\82¦\82é\81B
+                                                       for(var titem in items){
+                                                               //\95¡\90\94\92Ç\89Á\82Ì\96h\8e~
+                                                               if(titem == f){
+                                                                       continue;
                                                                }
-                                                               items.push(f);
                                                        }
-                                                       */
-                                                       
-                                               } else{
-                                                       //\8fÕ\93Ë\82µ\82½
-                                                       retv = true;
-                                                       break;
+                                                       items.push(f);
                                                }
+                                               */
+                                               
+                                       } else{
+                                               //\8fÕ\93Ë\82µ\82½
+                                               retv = true;
+                                               break;
                                        }
                                }
                        }
-                       if(retv){
-                               break;
-                       }
                }
-               
                return retv;
        },
        moveTo : function(x, y) {
                //\8c»\8dÝ\82Ì\8dÀ\95W\82©\82ç(x,y)\82É\8cü\82¯\82Ä\81A\88Ú\93®\82Å\82«\82é\82¾\82¯\88Ú\93®\82·\82é\81B
                //\8fÕ\93Ë\95û\8cü\83t\83\89\83O\82à\90Ý\92è\82·\82é\81B
-               var sx = this.origin.x, sy = this.origin.y;
+               var sx = this.origin.x
+               var sy = this.origin.y;
                var lx = x - sx
                var ly = y - sy;
                //\88Ú\93®\8b\97\97£\82ð\82Ç\82¿\82ç\82©\88ê\8e²\82Å\82Í\82©\82é
                var ct = Math.max(Math.abs(lx), Math.abs(ly));
-               //\82»\82ê\82ð\8aî\8f\80\82É\82µ\82½\88ê\92P\88Ê\93\96\82½\82è\82Ì\88Ú\93®\97Ê
-               var dx = lx / ct;
-               var dy = ly / ct;
+               if(ct < 2){
+                       ct = 1
+                       var dx = lx;
+                       var dy = ly;
+               } else{
+                       //\82»\82ê\82ð\8aî\8f\80\82É\82µ\82½\88ê\92P\88Ê\93\96\82½\82è\82Ì\88Ú\93®\97Ê
+                       var dx = lx / ct;
+                       var dy = ly / ct;
+               }
                //\88Ú\93®\82µ\82È\82¢\8e²\82ª\82 \82é\82©\82Ç\82¤\82©\81i\8d\82\91¬\89»\81H\81j
                var fx = (dx == 0);
                var fy = (dy == 0);
                //\8eÀ\8dÛ\82É\88Ú\93®\82·\82é\90æ\82Ì\8dÀ\95W
                var ex = sx;
                var ey = sy;
-               //\8eæ\93¾\82µ\82½\83A\83C\83e\83\80\82Ì\83\8a\83X\83g
-               //var gotItems = [];
+               //\92i\8d·\82ð\8fæ\82è\89z\82¦\82é\8cW\90\94
                var c = Math.abs(this.caterpillar * dx);
+               //
                if(!(fx && fy)){
                        for(var i = 0; i < ct; i++){
                                if(!fx && this.canMoveTo(ex + dx, ey)){
@@ -117,7 +119,6 @@ var MovableStageObjectClass = function(stage, args)
                                        if(c != 0 && this.canMoveTo(ex + dx, ey - c)){
                                                //\82»\82ê\82Å\82àx\8e²\82ª\8fÕ\93Ë\82µ\82½\82Ì\82Å\88Ú\93®\82ð\92â\8e~\82µ\83t\83\89\83O\82ð\83Z\83b\83g\82·\82é
                                                fx = true;
-                                               //collideDirection |= (dx > 0 ? 1 : 2);
                                        } else{
                                                //\8d\82\82³\82ð\95Ï\82¦\82ê\82Î\88Ú\93®\82Å\82«\82é\82Ì\82Å\8d\82\82³\82ð\95Ï\82¦\82Ä\8cp\91±\82·\82é
                                                ey -= c;
@@ -126,7 +127,6 @@ var MovableStageObjectClass = function(stage, args)
                                if(!fy && this.canMoveTo(ex, ey + dy)){
                                        //y\8e²\82ª\8fÕ\93Ë\82µ\82½\82Ì\82Å\88Ú\93®\82ð\92â\8e~\82µ\83t\83\89\83O\82ð\83Z\83b\83g\82·\82é
                                        fy = true;
-                                       //collideDirection |= (dy > 0 ? 4 : 8);
                                }
                                if(!fx){
                                        ex += dx;
@@ -143,9 +143,6 @@ var MovableStageObjectClass = function(stage, args)
                this.origin.x = ex;
                this.origin.y = ey;
                
-               //\8fÕ\93Ë\95û\8cü\94»\92è
-               this.checkCollidingDirection();
-               
                /*
                for(var i in gotItems){
                        var item = gotItems[i];
index a20dbc8..c2d24b2 100644 (file)
@@ -22,14 +22,12 @@ var OperatedCharacterClass = function(ownerStage, args){
        // \92Ê\8fí\8d\82É\90i\82Þ\82Æ\82«\82É\8cÄ\82Î\82ê\82é\81B\8d\83L\81[\82ð\89\9f\82µ\82Ä\82¢\82é\8aÔ\92\86tick\96\88\82É\8cÄ\82Î\82ê\82é
        goLeft : function(){
                this.imageState = 0;
-               this.direction = 0;
                this.movingSpeed.x += ((-this.movingVelocity) - this.movingSpeed.x) / 3;
        },
        
        //\92Ê\8fí\89E\82É\90i\82Þ\82Æ\82«\82É\8cÄ\82Î\82ê\82é\81B
        goRight : function(){
                this.imageState = 0;
-               this.direction = 1;
                this.movingSpeed.x += (this.movingVelocity - this.movingSpeed.x) / 3;
        },
        
index f742f9c..5c1c6c0 100644 (file)
@@ -47,8 +47,7 @@ var SlopeBlockClass = function(ownerStage, args)
        //\8dÀ\95W p1,p2 \82ð\8c\8b\82Ô\90ü\95ª\82Æ\8dÀ\95W q1,q2 \82ð\8c\8b\82Ô\90ü\95ª\82ª\8cð\8d·\82µ\82Ä\82¢\82é\82©\82ð\92²\82×\82é
        //\82½\82¾\82µ\81A\90ü\95ª\82ª\8fd\82È\82Á\82Ä\82¢\82é\8fê\8d\87(3\93_,4\93_\82ª\88ê\92¼\90ü\8fã\82É\82 \82é)\81A\81u\8cð\8d·\82µ\82Ä\82¢\82é\81v\81A\82Æ\94»\92è\82µ\82Ü\82·\81B
        crossLineJudge: function(p1x, p1y, p2x, p2y, q1x, q1y, q2x, q2y){
-               if(p1x >= p2x)
-               {
+               if(p1x >= p2x){
                        if((p1x < q1x && p1x < q2x) || (p2x > q1x && p2x > q2x)){
                                return false;
                        }
@@ -57,8 +56,7 @@ var SlopeBlockClass = function(ownerStage, args)
                                return false;
                        }
                }
-               if(p1y >= p2y)
-               {
+               if(p1y >= p2y){
                        if((p1y < q1y && p1y < q2y) || (p2y > q1y && p2y > q2y)){
                                return false;
                        }
index e7c93dc..8399f53 100644 (file)
@@ -19,12 +19,13 @@ function StageObject(ownerStage, args){
        this.extObjectId = 0;
        
        this.isPhantom = false;
-       this.collidingDirectionCheckEnabled = false;
        //\93\96\82½\82è\94»\92è\82Ì\83}\81[\83W\83\93\82Ì\8ew\92è
        this.collisionMargin = new OffsetBox(0, 0, 0, 0);
        this.collidingRange  = 4;
-       //\8fÕ\93Ë\95û\8cü\83t\83\89\83O\82Í\81A\88Ú\93®\82·\82é\83I\83u\83W\83F\83N\83g\82È\82ç\88Ú\93®\8e\9e\82É\81A\82»\82ê\88È\8aO\82Ì\83I\83u\83W\83F\83N\83g\82ÅcollidingDirectionCheckEnabled==true\82Ì\82à\82Ì\82Í\81A\83X\83e\81[\83W\91¤\82Å\92è\8aú\93I\82É\83`\83F\83b\83N\82ð\82©\82¯\82Ä\90Ý\92è\82µ\82Ü\82·\81B
+       //\8fÕ\93Ë\95û\8cü\83t\83\89\83O\82Í\81A\88Ú\93®\82·\82é\83I\83u\83W\83F\83N\83g\82È\82ç\88Ú\93®\8e\9e\82É\92è\8aú\93I\82É\83`\83F\83b\83N\82ð\82©\82¯\82Ä\90Ý\92è\82µ\82Ü\82·\81B
+       //\82»\82ê\88È\8aO\82Ì\8fê\8d\87\82Í\94C\88Ó\82Ì\83^\83C\83~\83\93\83O\82ÅcheckCollidingDirection\82ð\8cÄ\82Ñ\8fo\82·\82×\82µ\81B
        this.collidingDirection = 0;
+       this.collidedObjects = new Array();
 }
 StageObject.prototype = {
        className:"StageObject",
@@ -35,25 +36,27 @@ StageObject.prototype = {
                //\8eÀ\8dÛ\82Ì\95`\89æ\82Ì\82Ý\82ð\8ds\82¤\81B\8cv\8eZ\82Ítick\82Å\8ds\82¤\81B
                //\83\86\81[\83U\81[\96¼\82ð\95\\8e¦
                if(this.ownerUID != 0){
-                       this.ownerStage.mainContext.save();
-                       this.ownerStage.mainContext.fillStyle = "rgba(255,255,255,0.5)";
-                       this.ownerStage.mainContext.strokeStyle = "rgba(0, 0, 0, 1)";
-                       this.ownerStage.mainContext.font = "normal 12px sans-serif";
-                       drawText(this.ownerStage.mainContext, this.ownerStage.manager.userManager.getUserNameByUID(this.ownerUID), x, y - 20);
-                       this.ownerStage.mainContext.restore();
+                       var c = this.ownerStage.mainContext;
+                       c.save();
+                       c.fillStyle = "rgba(255,255,255,0.5)";
+                       c.strokeStyle = "rgba(0, 0, 0, 1)";
+                       c.font = "normal 12px sans-serif";
+                       drawText(c, this.ownerStage.manager.userManager.getUserNameByUID(this.ownerUID), x, y - 20);
+                       c.restore();
                }
        },
        debugDraw: function(x, y){
                //\8fÕ\93Ë\83}\83b\83v\82É\95`\89æ
-               this.ownerStage.collisionMapContext.save();
-               this.ownerStage.collisionMapContext.beginPath();
-               this.ownerStage.collisionMapContext.moveTo(x + this.collisionMargin.left, y + this.collisionMargin.top);
-               this.ownerStage.collisionMapContext.lineTo(x + this.collisionMargin.left, y + this.size.y - this.collisionMargin.bottom);
-               this.ownerStage.collisionMapContext.lineTo(x + this.size.x - this.collisionMargin.right, y + this.size.y - this.collisionMargin.bottom);
-               this.ownerStage.collisionMapContext.lineTo(x + this.size.x - this.collisionMargin.right, y + this.collisionMargin.top);
-               this.ownerStage.collisionMapContext.closePath();
-               this.ownerStage.collisionMapContext.stroke();
-               this.ownerStage.collisionMapContext.restore();
+               var c = this.ownerStage.collisionMapContext;
+               c.save();
+               c.beginPath();
+               c.moveTo(x + this.collisionMargin.left, y + this.collisionMargin.top);
+               c.lineTo(x + this.collisionMargin.left, y + this.size.y - this.collisionMargin.bottom);
+               c.lineTo(x + this.size.x - this.collisionMargin.right, y + this.size.y - this.collisionMargin.bottom);
+               c.lineTo(x + this.size.x - this.collisionMargin.right, y + this.collisionMargin.top);
+               c.closePath();
+               c.stroke();
+               c.restore();
        },
        bindAttribute: function(attr)
        {
@@ -79,10 +82,10 @@ StageObject.prototype = {
                //\83I\83u\83W\83F\83N\83g\96{\91Ì\95\94\95ª\82É\8fd\82È\82é\82©\82Ç\82¤\82©\82ð\92²\82×\82é
                //\82±\82Ì\8aÖ\90\94\82ªfalse\82ð\95Ô\82µ\82½\8e\9e\82Ì\88ø\90\94\82Ì\94Í\88Í\82Ö\82Í\83I\83u\83W\83F\83N\83g\82ª\88Ú\93®\82Å\82«\82é\81B
                //true\82©\82ÂisPhantom==false\82Ì\8e\9e\82Í\8fÕ\93Ë\82·\82é\81B
-               return (x2 > (this.origin.x + this.collisionMargin.left)) &&
-                       (x1 <= (this.origin.x + this.size.x - this.collisionMargin.right)) &&
-                       (y2 > (this.origin.y + this.collisionMargin.top)) &&
-                       (y1 <= (this.origin.y + this.size.y - this.collisionMargin.bottom));
+               var o = this.origin;
+               var c = this.collisionMargin;
+               var s = this.size;
+               return (x2 > (o.x + c.left)) && (x1 <= (o.x + s.x - c.right)) && (y2 > (o.y + c.top)) && (y1 <= (o.y + s.y - c.bottom));
        },
        isOverlappedWithLocatedObject: function(obj, x, y){
                //(x, y)\82Éobj\82ª\82 \82é\82Æ\82«\82Ì\83I\83u\83W\83F\83N\83g\96{\91Ì\94Í\88Í\82É\81A\8e©\95ª\82Ì\83I\83u\83W\83F\83N\83g\96{\91Ì\95\94\95ª\82É\8fd\82È\82é\82©\82Ç\82¤\82©\82ð\92²\82×\82é
@@ -100,45 +103,42 @@ StageObject.prototype = {
        checkCollidingDirection: function(){
                //\8fÕ\93Ë\95û\8cü\82ð\92²\82×\82é\81B
                this.collidingDirection = 0;
-               for(var sp in this.ownerStage.stageObjectList){
-                       for(var i = 0; i < this.ownerStage.stageObjectList[sp].length; i++){
-                               var obj = this.ownerStage.stageObjectList[sp][i];
-                               // CollisonBody
-                               var cbx0 = this.origin.x + this.collisionMargin.left;
-                               var cby0 = this.origin.y + this.collisionMargin.top;
-                               var cbx1 = this.origin.x + this.size.x - 1 - this.collisionMargin.right;
-                               var cby1 = this.origin.y + this.size.y - 1 - this.collisionMargin.bottom;
-                               // CollisionFrame\94Í\88Í\93à\82©\8am\94F
-                               if(obj !== this && !obj.isPhantom && obj.isOverlappedWith(
-                                       cbx0 - this.collidingRange,
-                                       cby0 - this.collidingRange,
-                                       cbx1 + this.collidingRange,
-                                       cby1 + this.collidingRange)){
-                                       //\8fÕ\93Ë\82Ì\89Â\94\\90«\82ª\82 \82é\82Ì\82Å\8am\94F
-                                       if(obj.isOverlappedWith(cbx0, cby0, cbx1, cby1)){
-                                               //body
-                                               this.collidingDirection |= CollideBody;
-                                       }
-                                       if(obj.isOverlappedWith(cbx0, cby0 - this.collidingRange, cbx1, cby0 - 1)){
-                                               //top
-                                               this.collidingDirection |= CollideTop;
-                                       }
-                                       if(obj.isOverlappedWith(cbx0, cby1 + 1, cbx1, cby1 + this.collidingRange)){
-                                               //bottom
-                                               this.collidingDirection |= CollideBottom;
-                                       }
-                                       if(obj.isOverlappedWith(cbx0 - this.collidingRange, cby0, cbx0 - 1, cby1)){
-                                               //left
-                                               this.collidingDirection |= CollideLeft;
-                                       }
-                                       if(obj.isOverlappedWith(cbx1 + 1, cby0, cbx1 + this.collidingRange, cby1)){
-                                               //right
-                                               this.collidingDirection |= CollideRight;
-                                       }
+               this.collidedObjects = new Array();
+               var d = this.ownerStage.stageObjectLinearList;
+               for(var i = 0, i_max = d.length; i < i_max; i++){
+                       var obj = d[i];
+                       var c = this.collisionMargin;
+                       var r = this.collidingRange;
+                       // CollisonBody
+                       var cbx0 = this.origin.x + c.left;
+                       var cby0 = this.origin.y + c.top;
+                       var cbx1 = this.origin.x + this.size.x - 1 - c.right;
+                       var cby1 = this.origin.y + this.size.y - 1 - c.bottom;
+                       // CollisionFrame\94Í\88Í\93à\82©\8am\94F
+                       if(obj.isOverlappedWith(cbx0 - r, cby0 - r, cbx1 + r, cby1 + r) && obj !== this && !obj.isPhantom){
+                               //\8fÕ\93Ë\82Ì\89Â\94\\90«\82ª\82 \82é\82Ì\82Å\8am\94F
+                               if(obj.isOverlappedWith(cbx0, cby0, cbx1, cby1)){
+                                       //body
+                                       this.collidingDirection |= CollideBody;
+                               }
+                               if(obj.isOverlappedWith(cbx0 + 1, cby0 - r, cbx1, cby0 - 1)){
+                                       //top
+                                       this.collidingDirection |= CollideTop;
+                               }
+                               if(obj.isOverlappedWith(cbx0, cby1 + 1, cbx1, cby1 + r)){
+                                       //bottom
+                                       this.collidingDirection |= CollideBottom;
+                               }
+                               if(obj.isOverlappedWith(cbx0 - r, cby0, cbx0 - 1, cby1)){
+                                       //left
+                                       this.collidingDirection |= CollideLeft;
+                               }
+                               if(obj.isOverlappedWith(cbx1 + 1, cby0, cbx1 + r, cby1)){
+                                       //right
+                                       this.collidingDirection |= CollideRight;
                                }
                        }
                }
-               return;
        },
 };