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 48be4fe..7aab4ae 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 @@ -98,7 +98,7 @@ @Override public void update(double interval) { // サーバに弾を作成 - if (!isCreatedOnServer) { + if (!isCreatedOnServer && !instanceId.equals("") && !playerId.equals("")) { BulletCreateConnection con = new BulletCreateConnection(instanceId, playerId); // set parameter 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 index 12ef5ce..bfdd37c 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/BulletsManager.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/BulletsManager.java @@ -1,11 +1,12 @@ package org.ntlab.radishforandroidstudio.cactusClient.models; +import android.content.res.Resources; + 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; @@ -17,20 +18,24 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import java.util.Set; public class BulletsManager implements GameBaseModel, CallBack { private Universe universe; - private RealTime3DFragment fragment; + private Resources resources; private BulletGetConnection con; private int nextConnectRenaimdTime = 0; private int connectInterval = 100; private Map visibleBullets = new HashMap<>(); + private Map playerVisibleBullets = new HashMap<>(); private String instanceId; private String playerId; - public BulletsManager(RealTime3DFragment fragment, Universe universe) { + private Set bulletsSet; + + public BulletsManager(Resources fragment, Universe universe) { this.universe = universe; - this.fragment = fragment; + this.resources = fragment; } public void setInstanceId(String id) { @@ -61,6 +66,7 @@ @Override public void onResponse(String response) { Map lastVisibleBullets = new HashMap<>(visibleBullets); + Map lastPlayerVisibleBullets = new HashMap<>(playerVisibleBullets); visibleBullets.clear(); JSON json = new JSON(); ArrayList> m = json.decode(response, new TypeReference>>(){}); @@ -71,7 +77,10 @@ DummyBullet player = entry.getValue(); // 自分自身は無視する - if (entry.getKey().equals(playerId)) continue; + if (entry.getKey().equals(playerId)) { + playerVisibleBullets.put(entry.getKey(), 1); + continue; + } // 情報の取得 // Map position = (Map)player.get("position"); @@ -94,7 +103,7 @@ Object3D pochaBody = null; try { - pochaBody = ModelFactory.loadModel(fragment.getResources(), "pocha.stl", ap1).createObject(); + pochaBody = ModelFactory.loadModel(resources, "pocha.stl", ap1).createObject(); pochaBody.scale(5.0); } catch (Exception e) { e.printStackTrace(); @@ -112,5 +121,25 @@ universe.displace(key); } } + + // 消えた弾の削除(プレイヤーのみ) + for(String key: lastPlayerVisibleBullets.keySet()) { + bulletsSet.add(key); + } + } + + /** + * 消えた弾のうち,セットしたプレイヤーに該当する弾を取得する + * + * @return ArrayList + */ + public ArrayList getDeletedPlayerBullets() { + ArrayList bullets = new ArrayList<>(); + + for(String key : bulletsSet) { + bullets.add(key); + } + bulletsSet.clear(); + return bullets; } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CactusModels.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CactusModels.java index 9506eaf..5775dd2 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CactusModels.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CactusModels.java @@ -8,17 +8,20 @@ /** * モデルを管理する * + * singleton + * * @author s.iwatani */ public class CactusModels extends GameBaseModelManager implements GameBaseModel { private String instanceId = ""; + private static CactusModels singleton = new CactusModels(); - public CactusModels() { + private CactusModels() { super(); } - public CactusModels(RealTime3DFragment fragment, Universe universe) { - super(fragment, universe); + static public CactusModels getInstance() { + return singleton; } public void setInstanceId(String id) { 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 index 0338eea..8a1fd8f 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OwnBullets.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OwnBullets.java @@ -22,10 +22,12 @@ String instanceId; Resources resources; Universe universe; + CactusModels cactusModels; public OwnBullets(Resources resources, Universe universe, String instanceId, String playerId) { this.resources = resources; this.universe = universe; + cactusModels = CactusModels.getInstance(); setInstanceId(instanceId); setPlayerId(playerId); @@ -51,9 +53,10 @@ Bullet b = new Bullet(pochaBody, null); bullets.add(b); universe.place(b); + cactusModels.addModel(b); } - public void deleteBullet(Bullet bullet) { + public void sendDeleteBulletForServer(Bullet bullet) { // TODO: 弾消し情報を送信 } @@ -65,12 +68,27 @@ // 弾削除 if (bullet.isDelete()) { - deleteBullet(bullet); + sendDeleteBulletForServer(bullet); bulletIterator.remove(); } } } + public void deleteBullets(ArrayList deletedBullets) { + for (Iterator bulletIterator = bullets.iterator(); bulletIterator.hasNext();) { + Bullet bullet = bulletIterator.next(); + + for(String deleteBullet : deletedBullets) { // 弾削除 + if (bullet.getUuid().equals(bullets)) { + universe.displace(bullet); + sendDeleteBulletForServer(bullet); + bulletIterator.remove(); + break; + } + } + } + } + @Override public void setInstanceId(String id) { instanceId = 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 dd79715..887a8ed 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 @@ -24,6 +24,8 @@ import org.ntlab.radishforandroidstudio.java3d.Material; import org.ntlab.radishforandroidstudio.java3d.Vector3d; +import java.util.ArrayList; + public class OwnPlayer implements PadListener, GameBaseModel, CallBack { private boolean isTouched = false; private float touchX = 0.0f; @@ -37,9 +39,11 @@ private String playerId; private OwnBullets bullets; - public OwnPlayer(Player player, Resources resources, Universe universe, Camera3D camera, String playerId) { + public OwnPlayer(Player player, Resources resources, Universe universe, Camera3D camera, String playerId, String instanceId) { this.player = player; setPlayerId(playerId); + setInstanceId(instanceId); + bullets = new OwnBullets(resources, universe, instanceId, playerId); // キャラクタの作成 Appearance ap1 = new Appearance(); @@ -114,6 +118,11 @@ actor.setVelocity(vel); } + // とりあえず一定時間ごとに打つ + if (nextConnectRenaimdTime <= 0) { + bullets.createBullet(player.getPosition(), player.getAngle()); + } + nextConnectRenaimdTime -= interval; if (nextConnectRenaimdTime <= 0) { sendPlayerInfo(); @@ -153,4 +162,8 @@ con.setCallBack(this); con.doDelete(); } + + public void deleteBullets(ArrayList bullets) { + this.bullets.deleteBullets(bullets); + } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java index 11cd8b5..7a35d90 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java @@ -10,6 +10,7 @@ import android.view.ViewGroup; import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.models.BulletsManager; import org.ntlab.radishforandroidstudio.cactusClient.models.CactusModels; import org.ntlab.radishforandroidstudio.cactusClient.models.OtherPlayerCharactersModel; import org.ntlab.radishforandroidstudio.cactusClient.models.OwnPlayer; @@ -34,6 +35,7 @@ RWTPad pad = null; private OwnPlayer player; private OtherPlayerCharactersModel otherPlayerCharactersModel; + private BulletsManager bulletsManager; public PlayerFragment() { // Required empty public constructor @@ -42,7 +44,9 @@ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - modelManager = new CactusModels(this, universe); + modelManager = CactusModels.getInstance(); + modelManager.setFragment(this); + modelManager.setUniverse(universe); //環境光 AmbientLight amblight = new AmbientLight(new Color3f(1.0f, 1.0f, 1.0f)); @@ -88,12 +92,16 @@ Bundle bundle = getArguments(); // プレイヤーの作成とインスタンスIDのセット String playerId = bundle.getString("playerId"); - player = new OwnPlayer((Player)bundle.getSerializable("player"), getResources(), universe, camera, playerId); - modelManager.addModel(player); + String instanceId = bundle.getString("instanceId"); + bulletsManager.setPlayerId(playerId); + player = new OwnPlayer((Player)bundle.getSerializable("player"), getResources(), universe, camera, playerId, instanceId); otherPlayerCharactersModel = new OtherPlayerCharactersModel(this, universe); otherPlayerCharactersModel.setPlayerId(playerId); + bulletsManager = new BulletsManager(this.getResources(), universe); modelManager.addModel(otherPlayerCharactersModel); - modelManager.setInstanceId(bundle.getString("instanceId")); + modelManager.addModel(bulletsManager); + modelManager.addModel(player); + modelManager.setInstanceId(instanceId); initGameWindowView(); return parentView; } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/GameBaseModelManager.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/GameBaseModelManager.java index 3dc35ad..c9b2b14 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/GameBaseModelManager.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/GameBaseModelManager.java @@ -6,17 +6,20 @@ public abstract class GameBaseModelManager implements GameBaseModel { protected ArrayList models = new ArrayList<>(); - protected RealTime3DFragment fragment = null; - protected Universe universe = null; - public GameBaseModelManager() { - } - - public GameBaseModelManager(RealTime3DFragment fragment, Universe universe) { - this.universe = universe; + public void setFragment(RealTime3DFragment fragment) { this.fragment = fragment; } + public void setUniverse(Universe universe) { + this.universe = universe; + } + + protected RealTime3DFragment fragment = null; + protected Universe universe = null; + + protected GameBaseModelManager() { + } /** * GameBaseModelを追加