diff --git a/src/main/java/cactusServer/entities/Player.java b/src/main/java/cactusServer/entities/Player.java index e04de25..18efda5 100644 --- a/src/main/java/cactusServer/entities/Player.java +++ b/src/main/java/cactusServer/entities/Player.java @@ -15,6 +15,7 @@ private String instanceID; private String characterID; private String areaURI; + private Object3D object; private Position3D position; private Quaternion3D angle; private CameraState cameraState; @@ -57,6 +58,7 @@ String[] instanceURISplit = instanceID.split("/"); // �c�c/instances/{instanceId} String instanceId = instanceURISplit[instanceURISplit.length - 1]; Instances.getInstance().getInstance(instanceId).getUniverse().place(this.getPlaceable()); + setObject(body); } public String getInstanceID() { @@ -209,4 +211,14 @@ // 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 16f3c41..44c9d3c 100644 --- a/src/main/java/cactusServer/models/CollisionManager.java +++ b/src/main/java/cactusServer/models/CollisionManager.java @@ -2,61 +2,83 @@ import java.util.ArrayList; import java.util.HashMap; -import java.util.List; -import java.util.Map; import org.ntlab.radishforandroidstudio.framework.model3D.CollisionResult; import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; import org.ntlab.radishforandroidstudio.framework.physics.PhysicsUtility; +import org.ntlab.radishforandroidstudio.java3d.Vector3d; -import cactusServer.entities.Character; import cactusServer.entities.Instance; import cactusServer.entities.Object; import cactusServer.entities.Player; +import net.arnx.jsonic.JSONHint; public class CollisionManager { private static CollisionManager theInstance; - private List result; private HashMap instances; + private ArrayList resultList = new ArrayList(); private CollisionManager() { - result = new ArrayList(); instances = Instances.getInstance().getInstances(); } - public static CollisionManager getCollision() { + public static CollisionManager getInstance() { if (theInstance == null) { theInstance = new CollisionManager(); } return theInstance; } - - public List getResult() { - return result; + + @JSONHint(ignore = true) + public ArrayList getResultList() { + return resultList; } public void collisionRun(long interval) { - for (Instance instance : instances.values()) { + resultList.clear(); + for (String instanceId : instances.keySet()) { + Instance instance = Instances.getInstance().getInstance(instanceId); instance.getUniverse().update(interval); - result.clear(); for (Object object : instance.getObjects().values()) { - for (Player player : Instances.getInstance().getPlayers().values()) { - // result.add(PhysicsUtility.checkCollision(character.getObject(), "", - // object.getObject(), "")); - // System.out.println(result.get(result.size()-1).length); - // objectmove(instance, object, character); + for (Player player : Instances.getInstance().getPlayers(instanceId).values()) { + collisionMove(object, player); + } + for (Object object2 : instance.getObjects().values()) { + if (!object.equals(object2)) { + collisionMove(object, object2); + } } } } } - public void objectmove(Instance instance, Object object, Character character) { - int size = result.size() - 1; - CollisionResult current = result.get(size); - Position3D position = object.getPosition(); - position.setX(position.getX() + current.length * current.normal.x); - position.setY(position.getY() + current.length * current.normal.y); - position.setZ(position.getZ() + current.length * current.normal.z); - + public void collisionMove(Object object, Player player) { + CollisionResult result; + result = PhysicsUtility.checkCollision(player.getObject(), null, object.getObject(), null); + if (result != null) { + result.normal.scale(-1); + Vector3d vec = object.getPosition().getVector3d(); + vec.add(result.normal); + object.setPosition(new Position3D(vec)); + } } + public void collisionMove(Object object1, Object object2) { + CollisionResult result; + result = PhysicsUtility.checkCollision(object1.getObject(), null, object2.getObject(), null); + if (result != null) { + Vector3d vec1 = object1.getVelocity().getVector3d(); + Vector3d vec2 = object2.getVelocity().getVector3d(); + if (vec1.length() > vec2.length()) { + result.normal.scale(-1); + Vector3d vec = object1.getPosition().getVector3d(); + vec.add(result.normal); + object1.setPosition(new Position3D(vec)); + }else { + result.normal.scale(-1); + Vector3d vec = object2.getPosition().getVector3d(); + vec.add(result.normal); + object2.setPosition(new Position3D(vec)); + } + } + } } diff --git a/src/main/java/cactusServer/utils/App.java b/src/main/java/cactusServer/utils/App.java index 5fa4890..2e2add6 100644 --- a/src/main/java/cactusServer/utils/App.java +++ b/src/main/java/cactusServer/utils/App.java @@ -36,23 +36,31 @@ public class App extends ResourceConfig implements Runnable { private ScheduledThreadPoolExecutor task = new ScheduledThreadPoolExecutor(1000); private long lasttime = System.nanoTime(); + private boolean debugflag = false; public App() { + int interval; + if(debugflag) { + interval = 1000; + }else { + interval = 1; + } ObjectModelManager.getInstance(); StageModelManager.getInstance(); CharacterModelManager.getInstance(); BulletModelManager.getInstance(); Instances.getInstance(); Accounts.getInstance(); + CollisionManager.getInstance(); initDummy(); - start(1000); + start(interval); System.out.println("pass"); } @Override public void run() { // System.out.println("�^�X�N�����s"); - CollisionManager.getCollision().collisionRun(System.nanoTime() - lasttime); + CollisionManager.getInstance().collisionRun(System.nanoTime() - lasttime); removeInactivePlayers(); lasttime = System.nanoTime(); }