summaryrefslogtreecommitdiff
path: root/src/tesseract/objects/ModifyableParticle.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/tesseract/objects/ModifyableParticle.java')
-rw-r--r--src/tesseract/objects/ModifyableParticle.java106
1 files changed, 105 insertions, 1 deletions
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;
+ }
}