summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/CollidableObject.java7
-rw-r--r--src/tesseract/World.java9
-rw-r--r--src/tesseract/objects/DyingParticle.java128
-rw-r--r--src/tesseract/objects/ModifyableParticle.java106
-rw-r--r--src/tesseract/objects/remote/TankMenuItem.java2
5 files changed, 248 insertions, 4 deletions
diff --git a/src/common/CollidableObject.java b/src/common/CollidableObject.java
index 0549335..2174e15 100644
--- a/src/common/CollidableObject.java
+++ b/src/common/CollidableObject.java
@@ -15,6 +15,7 @@ import com.sun.j3d.utils.geometry.Primitive;
public abstract class CollidableObject implements Serializable {
private static final long serialVersionUID = 3667108226485766929L;
protected float inverseMass;
+ protected boolean detachMe = false;
// The center of mass in the local coordinate system
protected Vector3f centerOfMass;
protected Vector3f position, previousPosition;
@@ -110,6 +111,7 @@ public abstract class CollidableObject implements Serializable {
public void detach() {
BG.detach();
+ detachMe = true;
}
public void updateState(float duration) {
@@ -596,4 +598,9 @@ public abstract class CollidableObject implements Serializable {
}
return appearance;
}
+
+ public boolean removeMe() {
+ // TODO Auto-generated method stub
+ return detachMe;
+ }
}
diff --git a/src/tesseract/World.java b/src/tesseract/World.java
index b2ca82a..3611806 100644
--- a/src/tesseract/World.java
+++ b/src/tesseract/World.java
@@ -215,10 +215,12 @@ public class World implements Observer {
Iterator<PhysicalObject> itr = myObjects.iterator();
List<PhysicalObject> children = new LinkedList<PhysicalObject>();
-
+ List<CollidableObject> toRemove = new LinkedList<CollidableObject>();
for (int i = 0; i < myObjects.size(); i++) {
CollidableObject obj = myObjects.get(i);
-
+ if (obj.removeMe()) {
+ toRemove.add(obj);
+ }
// Apply forces
for (Force force : myForces) {
if(!(obj instanceof Blimp)) {
@@ -238,6 +240,9 @@ public class World implements Observer {
}
}
+ myObjects.removeAll(toRemove);
+
+
/*
In the "tick" method of your application, rather than call the old form of
resolveCollisions to completely handle a collision, you can now:
diff --git a/src/tesseract/objects/DyingParticle.java b/src/tesseract/objects/DyingParticle.java
new file mode 100644
index 0000000..1426293
--- /dev/null
+++ b/src/tesseract/objects/DyingParticle.java
@@ -0,0 +1,128 @@
+package tesseract.objects;
+
+import java.awt.Color;
+
+import javax.media.j3d.Appearance;
+import javax.media.j3d.ColoringAttributes;
+import javax.media.j3d.Material;
+import javax.media.j3d.Shape3D;
+import javax.media.j3d.TransformGroup;
+import javax.vecmath.Color3f;
+import javax.vecmath.Vector3f;
+
+import com.sun.j3d.utils.geometry.Sphere;
+
+/**
+ * A dying particle object.
+ *
+ * Particle.java used as code base, parts also taken from ModifyableParticle.
+ *
+ * @author Phillip Cardon
+ * @author Jesse Morgan
+ */
+public class DyingParticle extends PhysicalObject {
+ /**
+ * Rendered radius of particle.
+ */
+ private static final float RADIUS = .001f;
+
+ /**
+ * Default mass.
+ */
+ private static final float DEFAULT_MASS = .1f;
+
+ /**
+ * Number of divisions in the sphere.
+ */
+ private static final int DIVISIONS = 8;
+ private static final int DEFAULT_LIFE = 6;
+ private TransformGroup myTop;
+ private TransformGroup myBottom;
+
+ private Shape3D myShape;
+
+ private Color3f myColor;
+
+ private int myLife;
+
+ /**
+ * Create a new Particle.
+ *
+ * @param position Initial position.
+ * @param color Initial color. Null for random.
+ */
+ public DyingParticle(final Vector3f position, final float mass, final Color3f color, final TransformGroup top,
+ final TransformGroup bottom) {
+ super(position, mass);
+ myTop = top;
+ myBottom = bottom;
+ myBottom.addChild(createShape(color));
+ myColor = color;
+ setShape(myTop);
+ myLife = DEFAULT_LIFE;
+ }
+
+ /**
+ * Create a new particle of the give color.
+ *
+ * @param theColor The particle color or null for random.
+ * @return A sphere to visually represent the particle.
+ */
+ private Shape3D createShape(final Color3f theColor) {
+
+ Color3f color = theColor;
+
+ ColoringAttributes cAttr;
+
+ if (color == null) {
+ Color randomColor = Color.getHSBColor((float) Math.random(), 1, 1);
+ color = new Color3f(randomColor);
+ }
+ /*
+ cAttr = new ColoringAttributes(color, ColoringAttributes.FASTEST);
+ Appearance appearance = new Appearance();
+ Material mat = new Material();
+ mat.setAmbientColor(color);
+ mat.setDiffuseColor(color);
+ appearance.setMaterial(mat);
+ appearance.setColoringAttributes(cAttr);
+
+ Sphere sphere = new Sphere(RADIUS, Sphere.ENABLE_GEOMETRY_PICKING,
+ DIVISIONS, appearance);
+ */
+
+ Sphere sphere = new Sphere(RADIUS, Sphere.ENABLE_GEOMETRY_PICKING,
+ DIVISIONS);
+ Shape3D shape = sphere.getShape();
+ sphere.removeAllChildren();
+ Appearance meshApp = new Appearance();
+ Material surface = new Material();
+ surface.setDiffuseColor(color);
+ meshApp.setMaterial(surface);
+ meshApp.setColoringAttributes(new ColoringAttributes(color,
+ ColoringAttributes.FASTEST));
+ shape.setAppearance(meshApp);
+ myShape = shape;
+ myShape.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+ return shape;
+ }
+
+ public boolean isDead() {
+ return myLife <= 0;
+ }
+
+ public void updateState(float duration) {
+ if (!isDead()) {
+ myLife--;
+ super.updateState(duration);
+ } else {
+ super.updateState(duration);
+ this.detach();
+ }
+
+ }
+
+ public void setAcceleration(Vector3f accelerator) {
+ this.velocity = accelerator;
+ }
+}
diff --git a/src/tesseract/objects/ModifyableParticle.java b/src/tesseract/objects/ModifyableParticle.java
index 980436e..68139a4 100644
--- a/src/tesseract/objects/ModifyableParticle.java
+++ b/src/tesseract/objects/ModifyableParticle.java
@@ -1,8 +1,12 @@
package tesseract.objects;
import java.awt.Color;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
import javax.media.j3d.Appearance;
+import javax.media.j3d.BranchGroup;
import javax.media.j3d.ColoringAttributes;
import javax.media.j3d.Material;
import javax.media.j3d.Shape3D;
@@ -11,6 +15,8 @@ import javax.vecmath.Color3f;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.geometry.Sphere;
+import common.CollidableObject;
+import common.CollisionInfo;
/**
* A particle object.
@@ -33,6 +39,17 @@ public class ModifyableParticle extends PhysicalObject {
*/
private static final int DIVISIONS = 8;
+ private TransformGroup myTop;
+ private TransformGroup myBottom;
+ private TransformGroup myDetach;
+
+ private boolean spawnKids;
+
+ private float myMass;
+
+ private Color3f myColor;
+
+ private boolean kidsSpawned;
/**
* Create a new Particle.
@@ -43,8 +60,17 @@ public class ModifyableParticle extends PhysicalObject {
public ModifyableParticle(final Vector3f position, final float mass, final Color3f color, final TransformGroup top,
final TransformGroup bottom) {
super(position, mass);
+ myTop = (TransformGroup) top.cloneTree();
+ myBottom = getBottom(myTop);
+ myMass = mass;
+ myColor = color;
+ myDetach = top;
bottom.addChild(createShape(color));
- setShape(top);
+ BranchGroup bg = new BranchGroup();
+ bg.addChild(top);
+ setShape(bg);
+ spawnKids = false;
+ kidsSpawned = false;
}
/**
@@ -95,4 +121,82 @@ public class ModifyableParticle extends PhysicalObject {
accelerator.scale(15f);
this.velocity = accelerator;
}
+
+ public void updateState(float duration) {
+ if (velocity.x < 0f && previousVelocity.x > 0f) {
+ explode();
+ } else if (velocity.x > 0f && previousVelocity.x < 0f) {
+ explode();
+ }
+
+ if (velocity.y < 0f && previousVelocity.y > 0f) {
+ explode();
+ } else if (velocity.y > 0f && previousVelocity.y < 0f) {
+ explode();
+ }
+
+ if (velocity.z < 0f && previousVelocity.z > 0f) {
+ explode();
+ } else if (velocity.z > 0f && previousVelocity.z < 0f) {
+ explode();
+ }
+ if (!kidsSpawned) {
+ super.updateState(duration);
+ } else {
+ detach();
+ }
+ }
+
+ public void explode() {
+ if (!kidsSpawned){
+ spawnKids = true;
+ }
+ //detach();
+ }
+
+ public List<PhysicalObject> spawnChildren(float duration) {
+ List<PhysicalObject> children = super.spawnChildren(duration);
+
+ if (children == null) {
+ children = new LinkedList<PhysicalObject>();
+ }
+ if (spawnKids) {
+ //
+ for (int i = 0; i < 20; i++) {
+ Vector3f childVelocity = new Vector3f();
+ childVelocity.x = (float)(Math.random() - 0.5);
+ childVelocity.y = (float)(Math.random() - 0.5);
+ childVelocity.z = (float)(Math.random() - 0.5);
+ childVelocity.normalize();
+ childVelocity.scale(0.2f);
+ childVelocity.add(getVelocity());
+ TransformGroup cloned = (TransformGroup) myTop.cloneTree();
+ TransformGroup clonedBottom = getBottom(cloned);
+ DyingParticle shrapnel = new DyingParticle(position, myMass, myColor, cloned, clonedBottom);
+ shrapnel.setAcceleration(childVelocity);
+ children.add(shrapnel);
+ }
+ kidsSpawned = true;
+ spawnKids = false;
+ detach();
+ }
+
+ return children;
+ }
+
+ /**
+ * Gets a bottom TransformGroup in a tree consisting of TransformGroups.
+ * @param cloned
+ * @return bottom node
+ */
+ private TransformGroup getBottom(TransformGroup cloned) {
+ if (cloned.numChildren() != 0) {
+ for (int i = 0; i < cloned.numChildren(); i++) {
+ if (cloned.getChild(i) instanceof TransformGroup) {
+ return getBottom((TransformGroup) cloned.getChild(i));
+ }
+ }
+ }
+ return cloned;
+ }
}
diff --git a/src/tesseract/objects/remote/TankMenuItem.java b/src/tesseract/objects/remote/TankMenuItem.java
index 7a8b085..9c16880 100644
--- a/src/tesseract/objects/remote/TankMenuItem.java
+++ b/src/tesseract/objects/remote/TankMenuItem.java
@@ -14,6 +14,6 @@ public class TankMenuItem extends RemoteObjectMenuItem {
@Override
protected RemoteObject createRemoteObject() {
- return new Tank(new Vector3f(), 10);
+ return new Tank(new Vector3f(), 100);
}
}