diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Bullet.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Bullet.java index 5760aad..48be4fe 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Bullet.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Bullet.java @@ -28,6 +28,7 @@ final private int INIT_UPDATE_INTERVAL = 100; private int updateInterval = INIT_UPDATE_INTERVAL; private boolean isCreatedOnServer = false; + private boolean isDelete = false; public Bullet(Object3D body, Animation3D animation) { super(new Solid3D(body), animation); @@ -49,6 +50,10 @@ return uuid; } + public boolean isDelete() { + return isDelete; + } + @Override public void onEndFall() { diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/BulletsManager.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/BulletsManager.java new file mode 100644 index 0000000..12ef5ce --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/BulletsManager.java @@ -0,0 +1,116 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import net.arnx.jsonic.JSON; +import net.arnx.jsonic.TypeReference; + +import org.ntlab.radishforandroidstudio.cactusClient.connections.BulletGetConnection; +import org.ntlab.radishforandroidstudio.framework.gameMain.GameBaseModel; +import org.ntlab.radishforandroidstudio.framework.gameMain.RealTime3DFragment; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Property3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Universe; +import org.ntlab.radishforandroidstudio.framework.network.CallBack; +import org.ntlab.radishforandroidstudio.java3d.Appearance; +import org.ntlab.radishforandroidstudio.java3d.Material; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class BulletsManager implements GameBaseModel, CallBack { + private Universe universe; + private RealTime3DFragment fragment; + private BulletGetConnection con; + private int nextConnectRenaimdTime = 0; + private int connectInterval = 100; + private Map visibleBullets = new HashMap<>(); + private String instanceId; + private String playerId; + + public BulletsManager(RealTime3DFragment fragment, Universe universe) { + this.universe = universe; + this.fragment = fragment; + } + + public void setInstanceId(String id) { + this.instanceId = id; + } + + public void setPlayerId(String id) { + playerId = id; + } + + /** + * 玉の状態を更新する + * + * @author s.iwatani + * @param interval 前回の更新からの時間差 + */ + @Override + public void update(double interval) { + nextConnectRenaimdTime -= interval; + if (nextConnectRenaimdTime <= 0) { + nextConnectRenaimdTime = connectInterval; + con = new BulletGetConnection(instanceId); + con.setCallBack(this); + con.doGet(); + } + } + + @Override + public void onResponse(String response) { + Map lastVisibleBullets = new HashMap<>(visibleBullets); + visibleBullets.clear(); + JSON json = new JSON(); + ArrayList> m = json.decode(response, new TypeReference>>(){}); + for(Map eachPlayerBullets : m) { + for (Map.Entry entry : eachPlayerBullets.entrySet()) { + visibleBullets.put(entry.getKey(), 1); + ArrayList properties = new ArrayList<>(); + DummyBullet player = entry.getValue(); + + // 自分自身は無視する + if (entry.getKey().equals(playerId)) continue; + + // 情報の取得 +// 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)angle.get("x")).doubleValue(), ((BigDecimal)angle.get("y")).doubleValue(), ((BigDecimal)angle.get("z")).doubleValue(), ((BigDecimal)angle.get("w")).doubleValue()); + +// properties.add(player.getPosition()); +// properties.add(player.getAngle()); + + if (!universe.doHaveObj(entry.getKey())) { + Appearance ap1 = new Appearance(); + Material mat = new Material(); + mat.setDiffuseColor(0.0f, 0.3f, 1.0f); + mat.setAmbientColor(0.0f, 0.0f, 0.0f); + mat.setEmissiveColor(0.0f, 0.0f, 0.0f); + mat.setSpecularColor(0.0f, 0.0f, 0.0f); + mat.setShininess(5.0f); + ap1.setMaterial(mat); + + Object3D pochaBody = null; + try { + pochaBody = ModelFactory.loadModel(fragment.getResources(), "pocha.stl", ap1).createObject(); + pochaBody.scale(5.0); + } catch (Exception e) { + e.printStackTrace(); + } + OtherPlayerBullet bullet = new OtherPlayerBullet(pochaBody); + universe.place(entry.getKey(), bullet); + universe.place(bullet); + } + universe.apply(entry.getKey(), properties); + } + } + // 見えなくなったキャラクターの削除 + for (String key : lastVisibleBullets.keySet()) { + if (visibleBullets.get(key) == null) { + universe.displace(key); + } + } + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherBulletsManager.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherBulletsManager.java deleted file mode 100644 index eb18cee..0000000 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherBulletsManager.java +++ /dev/null @@ -1,116 +0,0 @@ -package org.ntlab.radishforandroidstudio.cactusClient.models; - -import net.arnx.jsonic.JSON; -import net.arnx.jsonic.TypeReference; - -import org.ntlab.radishforandroidstudio.cactusClient.connections.BulletGetConnection; -import org.ntlab.radishforandroidstudio.framework.gameMain.GameBaseModel; -import org.ntlab.radishforandroidstudio.framework.gameMain.RealTime3DFragment; -import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; -import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; -import org.ntlab.radishforandroidstudio.framework.model3D.Property3D; -import org.ntlab.radishforandroidstudio.framework.model3D.Universe; -import org.ntlab.radishforandroidstudio.framework.network.CallBack; -import org.ntlab.radishforandroidstudio.java3d.Appearance; -import org.ntlab.radishforandroidstudio.java3d.Material; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -public class OtherBulletsManager implements GameBaseModel, CallBack { - private Universe universe; - private RealTime3DFragment fragment; - private BulletGetConnection con; - private int nextConnectRenaimdTime = 0; - private int connectInterval = 100; - private Map visibleBullets = new HashMap<>(); - private String instanceId; - private String playerId; - - public OtherBulletsManager(RealTime3DFragment fragment, Universe universe) { - this.universe = universe; - this.fragment = fragment; - } - - public void setInstanceId(String id) { - this.instanceId = id; - } - - public void setPlayerId(String id) { - playerId = id; - } - - /** - * 玉の状態を更新する - * - * @author s.iwatani - * @param interval 前回の更新からの時間差 - */ - @Override - public void update(double interval) { - nextConnectRenaimdTime -= interval; - if (nextConnectRenaimdTime <= 0) { - nextConnectRenaimdTime = connectInterval; - con = new BulletGetConnection(instanceId); - con.setCallBack(this); - con.doGet(); - } - } - - @Override - public void onResponse(String response) { - Map lastVisibleBullets = new HashMap<>(visibleBullets); - visibleBullets.clear(); - JSON json = new JSON(); - ArrayList> m = json.decode(response, new TypeReference>>(){}); - for(Map eachPlayerBullets : m) { - for (Map.Entry entry : eachPlayerBullets.entrySet()) { - visibleBullets.put(entry.getKey(), 1); - ArrayList properties = new ArrayList<>(); - DummyBullet player = entry.getValue(); - - // 自分自身は無視する - if (entry.getKey().equals(playerId)) continue; - - // 情報の取得 -// 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)angle.get("x")).doubleValue(), ((BigDecimal)angle.get("y")).doubleValue(), ((BigDecimal)angle.get("z")).doubleValue(), ((BigDecimal)angle.get("w")).doubleValue()); - -// properties.add(player.getPosition()); -// properties.add(player.getAngle()); - - if (!universe.doHaveObj(entry.getKey())) { - Appearance ap1 = new Appearance(); - Material mat = new Material(); - mat.setDiffuseColor(0.0f, 0.3f, 1.0f); - mat.setAmbientColor(0.0f, 0.0f, 0.0f); - mat.setEmissiveColor(0.0f, 0.0f, 0.0f); - mat.setSpecularColor(0.0f, 0.0f, 0.0f); - mat.setShininess(5.0f); - ap1.setMaterial(mat); - - Object3D pochaBody = null; - try { - pochaBody = ModelFactory.loadModel(fragment.getResources(), "pocha.stl", ap1).createObject(); - pochaBody.scale(5.0); - } catch (Exception e) { - e.printStackTrace(); - } - OtherPlayerBullet bullet = new OtherPlayerBullet(pochaBody); - universe.place(entry.getKey(), bullet); - universe.place(bullet); - } - universe.apply(entry.getKey(), properties); - } - } - // 見えなくなったキャラクターの削除 - for (String key : lastVisibleBullets.keySet()) { - if (visibleBullets.get(key) == null) { - universe.displace(key); - } - } - } -} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OwnBullets.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OwnBullets.java new file mode 100644 index 0000000..0338eea --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OwnBullets.java @@ -0,0 +1,82 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import android.content.res.Resources; + +import org.ntlab.radishforandroidstudio.framework.animation.Animation3D; +import org.ntlab.radishforandroidstudio.framework.gameMain.GameBaseModel; +import org.ntlab.radishforandroidstudio.framework.gameMain.OvergroundActor; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Universe; +import org.ntlab.radishforandroidstudio.java3d.Appearance; +import org.ntlab.radishforandroidstudio.java3d.Material; + +import java.util.ArrayList; +import java.util.Iterator; + +public class OwnBullets implements GameBaseModel { + ArrayList bullets = new ArrayList<>(); + String playerId; + String instanceId; + Resources resources; + Universe universe; + + public OwnBullets(Resources resources, Universe universe, String instanceId, String playerId) { + this.resources = resources; + this.universe = universe; + + setInstanceId(instanceId); + setPlayerId(playerId); + } + + public void createBullet(Position3D pos, Quaternion3D angle) { + Appearance ap1 = new Appearance(); + Material mat = new Material(); + mat.setDiffuseColor(0.0f, 0.3f, 1.0f); + mat.setAmbientColor(0.0f, 0.0f, 0.0f); + mat.setEmissiveColor(0.0f, 0.0f, 0.0f); + mat.setSpecularColor(0.0f, 0.0f, 0.0f); + mat.setShininess(5.0f); + ap1.setMaterial(mat); + + Object3D pochaBody = null; + try { + pochaBody = ModelFactory.loadModel(resources, "pocha.stl", ap1).createObject(); + pochaBody.scale(0.5); + } catch (Exception e) { + e.printStackTrace(); + } + Bullet b = new Bullet(pochaBody, null); + bullets.add(b); + universe.place(b); + } + + public void deleteBullet(Bullet bullet) { + // TODO: 弾消し情報を送信 + } + + @Override + public void update(double interval) { + for (Iterator bulletIterator = bullets.iterator(); bulletIterator.hasNext();) { + Bullet bullet = bulletIterator.next(); + bullet.update(interval); + + // 弾削除 + if (bullet.isDelete()) { + deleteBullet(bullet); + bulletIterator.remove(); + } + } + } + + @Override + public void setInstanceId(String id) { + instanceId = id; + } + + public void setPlayerId(String id) { + playerId = id; + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OwnPlayer.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OwnPlayer.java index 8004c06..dd79715 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OwnPlayer.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OwnPlayer.java @@ -35,6 +35,7 @@ private int nextConnectRenaimdTime = 0; private int connectInterval = 300; private String playerId; + private OwnBullets bullets; public OwnPlayer(Player player, Resources resources, Universe universe, Camera3D camera, String playerId) { this.player = player; @@ -115,24 +116,28 @@ nextConnectRenaimdTime -= interval; if (nextConnectRenaimdTime <= 0) { - nextConnectRenaimdTime = connectInterval; - con = new CharacterConnection(playerId); - con.setCallBack(this); - - Quaternion3D q = ((Solid3D)(actor.getBody())).getQuaternion(); - player.setPosition(actor.getPosition()); - player.setAngle(q); - - JSON json = new JSON(); - con.addFormParam("characterID", player.getCharacterID()); - con.addFormParam("cameraState", json.encode(player.getCameraState())); - con.addFormParam("position", json.encode(player.getPosition())); - con.addFormParam("animationClassToStart", json.encode(player.getEmoteState())); - con.addFormParam("angle", "{ \"x\":" + q.getX() + ", \"y\":" + q.getY() + ", \"z\":" + q.getZ() + ", \"w\":" + q.getW() + "}"); - con.doPut(); + sendPlayerInfo(); } } + public void sendPlayerInfo() { + nextConnectRenaimdTime = connectInterval; + con = new CharacterConnection(playerId); + con.setCallBack(this); + + Quaternion3D q = ((Solid3D)(actor.getBody())).getQuaternion(); + player.setPosition(actor.getPosition()); + player.setAngle(q); + + JSON json = new JSON(); + con.addFormParam("characterID", player.getCharacterID()); + con.addFormParam("cameraState", json.encode(player.getCameraState())); + con.addFormParam("position", json.encode(player.getPosition())); + con.addFormParam("animationClassToStart", json.encode(player.getEmoteState())); + con.addFormParam("angle", "{ \"x\":" + q.getX() + ", \"y\":" + q.getY() + ", \"z\":" + q.getZ() + ", \"w\":" + q.getW() + "}"); + con.doPut(); + } + @Override public void setInstanceId(String id) { player.setInstanceID(id);