diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/Actor.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/Actor.java index 5aa7662..4f13031 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/Actor.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/Actor.java @@ -8,8 +8,10 @@ import org.ntlab.radishforandroidstudio.framework.model3D.GeometryUtility; import org.ntlab.radishforandroidstudio.framework.model3D.Movable; import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Placeable; import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; +import org.ntlab.radishforandroidstudio.framework.physics.Collidable; import org.ntlab.radishforandroidstudio.framework.physics.Force3D; import org.ntlab.radishforandroidstudio.framework.physics.Ground; import org.ntlab.radishforandroidstudio.framework.physics.PhysicsUtility; @@ -54,7 +56,7 @@ */ public void motion(long interval){ // 1. 位置を動かす - ((Solid3D)body).move(interval, getGravity(), getGravityCenter()); + ((Solid3D)body).move(interval, getGravity(), getGravityCenter());//地面とあたり判定してない super.motion(interval); } @@ -63,7 +65,7 @@ * @param interval --- 前回呼び出されたときからの経過時間(ミリ秒単位) * @param ground --- 地面(構造物) */ - public void motion(long interval, Ground ground) { + public void motion(long interval, Ground ground) {//k.地面とあたり判定 // 1. 位置を動かす ((Solid3D)body).move(interval, getGravity(), getGravityCenter()); @@ -75,11 +77,11 @@ } // 3. 姿勢を変える - body.apply(animation.getPose(), false); + body.apply(animation.getPose(), false);//k.実際に適応する } // 4. 衝突判定 - CollisionResult cr = PhysicsUtility.doesIntersect((Solid3D)body, ground); + CollisionResult cr = PhysicsUtility.doesIntersect((Solid3D)body, ground);//k.crに情報が入っている // 5. 衝突応答 if (cr != null) { @@ -128,56 +130,57 @@ mode = modeFreeFall; } } - + + //k.完全な物理演算するためのMotion public void motion(long interval, Ground ground,ArrayList forces, ArrayList appPoints) { - + forces.add(getGravity()); appPoints.add(getGravityCenter()); // 1. 位置を動かす - ((Solid3D)body).move(interval, forces, appPoints); + ((Solid3D) body).move(interval, forces, appPoints); if (animation != null) { // 2. アニメーションを実行 if (animation.progress(interval) == false) { onEndAnimation(); } - + // 3. 姿勢を変える body.apply(animation.getPose(), false); } // 4. 衝突判定 - CollisionResult cr = PhysicsUtility.doesIntersect((Solid3D)body, ground); + CollisionResult cr = PhysicsUtility.doesIntersect((Solid3D) body, ground);//k.←ここ地面とのあたり判定 // 5. 衝突応答 if (cr != null) { // 構造物にぶつかった、または接触している時 if (cr.normal.dot(PhysicsUtility.vertical) > GeometryUtility.TOLERANCE) { // 上向きの面(=地面)にぶつかった、または接触している時 - if (cr.length <= GeometryUtility.TOLERANCE) { + if (cr.length <= GeometryUtility.TOLERANCE) {//k.押し戻しの処理を // 地面に乗っている if (!(mode instanceof ModeOnGround)) { // 落ちてきて丁度乗った mode = modeOnGround; - ((ModeOnGround)mode).setNormal(cr.normal); - onEndFall(); + ((ModeOnGround) mode).setNormal(cr.normal); + onEndFall();//k.地面に着地 } } else { // 地面にめり込んだ // 5.1. 押し戻す - onIntersect(cr, interval); + onIntersect(cr, interval);//k.めり込んだとき地面以外のあたり判定 if (!(mode instanceof ModeOnGround)) { // 落ちてきてめり込んだ // 6. 地面モードにする mode = modeOnGround; - ((ModeOnGround)mode).setNormal(cr.normal); + ((ModeOnGround) mode).setNormal(cr.normal); onEndFall(); } else { // 歩いている途中で、アニメーションの関係で一瞬だけめり込んだ // または、歩いている途中で斜面に差し掛かった - ((ModeOnGround)mode).setNormal(cr.normal); + ((ModeOnGround) mode).setNormal(cr.normal); } } } else if (cr.normal.dot(PhysicsUtility.vertical) >= -GeometryUtility.TOLERANCE) { @@ -188,7 +191,7 @@ // 下からぶつかった、または接触した(頭をぶつけた) if (cr.length > GeometryUtility.TOLERANCE) { // 5.1. 押し戻す - onIntersect(cr, interval); + onIntersect(cr, interval); } } cr = null; @@ -197,8 +200,23 @@ // 6. 落下モードにする mode = modeFreeFall; } + + + //k.ここで敵とのあたり判定の記述 + +// PhysicsUtility.checkCollision(); + + Placeable anothor = collidableListList.get(0).get(0); + CollisionResult cr2= PhysicsUtility.checkCollision(body,null,(Solid3D)(anothor.getBody()),null);//今は自分と自分のあたり判定になってる + //k.相手のどの部分かが必要,Nullじゃなかったら + //k.nullじゃないときは当たったのでその時のあたり判定をする + if(cr !=null){ + onCollidableStay(anothor);//k.呼び出される +// if (flag){ +// anothor.onCollisionStay(this);//k.flagの追加をしないといけない +// } + } } - public void setInitialDirection(Vector3d dir) { direction = dir; }