diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerCharactersModel.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerCharactersModel.java index dc5ab96..80f6f6b 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerCharactersModel.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerCharactersModel.java @@ -21,6 +21,7 @@ import java.math.BigDecimal; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -36,6 +37,7 @@ private CharactersConnection con = null; private int nextConnectRenaimdTime = 0; private int connectInterval = 300; + private Map visibleCharacters = new HashMap<>(); public OtherPlayerCharactersModel(RealTime3DFragment fragment, Universe universe) { this.fragment = fragment; @@ -63,16 +65,22 @@ @Override public void onResponse(String response) { + Map lastVisibleCharacters = new HashMap<>(visibleCharacters); + visibleCharacters.clear(); + JSON json = new JSON(); Map m = json.decode(response); for (Map.Entry entry: m.entrySet()) { + visibleCharacters.put(entry.getKey(), 1); + ArrayList properties = new ArrayList<>(); Map player = entry.getValue(); // 情報の取得 Map position = (Map)player.get("position"); + Map angle = (Map)player.get("angle"); Position3D positionProp = new Position3D(((BigDecimal)position.get("x")).doubleValue(), ((BigDecimal)position.get("y")).doubleValue(), ((BigDecimal)position.get("z")).doubleValue()); - Quaternion3D quaProp = new Quaternion3D(((BigDecimal)position.get("vx")).doubleValue(), ((BigDecimal)position.get("vy")).doubleValue(), ((BigDecimal)position.get("vz")).doubleValue(), ((BigDecimal)position.get("a")).doubleValue()); + Quaternion3D quaProp = new Quaternion3D(((BigDecimal)angle.get("vx")).doubleValue(), ((BigDecimal)angle.get("vy")).doubleValue(), ((BigDecimal)angle.get("vz")).doubleValue(), ((BigDecimal)angle.get("a")).doubleValue()); properties.add(positionProp); properties.add(quaProp); @@ -101,5 +109,12 @@ } universe.apply(entry.getKey(), properties); } + + // 見えなくなったキャラクターの削除 + for (String key : lastVisibleCharacters.keySet()) { + if (visibleCharacters.get(key) == null) { + universe.displace(key); + } + } } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/Universe.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/Universe.java index 7d43f72..04a1215 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/Universe.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/Universe.java @@ -171,7 +171,13 @@ root.removeChild(node); } - public void displace(Object id) { displace(objMap.get(id)); objMap.remove(id); } + public void displace(Object id) { + Object3D t; + if ((t = objMap.get(id)) != null) { + displace(t); + objMap.remove(id); + } + } public ArrayList getLights() { return lights; diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/network/HttpAsyncConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/network/HttpAsyncConnection.java index 41db82f..be5fc8f 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/network/HttpAsyncConnection.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/network/HttpAsyncConnection.java @@ -160,25 +160,41 @@ public void addPathParam(String param){ pathParams += "/" + param; } - +int cnt=0; public void test() { - callBack.onResponse("{\n" + - " \"id1\" : {\n" + - " \"accountURI\": \"http://hogehoge.com\",\n" + - " \"areaURI\": \"http://areahogehoge.com\",\n" + - " \"name\": \"Totori Tori\",\n" + - "\t\"position\": {\"x\": 0.5, \"y\": 2, \"z\": 0.2},\n" + - "\t\"angle\": {\"vx\": 0, \"vy\": 0, \"vz\": 0, \"a\": 0},\n" + - "\t\"modelID\": \"5\"\n" + - " },\n" + - " \"id2\" : {\n" + - " \"accountURI\": \"http://hogehoge.com\",\n" + - " \"areaURI\": \"http://areahogehoge.com\",\n" + - " \"name\": \"Tataru Taru\",\n" + - "\t\"position\": {\"x\": 3.5, \"y\": 8, \"z\": 3.5},\n" + - "\t\"angle\": {\"vx\": 0, \"vy\": 0, \"vz\": 0, \"a\": 0},\n" + - "\t\"modelID\": \"5\"\n" + - " }\n" + - "}");return; + cnt++; + if (cnt < 10) { + callBack.onResponse("{\n" + + " \"id1\" : {\n" + + " \"accountURI\": \"http://hogehoge.com\",\n" + + " \"areaURI\": \"http://areahogehoge.com\",\n" + + " \"name\": \"Totori Tori\",\n" + + "\t\"position\": {\"x\": 0.5, \"y\": 2, \"z\": 0.2},\n" + + "\t\"angle\": {\"vx\": 0, \"vy\": 0, \"vz\": 0, \"a\": 0},\n" + + "\t\"modelID\": \"5\"\n" + + " },\n" + + " \"id2\" : {\n" + + " \"accountURI\": \"http://hogehoge.com\",\n" + + " \"areaURI\": \"http://areahogehoge.com\",\n" + + " \"name\": \"Tataru Taru\",\n" + + "\t\"position\": {\"x\": 4.5, \"y\": 2, \"z\": 4.5},\n" + + "\t\"angle\": {\"vx\": 0, \"vy\": 0, \"vz\": 0, \"a\": 0},\n" + + "\t\"modelID\": \"5\"\n" + + " }\n" + + "}"); + } + else { + callBack.onResponse("{\n" + + " \"id1\" : {\n" + + " \"accountURI\": \"http://hogehoge.com\",\n" + + " \"areaURI\": \"http://areahogehoge.com\",\n" + + " \"name\": \"Totori Tori\",\n" + + "\t\"position\": {\"x\": 0.5, \"y\": 2, \"z\": 0.2},\n" + + "\t\"angle\": {\"vx\": 0, \"vy\": 0, \"vz\": 0, \"a\": 0},\n" + + "\t\"modelID\": \"5\"\n" + + " }\n" + + "}"); + } + return; } }