diff --git a/src/main/java/cactusServer/entities/Bullet.java b/src/main/java/cactusServer/entities/Bullet.java index 021c408..f2b64e5 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/models/CollisionManager.java b/src/main/java/cactusServer/models/CollisionManager.java index cdc3bde..ef6235e 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; @@ -45,7 +47,8 @@ Instance instance = Instances.getInstance().getInstance(instanceId); instance.getUniverse().update(interval); collisionPlayersObjects(instanceId, instance); - collisionBulletsAndOthers(instanceId, instance); +// collisionBulletsAndOthers(instanceId, instance); + collisionBulletsAndOthersTmp(instanceId, instance); } } @@ -66,6 +69,7 @@ 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�̏Փ�"); objMove(result, object, false); } } @@ -74,6 +78,7 @@ CollisionResult result; result = PhysicsUtility.checkCollision(object1.getObject(), null, object2.getObject(), null); if (result != null) { + System.out.println("�I�u�W�F�N�g���m�̏Փ�"); Vector3d vec1 = object1.getVelocity().getVector3d(); Vector3d vec2 = object2.getVelocity().getVector3d(); if (vec1.length() > vec2.length()) { @@ -92,58 +97,127 @@ 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(); + + private void collisionBulletsAndOthersTmp(String instanceId, Instance instance) { +// collisionBulletAndOtherBulletsTmp(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(); + collisionBulletAndPlayersTmp(instanceId, instance, bulletOwnerPlayerId, bulletId, bullet); +// if (!bullet.isAlive()) continue; + collisionBulletAndObjectsTmp(instance, bulletOwnerPlayerId, bulletId, bullet); } } } + +// private void collisionBulletsAndOthers(String instanceId, Instance instance) { +// Iterator>> playersBulletsEntryIt = instance.getBullets().entrySet() +// .iterator(); +// while (playersBulletsEntryIt.hasNext()) { +// Map.Entry> playersBulletsEntry = playersBulletsEntryIt.next(); +// 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(); +// Bullet bullet = bulletEntry.getValue(); +// boolean isRemoved = collisionBulletAndPlayers(instanceId, instance, bulletOwnerPlayerId, bulletId, +// bullet, bulletEntryIt); +// if (!isRemoved) { +// collisionBulletAndObjects(instance, bulletOwnerPlayerId, bulletId, bullet, bulletEntryIt); +// } +// } +// } +// } - private boolean collisionBulletAndPlayers(String instanceId, Instance instance, String bulletOwnerPlayerId, - String bulletId, Bullet bullet, Iterator> bulletEntryIt) { +// private boolean collisionBulletAndPlayers(String instanceId, Instance instance, String bulletOwnerPlayerId, +// String bulletId, Bullet bullet, Iterator> bulletEntryIt) { +// 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 + "�폜"); +// return true; +// } +// } +// return false; +// } + +// private boolean collisionBulletAndObjects(Instance instance, String bulletOwnerPlayerId, String bulletId, +// Bullet bullet, Iterator> bulletEntryIt) { +// for (MovableObject object : instance.getObjects().values()) { +// if (isCollision(bullet, object)) { +// bulletEntryIt.remove(); +// instance.getUniverse().displace(bullet.getPlaceable()); +// System.out.println(bulletId + "�폜"); +// return true; +// } +// } +// return false; +// } + + private boolean collisionBulletAndPlayersTmp(String instanceId, Instance instance, String bulletOwnerPlayerId, + 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 + "�����t���O�܂� (�e�ƃv���C���[�̏Փ�)"); return true; } } return false; } - - private boolean collisionBulletAndObjects(Instance instance, String bulletOwnerPlayerId, String bulletId, - Bullet bullet, Iterator> bulletEntryIt) { + + private boolean collisionBulletAndObjectsTmp(Instance instance, String bulletOwnerPlayerId, String bulletId, + 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 + "�����t���O�܂� (�e�Ɖ“����̏Փ�)"); return true; } } return false; } + + private void collisionBulletAndOtherBulletsTmp(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() + "�����t���O�܂� (�e�ƒe�̏Փ�)"); + System.out.println(bulletEntry2.getKey() + "�����t���O�܂� (�e�ƒe�̏Փ�)"); + break; + } + } + } + } private boolean isCollision(Bullet bullet, Player player) { CollisionResult result; @@ -156,4 +230,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/utils/App.java b/src/main/java/cactusServer/utils/App.java index dded3cb..6ff6e6a 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(); } @@ -74,7 +76,7 @@ // �_�~�[�L�����N�^�[4�� String accountUri = "/CactusServer/rest/accounts/" + Accounts.getInstance().getAccountByID("test").getUniqueID(); - Character chara1 = new Character("test1", accountUri, "chara1", new Position3D(), new Quaternion3D(), 0); + Character chara1 = new Character("test1", accountUri, "chara1", new Position3D(50, 50, 50), 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,21 @@ 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()); // // �m�F�p @@ -126,8 +135,8 @@ String playerId = entry.getKey(); Player player = entry.getValue(); long lastUpdateTime = player.getLastUpdateTime(); - System.out.println( - currentTime + ", " + (lastUpdateTime + Player.STOP_TIME_LIMIT) + " // playerId: " + playerId); +// System.out.println( +// currentTime + ", " + (lastUpdateTime + Player.STOP_TIME_LIMIT) + " // playerId: " + playerId); if (currentTime > (lastUpdateTime + Player.STOP_TIME_LIMIT)) { System.out.println("delete started (playerId: " + playerId + ")"); player.destroy(); @@ -135,6 +144,26 @@ System.out.println("delete finished (playerId: " + playerId + ")"); } } - System.out.println(); +// 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