diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index f414542..652c853 100644 --- a/.idea/caches/build_file_checksums.ser +++ b/.idea/caches/build_file_checksums.ser Binary files differ diff --git a/app/src/main/assets/bullet.obj b/app/src/main/assets/bullet.obj index d2df865..ed1b502 100644 --- a/app/src/main/assets/bullet.obj +++ b/app/src/main/assets/bullet.obj @@ -1,6 +1,6 @@ # Created by Metasequoia -mtllib bullet.mtl +mtllib myBullet.mtl v 0.000000 0.000000 0.000000 v 0.000000 -0.075890 0.381540 diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/MainActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/MainActivity.java index 0e45aff..0649149 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/MainActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/MainActivity.java @@ -2,9 +2,11 @@ import android.os.Bundle; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.views.PlayerFragment; import org.ntlab.radishforandroidstudio.cactusClient.views.StartFragment; @@ -31,5 +33,24 @@ setContentView(R.layout.activity_main); } - + @Override + public void onBackPressed() { + FragmentManager manager = getSupportFragmentManager(); + if (manager == null) { + super.onBackPressed(); + return; + } + Fragment fragment = manager.findFragmentById(R.id.fragment_place); + if (fragment == null) { + super.onBackPressed(); + return; + } + if (fragment instanceof PlayerFragment) { + manager.beginTransaction().remove(fragment).commit(); + manager.popBackStack(); +// super.onBackPressed(); + return; + } + super.onBackPressed(); + } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/BulletCreateConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/BulletCreateConnection.java new file mode 100644 index 0000000..9a98ec0 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/BulletCreateConnection.java @@ -0,0 +1,9 @@ +package org.ntlab.radishforandroidstudio.cactusClient.connections; + +import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; + +public class BulletCreateConnection extends HttpAsyncConnection { + public BulletCreateConnection(String instanceId, String playerId) { + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/instances/" + instanceId + "/bullets/" + playerId); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/BulletGetConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/BulletGetConnection.java new file mode 100644 index 0000000..515ad36 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/BulletGetConnection.java @@ -0,0 +1,9 @@ +package org.ntlab.radishforandroidstudio.cactusClient.connections; + +import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; + +public class BulletGetConnection extends HttpAsyncConnection { + public BulletGetConnection(String instanceId) { + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/instances/" + instanceId + "/bullets"); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/BulletUpdateConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/BulletUpdateConnection.java new file mode 100644 index 0000000..0d30246 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/BulletUpdateConnection.java @@ -0,0 +1,9 @@ +package org.ntlab.radishforandroidstudio.cactusClient.connections; + +import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; + +public class BulletUpdateConnection extends HttpAsyncConnection { + public BulletUpdateConnection(String instanceId, String playerId, String bulletId) { + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/instances/" + instanceId + "/bullets/" + playerId + "/" + bulletId); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/factory/BulletFactory.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/factory/BulletFactory.java new file mode 100644 index 0000000..be6d8e7 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/factory/BulletFactory.java @@ -0,0 +1,31 @@ +package org.ntlab.radishforandroidstudio.cactusClient.factory; + +import android.content.res.Resources; + +import org.ntlab.radishforandroidstudio.cactusClient.models.MyBullet; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.java3d.Appearance; +import org.ntlab.radishforandroidstudio.java3d.Material; + +public abstract class BulletFactory { + public final MyBullet create(Resources resources) { + + Appearance ap1 = createAppearance(); + ap1.setMaterial(createMaterial()); + + Object3D pochaBody = null; + try { + pochaBody = ModelFactory.loadModel(resources, getModelName(), ap1).createObject(); + } catch (Exception e) { + e.printStackTrace(); + } + + MyBullet b = new MyBullet(pochaBody, null); + return b; + } + + protected abstract Material createMaterial(); + protected Appearance createAppearance() { return new Appearance(); } + protected abstract String getModelName(); +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/factory/NormalBulletFactory.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/factory/NormalBulletFactory.java new file mode 100644 index 0000000..a315c50 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/factory/NormalBulletFactory.java @@ -0,0 +1,21 @@ +package org.ntlab.radishforandroidstudio.cactusClient.factory; + +import org.ntlab.radishforandroidstudio.java3d.Material; + +public class NormalBulletFactory extends BulletFactory { + @Override + protected Material createMaterial() { + 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); + return mat; + } + + @Override + protected String getModelName() { + return "pocha.stl"; + } +} 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..28e3d06 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/BulletsManager.java @@ -0,0 +1,151 @@ +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.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.framework.physics.Velocity3D; +import org.ntlab.radishforandroidstudio.java3d.Appearance; +import org.ntlab.radishforandroidstudio.java3d.Material; +import org.ntlab.radishforandroidstudio.java3d.Vector3d; + +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 Resources resources; + private BulletGetConnection con; + private int nextConnectRenaimdTime = 0; + static final private int CONNECT_INTERVAL = 100; + private Map visibleBullets = new HashMap<>(); + private Map playerVisibleBullets = new HashMap<>(); + private String instanceId; + private String playerId; + + private Set bulletsSet; + + public enum BulletType { + Normal + } + + public BulletsManager(Resources fragment, Universe universe) { + this.universe = universe; + this.resources = fragment; + } + + @Override + 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 && instanceId != null) { + nextConnectRenaimdTime = CONNECT_INTERVAL; + con = new BulletGetConnection(instanceId); + con.setCallBack(this); + con.doGet(); + } + } + + @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>>(){}); + for(Map eachPlayerBullets : m) { + for (Map.Entry entry : eachPlayerBullets.entrySet()) { + visibleBullets.put(entry.getKey(), 1); + ArrayList properties = new ArrayList<>(); + + // 自分自身は無視する + if (entry.getKey().equals(playerId)) { + playerVisibleBullets.put(entry.getKey(), 1); + 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(resources, "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); + } + } + + // 消えた弾の削除(プレイヤーのみ) + 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/DummyBullet.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/DummyBullet.java new file mode 100644 index 0000000..c900e77 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/DummyBullet.java @@ -0,0 +1,4 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +public class DummyBullet { +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/MyBullet.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/MyBullet.java new file mode 100644 index 0000000..ba20819 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/MyBullet.java @@ -0,0 +1,161 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import android.telecom.Call; + +import net.arnx.jsonic.JSON; + +import org.ntlab.radishforandroidstudio.cactusClient.connections.BulletCreateConnection; +import org.ntlab.radishforandroidstudio.cactusClient.connections.BulletGetConnection; +import org.ntlab.radishforandroidstudio.cactusClient.connections.BulletUpdateConnection; +import org.ntlab.radishforandroidstudio.framework.animation.Animation3D; +import org.ntlab.radishforandroidstudio.framework.gameMain.Actor; +import org.ntlab.radishforandroidstudio.framework.gameMain.GameBaseModel; +import org.ntlab.radishforandroidstudio.framework.model3D.CollisionResult; +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Placeable; +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; +import org.ntlab.radishforandroidstudio.framework.network.CallBack; +import org.ntlab.radishforandroidstudio.framework.physics.Force3D; +import org.ntlab.radishforandroidstudio.framework.physics.Solid3D; +import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D; +import org.ntlab.radishforandroidstudio.java3d.Vector3d; + +import java.util.ArrayList; +import java.util.UUID; + +public class MyBullet extends Actor implements GameBaseModel, CallBack { + private String instanceId; + private String playerId; + private String uuid; + private DummyBullet bullet; + final private int INIT_UPDATE_INTERVAL = 100; + private int updateInterval = INIT_UPDATE_INTERVAL; + private boolean isCreatedOnServer = false; + private boolean isWaitCreatingOnServer = false; + private boolean isDelete = false; + + public MyBullet(Object3D body, Animation3D animation) { + super(body, animation); + initUuid(); + } + + public MyBullet(Solid3D body, Animation3D animation) { + super(body, animation); + initUuid(); + } + + public void initUuid() { + if (getUuid() == null || getUuid().equals("")) { + uuid = UUID.randomUUID().toString(); + } + } + + public String getUuid() { + return uuid; + } + + public boolean isDelete() { + return isDelete; + } + + @Override + public void onEndFall() { + + } + + @Override + public void onIntersect(CollisionResult normal, long interval) { + + } + + @Override + public void onEndAnimation() { + + } + + @Override + public void addCollidable(ArrayList pList) { + + } + + @Override + public void onCollisionEnter(Placeable p) { + + } + + @Override + public void onCollisionStay(Placeable p) { + + } + + @Override + public void onCollisionExit(Placeable p) { + + } + + @Override + public Force3D getGravity() { + return Force3D.ZERO; + } + + + @Override + final public void update(double interval) { + progress(interval); + // サーバに弾を作成 + if (!isCreatedOnServer && !instanceId.equals("") && !playerId.equals("") && !isWaitCreatingOnServer) { + JSON json = new JSON(); + Quaternion3D q = ((Solid3D)(getBody())).getQuaternion(); + BulletCreateConnection con = new BulletCreateConnection(instanceId, playerId); + con.setCallBack(this); + con.addFormParam("bulletID", getUuid()); + con.addFormParam("position", json.encode(getPosition())); + con.addFormParam("angle", "{ \"x\":" + q.getX() + ", \"y\":" + q.getY() + ", \"z\":" + q.getZ() + ", \"w\":" + q.getW() + "}"); + con.doPost(); + isWaitCreatingOnServer = true; + System.out.println("create shot uuid:" + getUuid()); + } + else if (isCreatedOnServer && !isWaitCreatingOnServer) { + // サーバの弾の情報を更新 + updateInterval -= interval; + if (updateInterval <= 0 && isCreatedOnServer) { + JSON json = new JSON(); + Quaternion3D q = ((Solid3D)(getBody())).getQuaternion(); + updateInterval = INIT_UPDATE_INTERVAL; + BulletUpdateConnection con = new BulletUpdateConnection(instanceId, playerId, getUuid()); + con.setCallBack(this); + con.addFormParam("position", json.encode(getPosition())); + con.addFormParam("angle", "{ \"x\":" + q.getX() + ", \"y\":" + q.getY() + ", \"z\":" + q.getZ() + ", \"w\":" + q.getW() + "}"); + con.doPut(); + } + } + } + + public void progress(double interval) { + + } + + public void init(Position3D pos, Quaternion3D angle) { + setPosition(pos); + Vector3d v = new Vector3d(1.f, 0, 0); + v = v.rotate(angle); + setVelocity(new Velocity3D(v)); + } + + + @Override + public void setInstanceId(String id) { + instanceId = id; + } + + public void setPlayerid(String id) { + playerId = id; + } + + @Override + public void onResponse(String response) { + isWaitCreatingOnServer = false; + isCreatedOnServer = true; + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/NormalBullet.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/NormalBullet.java new file mode 100644 index 0000000..66e0a71 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/NormalBullet.java @@ -0,0 +1,15 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import org.ntlab.radishforandroidstudio.framework.animation.Animation3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.framework.physics.Solid3D; + +public class NormalBullet extends MyBullet { + public NormalBullet(Object3D body, Animation3D animation) { + super(body, animation); + } + + public NormalBullet(Solid3D body, Animation3D animation) { + super(body, animation); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerBullet.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerBullet.java new file mode 100644 index 0000000..77546d5 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerBullet.java @@ -0,0 +1,9 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; + +public class OtherPlayerBullet extends Object3D { + public OtherPlayerBullet(Object3D obj) { + super(obj); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerCharacter.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerCharacter.java index 9357fc3..a36c44a 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerCharacter.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OtherPlayerCharacter.java @@ -6,8 +6,6 @@ import java.util.ArrayList; public class OtherPlayerCharacter extends Object3D { - private Universe universe = null; - public OtherPlayerCharacter(Object3D body) { super(body); } 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 af8225e..d81cfb6 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 @@ -4,7 +4,6 @@ import net.arnx.jsonic.TypeReference; import org.ntlab.radishforandroidstudio.cactusClient.connections.PlayersConnection; -import org.ntlab.radishforandroidstudio.framework.gameMain.Actor; import org.ntlab.radishforandroidstudio.framework.gameMain.GameBaseModel; import org.ntlab.radishforandroidstudio.framework.gameMain.RealTime3DFragment; import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; @@ -27,10 +26,9 @@ public class OtherPlayerCharactersModel implements GameBaseModel, CallBack { private Universe universe; private RealTime3DFragment fragment; - private ArrayList otherCharacters = new ArrayList<>(); private PlayersConnection con; private int nextConnectRenaimdTime = 0; - private int connectInterval = 300; + static final private int CONNECT_INTERVAL = 300; private Map visibleCharacters = new HashMap<>(); private String instanceId; private String playerId; @@ -58,7 +56,7 @@ public void update(double interval) { nextConnectRenaimdTime -= interval; if (nextConnectRenaimdTime <= 0) { - nextConnectRenaimdTime = connectInterval; + nextConnectRenaimdTime = CONNECT_INTERVAL; con = new PlayersConnection(); con.addQueryParam("instanceId", instanceId); con.setCallBack(this); @@ -78,7 +76,6 @@ Player player = entry.getValue(); // 自分自身は無視する - System.out.println(entry.getKey() + ", " + playerId); if (entry.getKey().equals(playerId)) continue; // 情報の取得 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..27d1125 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/OwnBullets.java @@ -0,0 +1,105 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import android.content.res.Resources; + +import org.ntlab.radishforandroidstudio.framework.event.BulletShotEvent; +import org.ntlab.radishforandroidstudio.framework.gameMain.GameBaseModel; +import org.ntlab.radishforandroidstudio.framework.listener.BulletShotListener; +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.framework.subject.BulletShotSubject; + +import java.util.ArrayList; +import java.util.Iterator; + +public class OwnBullets implements GameBaseModel, BulletShotListener { + private ArrayList bullets = new ArrayList<>(); + private String playerId; + private String instanceId; + private Resources resources; + private Universe universe; + private CactusModels cactusModels; + private Position3D playerPos; + private Quaternion3D playerAngle; + + public OwnBullets(Resources resources, Universe universe, String instanceId, String playerId) { + this.resources = resources; + this.universe = universe; + cactusModels = CactusModels.getInstance(); + + setInstanceId(instanceId); + setPlayerId(playerId); + + BulletShotSubject.getInstance().addListener(this); + } + + public void setPosition(Position3D pos) { + playerPos = pos; + } + + public void setAngle(Quaternion3D angle) { + playerAngle = angle; + } + + public void sendDeleteBulletForServer(MyBullet myBullet) { + // TODO: 弾消し情報を送信 + } + + @Override + public void update(double interval) { + for (Iterator bulletIterator = bullets.iterator(); bulletIterator.hasNext();) { + MyBullet bullet = bulletIterator.next(); + // 弾削除 + if (bullet.isDelete()) { + sendDeleteBulletForServer(bullet); + bulletIterator.remove(); + } + } + } + + public void deleteBullets(ArrayList deletedBullets) { + for (Iterator bulletIterator = bullets.iterator(); bulletIterator.hasNext();) { + MyBullet 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; + } + + public void setPlayerId(String id) { + playerId = id; + } + + /** + * 弾作成のイベント受け + * + * @param event イベントの情報 + * @return + */ + @Override + public boolean onEvent(BulletShotEvent event) { + if (playerPos == null || playerAngle == null || playerId == null || instanceId == null) { + return false; + } + MyBullet b = event.getBullet(); + b.setPlayerid(playerId); + b.setInstanceId(instanceId); + b.init(playerPos, playerAngle); + bullets.add(b); + universe.place(b); + cactusModels.addModel(b); + return true; + } +} 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 4cab8bc..b578b75 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 @@ -17,6 +17,7 @@ import net.arnx.jsonic.JSON; import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.Cactus; import org.ntlab.radishforandroidstudio.cactusClient.connections.CharacterConnection; import org.ntlab.radishforandroidstudio.cactusClient.views.PlayerFragment; import org.ntlab.radishforandroidstudio.framework.RWT.RWTUIFragment; @@ -38,6 +39,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; @@ -49,10 +52,14 @@ 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) { + 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); + CactusModels.getInstance().addModel(bullets); // キャラクタの作成 Appearance ap1 = new Appearance(); @@ -82,7 +89,7 @@ updateCamera(); } - + public void setPlayerId(String id) { playerId = id; } @@ -108,6 +115,12 @@ // System.out.print("onClick押されましたよ----------------------------------------------------"); // } + /** + * パッドを動かしたときのイベント処理 + * + * @param event イベントの情報 + * @return + */ @Override public boolean onEvent(PadEvent event) { Vector3d charaVector3d = actor.getDirection(); @@ -137,6 +150,8 @@ updateCamera(); Velocity3D vel = actor.getVelocity(); Vector3d actorVec = actor.getDirection(); + bullets.setPosition(actor.getPosition()); + bullets.setAngle(((Solid3D)(actor.getBody())).getQuaternion()); if (isTouched) { @@ -178,23 +193,27 @@ 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", json.encode(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() { + 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); @@ -218,4 +237,14 @@ } -} \ No newline at end of file + + public void logout() { + con = new CharacterConnection(playerId); + 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 ec06ad5..2f15c67 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 @@ -16,6 +16,7 @@ import org.ntlab.radishforandroidstudio.R; import org.ntlab.radishforandroidstudio.cactusClient.connections.ObjectsConnection; +import org.ntlab.radishforandroidstudio.cactusClient.models.BulletsManager; import org.ntlab.radishforandroidstudio.cactusClient.models.CactusModels; import org.ntlab.radishforandroidstudio.cactusClient.models.MovableObjectModel; import org.ntlab.radishforandroidstudio.cactusClient.models.Object; @@ -45,6 +46,7 @@ private OwnPlayer player; private Object object; private OtherPlayerCharactersModel otherPlayerCharactersModel; + private BulletsManager bulletsManager; private MovableObjectModel movableObjectModel; private ObjectsConnection con; RWTUIFragment f = null; @@ -56,7 +58,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)); @@ -98,20 +102,25 @@ Bundle bundle = getArguments(); // プレイヤーの作成とインスタンスIDのセット String playerId = bundle.getString("playerId"); - - player = new OwnPlayer((Player) bundle.getSerializable("player"), getResources(), universe, camera, playerId); + String instanceId = bundle.getString("instanceId"); + player = new OwnPlayer((Player)bundle.getSerializable("player"), getResources(), universe, camera, playerId, instanceId); modelManager.addModel(player); otherPlayerCharactersModel = new OtherPlayerCharactersModel(this, universe); otherPlayerCharactersModel.setPlayerId(playerId); + bulletsManager = new BulletsManager(this.getResources(), universe); + bulletsManager.setPlayerId(playerId); + modelManager.addModel(otherPlayerCharactersModel); - modelManager.setInstanceId(bundle.getString("instanceId")); //objectの通信 - String instanceId = bundle.getString("instanceId"); movableObjectModel = new MovableObjectModel(this, universe, instanceId); modelManager.addModel(movableObjectModel); //画面の生成 + modelManager.addModel(bulletsManager); + modelManager.addModel(player); + modelManager.setInstanceId(instanceId); + initGameWindowView(); return parentView; } @@ -146,5 +155,16 @@ pad = (RWTPad) f.findViewById(org.ntlab.radishforandroidstudio.R.id.pad); pad.addListener(player); } + + public void logout() { + player.logout(); + } + + @Override + public void onDestroy() { + System.out.println("destroy"); + logout(); + super.onDestroy(); + } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTButton.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTButton.java new file mode 100644 index 0000000..1a3089d --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTButton.java @@ -0,0 +1,19 @@ +package org.ntlab.radishforandroidstudio.framework.RWT; + +import android.content.Context; +import android.support.v7.widget.AppCompatButton; +import android.util.AttributeSet; + +public class RWTButton extends AppCompatButton { + public RWTButton(Context context) { + super(context); + } + + public RWTButton(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public RWTButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTShotButton.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTShotButton.java new file mode 100644 index 0000000..0b1181e --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTShotButton.java @@ -0,0 +1,40 @@ +package org.ntlab.radishforandroidstudio.framework.RWT; + +import android.content.Context; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import org.ntlab.radishforandroidstudio.cactusClient.factory.NormalBulletFactory; +import org.ntlab.radishforandroidstudio.framework.event.BulletShotEvent; +import org.ntlab.radishforandroidstudio.framework.subject.BulletShotSubject; + +public class RWTShotButton extends RWTButton { + public RWTShotButton(Context context) { + super(context); + } + + public RWTShotButton(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public RWTShotButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + // 弾の種類を取得 + // 今は無し + + // 弾のモデルを作成 + if (event.getAction() == MotionEvent.ACTION_DOWN) { + NormalBulletFactory f = new NormalBulletFactory(); + BulletShotEvent e = new BulletShotEvent(event, f.create(getResources())); + BulletShotSubject.getInstance().notifyListeners(e); + System.out.println("shot!"); + } + invalidate(); + return true; + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/BulletShotEvent.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/BulletShotEvent.java new file mode 100644 index 0000000..26c14d3 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/BulletShotEvent.java @@ -0,0 +1,18 @@ +package org.ntlab.radishforandroidstudio.framework.event; + +import android.view.MotionEvent; + +import org.ntlab.radishforandroidstudio.cactusClient.models.MyBullet; + +public class BulletShotEvent extends MyEvent { + private MyBullet b; + + public BulletShotEvent(MotionEvent e, MyBullet b) { + super(e); + this.b = b; + } + + public MyBullet getBullet() { + return b; + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java index 3b81015..a28f041 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/event/PadEvent.java @@ -3,8 +3,6 @@ import android.view.MotionEvent; public class PadEvent extends MyEvent{ - private MotionEvent e; - /** * パッドを倒した距離 * 範囲は 0<=length<=1 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..c9d94e9 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,21 @@ public abstract class GameBaseModelManager implements GameBaseModel { protected ArrayList models = new ArrayList<>(); - protected RealTime3DFragment fragment = null; - protected Universe universe = null; + protected ArrayList nextAddModels = new ArrayList<>(); - 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を追加 @@ -25,7 +29,7 @@ * @param model 追加したいGameBaseModel */ public void addModel(GameBaseModel model) { - models.add(model); + nextAddModels.add(model); } /** @@ -39,5 +43,9 @@ for (GameBaseModel model: models) { model.update(interval); } + + for (GameBaseModel model : nextAddModels) { + models.add(model); + } } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/BulletShotListener.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/BulletShotListener.java new file mode 100644 index 0000000..965d578 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/listener/BulletShotListener.java @@ -0,0 +1,5 @@ +package org.ntlab.radishforandroidstudio.framework.listener; + +import org.ntlab.radishforandroidstudio.framework.event.BulletShotEvent; + +public interface BulletShotListener extends MyListener {} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/subject/BulletShotSubject.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/subject/BulletShotSubject.java new file mode 100644 index 0000000..be4ec95 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/subject/BulletShotSubject.java @@ -0,0 +1,12 @@ +package org.ntlab.radishforandroidstudio.framework.subject; + +import org.ntlab.radishforandroidstudio.framework.event.BulletShotEvent; +import org.ntlab.radishforandroidstudio.framework.listener.BulletShotListener; + +public class BulletShotSubject extends MySubject { + public final static BulletShotSubject own = new BulletShotSubject(); + + private BulletShotSubject() { super(); } + + public static BulletShotSubject getInstance() { return own; } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/Vector3d.java b/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/Vector3d.java index 0ae7a79..faf1595 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/Vector3d.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/Vector3d.java @@ -1,5 +1,9 @@ package org.ntlab.radishforandroidstudio.java3d; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; + +import java.util.Vector; + public class Vector3d extends Tuple3d { // コンストラクタ @@ -131,4 +135,18 @@ d = 1.0D; return Math.acos(d); } + + /** + * ベクタを回転させる + * + * @param q + * @return Vector3D 回転後のベクタ + */ + public Vector3d rotate(Quaternion3D q) { + Vector3d v = this.clone(); + Transform3D trans = new Transform3D(); + trans.setRotation(q.getQuat()); + trans.transform(v); + return v; + } } diff --git a/app/src/main/res/layout/ui_fragment.xml b/app/src/main/res/layout/ui_fragment.xml index b7877bf..43604b7 100644 --- a/app/src/main/res/layout/ui_fragment.xml +++ b/app/src/main/res/layout/ui_fragment.xml @@ -19,6 +19,16 @@ app:layout_constraintEnd_toStartOf="@+id/Button" app:layout_constraintStart_toStartOf="parent" /> +