diff --git a/src/main/java/cactusServer/entities/Bullet.java b/src/main/java/cactusServer/entities/Bullet.java index 021c408..e652933 100644 --- a/src/main/java/cactusServer/entities/Bullet.java +++ b/src/main/java/cactusServer/entities/Bullet.java @@ -5,11 +5,13 @@ import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; import cactusServer.models.BulletModelManager; +import net.arnx.jsonic.JSONHint; public class Bullet extends Entity3D { private String playerID; private Position3D position; private Quaternion3D angle; + private boolean isAlive = true; private Bullet() { // JSON�G���R�[�h���̌Ăяo���p @@ -34,6 +36,11 @@ public Quaternion3D getAngle() { return angle; } + + @JSONHint(ignore = true) + public boolean isAlive() { + return isAlive; + } public void setPlayerID(String playerID) { this.playerID = playerID; @@ -52,6 +59,11 @@ ((Object3D)this.placeable.getBody()).apply(angle, false); } } + + @JSONHint(ignore = true) + public void setAlive(boolean isAlive) { + this.isAlive = isAlive; + } public void update(Position3D position, Quaternion3D angle) { setPosition(position); diff --git a/src/main/java/cactusServer/entities/Player.java b/src/main/java/cactusServer/entities/Player.java index d6cce3f..171b79c 100644 --- a/src/main/java/cactusServer/entities/Player.java +++ b/src/main/java/cactusServer/entities/Player.java @@ -15,12 +15,10 @@ private String instanceID; private String characterID; private String areaURI; - private Object3D object; private Position3D position; private Quaternion3D angle; private CameraState cameraState; private EmoteState emoteState; - private Primitive prim; private long lastUpdateTime = System.nanoTime(); @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; @@ -54,7 +52,6 @@ // ����Ȋ����œ��Y�R���X�g���N�^�̍Ō��placeable�̒������s�� Object3D body = CharacterModelManager.getInstance().getCharacterModel(modelID).createObject(); setPlaceable(new OvergroundActor(body, null)); - setObject(body); } public String getInstanceID() { @@ -109,17 +106,17 @@ } public void setPosition(Position3D position) { - this.position = position; + this.position = position; if (this.placeable != null) { ((Object3D)this.placeable.getBody()).setPosition(position); - } + } } public void setAngle(Quaternion3D angle) { - this.angle = angle; + this.angle = angle; if (this.placeable != null) { ((Object3D)this.placeable.getBody()).apply(angle, false); - } + } } public void setCameraState(CameraState cameraState) { @@ -183,7 +180,7 @@ } public void changeCharacter(String characterID) { - writeCharacterData(); + destroy(); setCharacterID(characterID); Character character = getCharacter(); initPlaceable(character.getModelID()); @@ -206,24 +203,9 @@ setAreaURI(character.getAreaURI()); } - // private void readCharacterData() { - // Character character = getCharacter(); - // readCharacterData(character); - // } - private void writeCharacterData() { Character character = getCharacter(); // if (character == null) return; character.update(position, angle, areaURI); } - - @JSONHint(ignore = true) - public Object3D getObject() { - return object; - } - - public void setObject(Object3D object) { - this.object = object; - } - } diff --git a/src/main/java/cactusServer/models/CollisionManager.java b/src/main/java/cactusServer/models/CollisionManager.java index 122dc21..d0a5485 100644 --- a/src/main/java/cactusServer/models/CollisionManager.java +++ b/src/main/java/cactusServer/models/CollisionManager.java @@ -3,7 +3,9 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; +import java.util.Set; import org.ntlab.radishforandroidstudio.framework.model3D.CollisionResult; import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; @@ -64,9 +66,9 @@ public void collisionMove(MovableObject object, Player player) { CollisionResult result; - result = PhysicsUtility.checkCollision(player.getObject(), null, object.getObject(), null); - if (result != null) { - System.out.println("�v���C���[�ƃI�u�W�F�N�g���Փ�"); + result = PhysicsUtility.checkCollision((Object3D)player.getPlaceable().getBody(), null, object.getObject(), null); + if (result != null) { + System.out.println("�I�u�W�F�N�g�ƃv���C���[���Փ�"); objMove(result, object, false); } } @@ -75,6 +77,7 @@ CollisionResult result; result = PhysicsUtility.checkCollision(object1.getObject(), null, object2.getObject(), null); if (result != null) { + System.out.println(); Vector3d vec1 = object1.getVelocity().getVector3d(); Vector3d vec2 = object2.getVelocity().getVector3d(); if (vec1.length() > vec2.length()) { @@ -93,62 +96,78 @@ vec.add(result.normal); object.setPosition(new Position3D(vec)); } - + private void collisionBulletsAndOthers(String instanceId, Instance instance) { - Iterator>> playersBulletsEntryIt = instance.getBullets().entrySet() - .iterator(); - while (playersBulletsEntryIt.hasNext()) { - Map.Entry> playersBulletsEntry = playersBulletsEntryIt.next(); + collisionBulletAndOtherBullets(instance); + for (Map.Entry> playersBulletsEntry : instance.getBullets().entrySet()) { String bulletOwnerPlayerId = playersBulletsEntry.getKey(); Map bulletMap = playersBulletsEntry.getValue(); - Iterator> bulletEntryIt = bulletMap.entrySet().iterator(); - while (bulletEntryIt.hasNext()) { - Map.Entry bulletEntry = bulletEntryIt.next(); - String bulletId = bulletEntry.getKey(); + for (Map.Entry bulletEntry : bulletMap.entrySet()) { Bullet bullet = bulletEntry.getValue(); - boolean isRemoved = collisionBulletAndPlayers(instanceId, instance, bulletOwnerPlayerId, bulletId, - bullet, bulletEntryIt); - if (!isRemoved) { - collisionBulletAndObjects(instance, bulletOwnerPlayerId, bulletId, bullet, bulletEntryIt); - } + if (!bullet.isAlive()) continue; + String bulletId = bulletEntry.getKey(); + collisionBulletAndPlayers(instanceId, instance, bulletOwnerPlayerId, bulletId, bullet); + if (!bullet.isAlive()) continue; + collisionBulletAndObjects(instance, bulletOwnerPlayerId, bulletId, bullet); } } } private boolean collisionBulletAndPlayers(String instanceId, Instance instance, String bulletOwnerPlayerId, - String bulletId, Bullet bullet, Iterator> bulletEntryIt) { + String bulletId, Bullet bullet) { Instances instances = Instances.getInstance(); for (Map.Entry playersEntry : instances.getPlayers(instanceId).entrySet()) { if (isCollision(bullet, playersEntry.getValue())) { if (!(playersEntry.getKey().equals(bulletOwnerPlayerId))) { // Player(����������)�ƒe�������������̏��������� } - // Player(�������܂�)�ɓ��������e������ - bulletEntryIt.remove(); - instance.getUniverse().displace(bullet.getPlaceable()); - System.out.println(bulletId + "�폜"); + // Player(�������܂�)�ɓ��������e�̐����t���O��܂� + bullet.setAlive(false); + System.out.println(bulletId + " �� �v���C���[�̏Փ�"); return true; } } return false; } - + private boolean collisionBulletAndObjects(Instance instance, String bulletOwnerPlayerId, String bulletId, - Bullet bullet, Iterator> bulletEntryIt) { + Bullet bullet) { for (MovableObject object : instance.getObjects().values()) { if (isCollision(bullet, object)) { - bulletEntryIt.remove(); - instance.getUniverse().displace(bullet.getPlaceable()); - System.out.println(bulletId + "�폜"); + bullet.setAlive(false); + System.out.println(bulletId + " �� �“����̏Փ�"); return true; } } return false; } + + private void collisionBulletAndOtherBullets(Instance instance) { + List> allBulletsEntryList = new ArrayList<>(); + for (HashMap playerBullets : instance.getBullets().values()) { + allBulletsEntryList.addAll(playerBullets.entrySet()); + } + for (int i = 0; i < allBulletsEntryList.size() - 1; i++) { + Map.Entry bulletEntry1 = allBulletsEntryList.get(i); + Bullet bullet1 = bulletEntry1.getValue(); + if (!bullet1.isAlive()) continue; + for (int j = i + 1; j < allBulletsEntryList.size(); j++) { + Map.Entry bulletEntry2 = allBulletsEntryList.get(j); + Bullet bullet2 = bulletEntry2.getValue(); + if (!bullet2.isAlive()) continue; + if (isCollision(bullet1, bullet2)) { + bullet1.setAlive(false); + bullet2.setAlive(false); + System.out.println(bulletEntry1.getKey() + " �� " + bulletEntry2.getKey() + "�̏Փ�"); + break; + } + } + } + } private boolean isCollision(Bullet bullet, Player player) { CollisionResult result; - result = PhysicsUtility.checkCollision((Object3D) (bullet.getPlaceable()), null, player.getObject(), null); + result = PhysicsUtility.checkCollision((Object3D) (bullet.getPlaceable()), null, (Object3D)player.getPlaceable().getBody(), null); return (result != null); } @@ -157,4 +176,10 @@ result = PhysicsUtility.checkCollision((Object3D) (bullet.getPlaceable()), null, object.getObject(), null); return (result != null); } + + private boolean isCollision(Bullet bullet1, Bullet bullet2) { + CollisionResult result; + result = PhysicsUtility.checkCollision((Object3D) (bullet1.getPlaceable()), null, (Object3D) (bullet2.getPlaceable()), null); + return (result != null); + } } diff --git a/src/main/java/cactusServer/models/Instances.java b/src/main/java/cactusServer/models/Instances.java index 2c3613d..0b46311 100644 --- a/src/main/java/cactusServer/models/Instances.java +++ b/src/main/java/cactusServer/models/Instances.java @@ -110,8 +110,13 @@ CameraState cameraState, EmoteState.EmoteType animationClassToStart) { long lastUpdateTime = System.nanoTime(); Player player = playerMap.get(playerId); + String previousCharacterID = player.getCharacterID(); if (player != null) { player.update(characterID, position, angle, cameraState, animationClassToStart, lastUpdateTime); + if (previousCharacterID.equals(player.getCharacterID())) { + String instanceID = player.getInstanceID(); + instanceMap.get(instanceID).getUniverse().place(player.getPlaceable()); + } } return player; } diff --git a/src/main/java/cactusServer/utils/App.java b/src/main/java/cactusServer/utils/App.java index eac1f7e..887f9d9 100644 --- a/src/main/java/cactusServer/utils/App.java +++ b/src/main/java/cactusServer/utils/App.java @@ -1,5 +1,6 @@ package cactusServer.utils; +import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Timer; @@ -56,6 +57,7 @@ public void run() { // System.out.println("�^�X�N�����s"); CollisionManager.getInstance().collisionRun(System.nanoTime() - lasttime); + removeDeadBullets(); removeInactivePlayers(); lasttime = System.nanoTime(); } @@ -73,8 +75,8 @@ Instances.getInstance().getInstances().put("test2", new Instance("test2", 1)); // �_�~�[�L�����N�^�[4�� String accountUri = "/CactusServer/rest/accounts/" - + Accounts.getInstance().getAccountByID("test").getUniqueID(); - Character chara1 = new Character("test1", accountUri, "chara1", new Position3D(0, 0, 0), new Quaternion3D(), 0); + + Accounts.getInstance().getAccountByID("test").getUniqueID(); + Character chara1 = new Character("test1", accountUri, "chara1", new Position3D(300, 400, 500), new Quaternion3D(), 0); Character chara2 = new Character("test2", accountUri, "chara2", new Position3D(), new Quaternion3D(), 0); Instances.getInstance().getInstance("test1").getCharacters().put("chara1", chara1); Instances.getInstance().getInstance("test1").getCharacters().put("chara2", chara2); @@ -91,14 +93,23 @@ Player player2 = new Player("test2", "chara2", cameraState, EmoteType.DUMMY); Instances.getInstance().getPlayers().put("player2", player2); // �_�~�[�I�u�W�F�N�g + Instances.getInstance().getInstance("test1").createObject(new Position3D(110, 110, 110), new Velocity3D(), + new AngularVelocity3D(), new Quaternion3D(), new Attribute(true, 1), 0); Instances.getInstance().getInstance("test1").createObject(new Position3D(0, 0, 0), new Velocity3D(), new AngularVelocity3D(), new Quaternion3D(), new Attribute(true, 1), 0); + // �_�~�[�o���b�g - Instances.getInstance().getInstance("test1").createBullet("player1", "testBulletId1", new Position3D(300, 300, 300), + Instances.getInstance().getInstance("test1").createBullet("player1", "testBulletId1", new Position3D(50, 50, 50), new Quaternion3D()); - Instances.getInstance().getInstance("test1").createBullet("player1", "testBulletId2", new Position3D(), + Instances.getInstance().getInstance("test1").createBullet("player1", "testBulletId2", new Position3D(300, 400, 500), new Quaternion3D()); - Instances.getInstance().getInstance("test1").createBullet("player1", "testBulletId3", new Position3D(), + Instances.getInstance().getInstance("test1").createBullet("player1", "testBulletId3", new Position3D(110, 110, 110), + new Quaternion3D()); + Instances.getInstance().getInstance("test1").createBullet("player1", "testBulletId4", new Position3D(0, 0, 0), + new Quaternion3D()); + Instances.getInstance().getInstance("test1").createBullet("player1", "testBulletId5", new Position3D(300, 400, 500), + new Quaternion3D()); + Instances.getInstance().getInstance("test1").createBullet("player1", "testBulletId6", new Position3D(300, 400, 500), new Quaternion3D()); // // �m�F�p @@ -136,5 +147,26 @@ } } // System.out.println(); + + } + + private void removeDeadBullets() { + for (Instance instance : Instances.getInstance().getInstances().values()) { + Iterator> playersBulletsIt = instance.getBullets().values().iterator(); + while (playersBulletsIt.hasNext()) { + Map playersBullets = playersBulletsIt.next(); + Iterator> bulletEntryIt = playersBullets.entrySet().iterator(); + while (bulletEntryIt.hasNext()) { + Map.Entry bulletEntry = bulletEntryIt.next(); + Bullet bullet = bulletEntry.getValue(); + if (!bullet.isAlive()) { + String bulletId = bulletEntry.getKey(); + bulletEntryIt.remove(); + instance.getUniverse().displace(bullet.getPlaceable()); + System.out.println(bulletId + "�폜"); + } + } + } + } } } \ No newline at end of file diff --git a/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/BoundingBoxVisitor.java b/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/BoundingBoxVisitor.java index b1e6038..dcdd32a 100644 --- a/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/BoundingBoxVisitor.java +++ b/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/BoundingBoxVisitor.java @@ -9,9 +9,9 @@ public class BoundingBoxVisitor extends ObjectVisitor { - private ArrayList obbList = new ArrayList(); // 全構成要素のOBBのリスト - private ArrayList bsStack = new ArrayList(); // オブジェクトの階層毎のBoundingSphereのスタック - private String partName = null; // 部品を指定する場合に使う + private ArrayList obbList = new ArrayList(); // 蜈ィ讒区�占ヲ∫エ�縺ョOBB縺ョ繝ェ繧ケ繝� + private ArrayList bsStack = new ArrayList(); // 繧ェ繝悶ず繧ァ繧ッ繝医�ョ髫主ア、豈弱�ョBoundingSphere縺ョ繧ケ繧ソ繝�繧ッ + private String partName = null; // 驛ィ蜩√r謖�螳壹☆繧句�エ蜷医↓菴ソ縺� private boolean inPart = false; public BoundingBoxVisitor() { @@ -28,7 +28,7 @@ inPart = true; } if (obj.hasChildren() && obj.bs == null) { - // 子供がいる場合、下の階層用にnullをpushする + // 蟄蝉セ帙′縺�繧句�エ蜷医�∽ク九�ョ髫主ア、逕ィ縺ォnull繧恥ush縺吶k bsStack.add(null); } } @@ -36,7 +36,7 @@ public void postVisit(Object3D obj) { int pattern = 2; if (!obj.hasChildren()) { - // 葉の場合 + // 闡峨�ョ蝣エ蜷� OBB obb = obj.getOBB(pattern); if (obb != null) { if (obj.bs == null) { @@ -47,37 +47,41 @@ BoundingSphere bs = (BoundingSphere)obj.bs.clone(); for (int i = stackList.size() - 1; i >= 0; i--) { obb.transform(stackList.get(i)); - bs.transform(stackList.get(i)); + if (i >= stackList.size() - 4) bs.transform(stackList.get(i)); } if (partName == null || partName.length() == 0 || inPart) { - obbList.add(obb); // Transform3Dを適応させたBoundsをboundsListに追加 + obbList.add(obb); // Transform3D繧帝←蠢懊&縺帙◆Bounds繧鍛oundsList縺ォ霑ス蜉� int stackTop = bsStack.size() - 1; if (bs != null && stackTop >= 0) { if (bsStack.get(stackTop) == null) { - // その階層の最初のオブジェクトの場合、nullを置き換え + // 縺昴�ョ髫主ア、縺ョ譛�蛻昴�ョ繧ェ繝悶ず繧ァ繧ッ繝医�ョ蝣エ蜷医�]ull繧堤スョ縺肴鋤縺� bsStack.set(stackTop, bs); } else { - // その階層の2番目以降のオブジェクトの場合、結合 + // 縺昴�ョ髫主ア、縺ョ2逡ェ逶ョ莉・髯阪�ョ繧ェ繝悶ず繧ァ繧ッ繝医�ョ蝣エ蜷医�∫オ仙粋 bsStack.get(stackTop).combine(bs); } } } } } else { - // 子供がいる場合 + // 蟄蝉セ帙′縺�繧句�エ蜷� int stackTop = bsStack.size() - 1; if (obj.bs == null) { - // 下の階層の結合結果をpopして利用する + // 荳九�ョ髫主ア、縺ョ邨仙粋邨先棡繧恥op縺励※蛻ゥ逕ィ縺吶k obj.bs = bsStack.remove(stackTop); stackTop--; } if (obj.bs != null && stackTop >= 0) { + BoundingSphere bs = (BoundingSphere)obj.bs.clone(); + for (int i = stackList.size() - 1; i >= stackList.size() - 4; i--) { + bs.transform(stackList.get(i)); + } if (bsStack.get(stackTop) == null) { - // その階層の最初のオブジェクトの場合、nullを置き換え - bsStack.set(stackTop, obj.bs); + // 縺昴�ョ髫主ア、縺ョ譛�蛻昴�ョ繧ェ繝悶ず繧ァ繧ッ繝医�ョ蝣エ蜷医�]ull繧堤スョ縺肴鋤縺� + bsStack.set(stackTop, bs); } else { - // その階層の2番目以降のオブジェクトの場合、結合 - bsStack.get(stackTop).combine(obj.bs); + // 縺昴�ョ髫主ア、縺ョ2逡ェ逶ョ莉・髯阪�ョ繧ェ繝悶ず繧ァ繧ッ繝医�ョ蝣エ蜷医�∫オ仙粋 + bsStack.get(stackTop).combine(bs); } } }