碰撞检测

package Collectiontext;

import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.applet.MainFrame;//application
import com.sun.j3d.utils.behaviors.mouse.*;
import java.applet.Applet;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.Enumeration;
import java.util.Vector;

public class Collection extends Applet {
	BackgroundSound myc;

	public BranchGroup createBranchGroup() {
		BranchGroup BranchGroupRoot = new BranchGroup();
		BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
		Color3f bgColor = new Color3f(1.0f, 1.0f, 1.0f); // 白色背景
		Background bg = new Background(bgColor);
		bg.setApplicationBounds(bounds);
		BranchGroupRoot.addChild(bg);
		Color3f directionalColor = new Color3f(1.0f, 1.0f, 1.0f);
		Vector3f vec = new Vector3f(-1.0f, -1.0f, -1.0f);
		DirectionalLight directionalLight = new DirectionalLight(directionalColor, vec); // 白色平行光
		directionalLight.setInfluencingBounds(bounds);
		BranchGroupRoot.addChild(directionalLight);
		Appearance app1 = new Appearance();
		Material material1 = new Material();
		material1.setDiffuseColor(new Color3f(1.0f, .0f, .0f));
		app1.setMaterial(material1);
		TransparencyAttributes transparence = new TransparencyAttributes(1, 0.f);
		app1.setTransparencyAttributes(transparence);
		Appearance app2 = new Appearance();
		Material material2 = new Material();
		material2.setDiffuseColor(new Color3f(.0f, 1.0f, .0f));
		app2.setMaterial(material2);

		TransformGroup transformgroup = new TransformGroup();
		transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		BranchGroupRoot.addChild(transformgroup);
		MouseRotate mouserotate = new MouseRotate();
		mouserotate.setTransformGroup(transformgroup);
		BranchGroupRoot.addChild(mouserotate);
		mouserotate.setSchedulingBounds(bounds);
		MouseZoom mousezoom = new MouseZoom();// 鼠标左键旋转,右键平移,转轮放缩
		mousezoom.setTransformGroup(transformgroup);
		BranchGroupRoot.addChild(mousezoom);
		mousezoom.setSchedulingBounds(bounds);
		MouseTranslate mousetranslate = new MouseTranslate();
		mousetranslate.setTransformGroup(transformgroup);
		BranchGroupRoot.addChild(mousetranslate);
		mousetranslate.setSchedulingBounds(bounds);

		Transform3D t = new Transform3D();
		t.setTranslation(new Vector3f(0.f, -0.62f, 0.6f));
		// t.setTranslation(new Vector3f(0.f, .25f, 0.6f));
		TransformGroup tg1 = new TransformGroup(t);
		tg1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		tg1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		tg1.addChild(new Box(0.8f, 0.003f, 0.8f, app1));
		t = new Transform3D();
		t.setTranslation(new Vector3f(-0.f, -0.4f, 0.f));
		TransformGroup tg2 = new TransformGroup(t);
		tg2.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		tg2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		tg2.addChild(new Cylinder(0.1f, 0.02f, Cylinder.GENERATE_NORMALS, 200, 200, app1));
		t = new Transform3D();
		t.setScale(0.1f);
		t.setTranslation(new Vector3f(-0.15f, 0.7f, 0.3f));
		TransformGroup tg3 = new TransformGroup(t);
		Appearance ap = new Appearance();
		ColoringAttributes colorA = new ColoringAttributes(1.f, .0f, .0f, 1);
		ap.setColoringAttributes(colorA);
		ap.setMaterial(new Material());
		Font3D font = new Font3D(new Font("sansSerif", Font.PLAIN, 1), new FontExtrusion());
		Text3D te = new Text3D(font, "your score");
		Shape3D shape = new Shape3D(te, ap);
		tg3.addChild(shape);
		t = new Transform3D();
		t.setScale(0.1f);
		t.setTranslation(new Vector3f(0.35f, 0.7f, 0.3f));
		TransformGroup tg4 = new TransformGroup(t); // 三维字体:分数
		Text3D tex = new Text3D(font, "000000");
		shape = new Shape3D(tex, ap);
		shape.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
		tex.setCapability(Text3D.ALLOW_STRING_READ);
		tex.setCapability(Text3D.ALLOW_STRING_WRITE);
		tg4.addChild(shape);
		t = new Transform3D();
		t.setScale(0.1f);
		t.setTranslation(new Vector3f(-0.7f, 0.7f, 0.3f));
		TransformGroup tg5 = new TransformGroup(t);
		tg5.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		tg5.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		Text3D text = new Text3D(font, "game start");
		shape = new Shape3D(text, ap);
		shape.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
		text.setCapability(Text3D.ALLOW_STRING_READ);
		text.setCapability(Text3D.ALLOW_STRING_WRITE);
		tg5.addChild(shape);

		MyBehavior behavior = new MyBehavior(tg2);// tg2:小圆盘
		behavior.setSchedulingBounds(bounds);
		transformgroup.addChild(behavior);
		t = new Transform3D();
		t.setScale(0.1f);
		TransformGroup tg6 = new TransformGroup(t);
		tg6.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		Sphere sp = new Sphere(0.1f, Sphere.GENERATE_NORMALS, 1000);
		tg6.addChild(sp);
		transformgroup.addChild(tg1);
		transformgroup.addChild(tg2);
		transformgroup.addChild(tg3);
		transformgroup.addChild(tg4);
		transformgroup.addChild(tg5);
		transformgroup.addChild(tg6);

		MediaContainer media = new MediaContainer();
		// media.setURLString(getClass().getClassLoader().getResource("./water.wav").toString());
		media.setURLString("file:./bin/onage.wav");
		myc = new BackgroundSound();
		myc.setSchedulingBounds(bounds);
		myc.setInitialGain(.7f);
		myc.setSoundData(media);
		myc.setEnable(true);
		transformgroup.addChild(myc);
		MediaContainer media1 = new MediaContainer();
		media1.setURLString("file:./bin/liu.wav");
		BackgroundSound gaover = new BackgroundSound();
		gaover.setSchedulingBounds(bounds);
		gaover.setInitialGain(.7f);
		gaover.setSoundData(media1);
		gaover.setCapability(BackgroundSound.ALLOW_ENABLE_WRITE);
		transformgroup.addChild(gaover);
		FallingObject f = new FallingObject(tg6, tg4, 800, sp, tg5, tex, text, gaover);// tg6小球坐标,tg4分数坐标,下落间隔,小球,tg5提示坐标,分数字,提示字
		f.setSchedulingBounds(bounds);
		transformgroup.addChild(f);
		Sounds sounds = new Sounds(sp, transformgroup);
		sounds.setSchedulingBounds(bounds);
		transformgroup.addChild(sounds);
		// 通过方法名返回BranchGroupRoot
		return BranchGroupRoot;
	}

	public Collection() {
		setLayout(new BorderLayout());// 设置一个BorderLayout
		GraphicsConfiguration gc = SimpleUniverse.getPreferredConfiguration();
		Canvas3D c = new Canvas3D(gc);
		add("Center", c);// 将图形环境放入BorderLayout的中心位置
		BranchGroup scene = createBranchGroup();
		SimpleUniverse u = new SimpleUniverse(c);// 生成虚拟空间
		u.getViewingPlatform().setNominalViewingTransform();// 设置观察者的位置为缺省位置
		u.addBranchGraph(scene);
		System.setProperty("j3d.audiodevice", "com.sun.j3d.audioengines.javasound.JavaSoundMixer");
		AudioDevice audioDev = u.getViewer().createAudioDevice();
		// 把场景放入虚拟空间中
	}

	public static void main(String[] args) {
		new MainFrame(new Collection(), 500, 500);

	}
}

class FallingObject extends Behavior {
	private long millseconds;
	private Transform3D t = new Transform3D();
	private TransformGroup trans4;
	private TransformGroup trans3;
	private TransformGroup textTrans;
	private Sphere sp;
	private float x, y, z, positionX, positionZ;
	private Text3D text, text1;
	private String s;
	private WakeupCondition wakeupCondition;
	private WakeupCriterion[] cond;
	private Vector3f position;
	private int score = 0;
	BackgroundSound gaover;
	Appearance app = new Appearance();
	Material mater = new Material();

	public FallingObject(TransformGroup trans4, TransformGroup trans3, long millseconds, Sphere sp,
			TransformGroup textTrans, Text3D text, Text3D text1,BackgroundSound gaover) {
		this.millseconds = millseconds;
		this.trans3 = trans3;
		this.trans4 = trans4;
		this.textTrans = textTrans;
		this.sp = sp;
		this.text = text;
		this.text1 = text1;
		this.gaover=gaover;
		app.setCapability(Appearance.ALLOW_TEXGEN_READ);
		mater.setCapability(Material.ALLOW_COMPONENT_READ);
		mater.setCapability(Material.ALLOW_COMPONENT_WRITE);
		app.setMaterial(mater);
		sp.setAppearance(app);
		t = new Transform3D();
		positionX = (float) (Math.random() * 2 - 1);
		t.setTranslation(new Vector3f(positionX, 0.8f, 0.f));
		trans4.setTransform(t);
		cond = new WakeupCriterion[2];
		cond[0] = new WakeupOnElapsedTime(millseconds);
		cond[1] = new WakeupOnCollisionEntry(sp);
		wakeupCondition = new WakeupOr(cond);
	}

	public void initialize() {
		wakeupOn(wakeupCondition);
	}

	public void processStimulus(Enumeration criteria) {
		WakeupCriterion wakeup;
		wakeup = (WakeupCriterion) criteria.nextElement();
		if (wakeup instanceof WakeupOnElapsedTime) {
			position = new Vector3f();
			t.get(position);
			x = position.x;
			y = position.y - 0.1f;
			z = position.z;
			t.setTranslation(new Vector3f(x, y, z));
			trans4.setTransform(t);
			if (y <= -0.4f) {
				text1.setString("game over");
				gaover.setEnable(true);
			} else {
				wakeupCondition = new WakeupOr(cond);

				wakeupOn(wakeupCondition);
			}
		}
		if (wakeup instanceof WakeupOnCollisionEntry) {
			score += 1;
			s = (String) Integer.toString(score);
			while (s.length() < 8) {
				s = "0" + s;
			}
			text.setString(s);
			positionX = (float) (Math.random() * 2 - 1);
			positionZ = (float) (Math.random() * 2 - 1);
			t.setTranslation(new Vector3f(positionX, 0.8f, 0.f));
			trans4.setTransform(t);
			if (millseconds > 700)
				millseconds -= 700;
			if (millseconds <= 200 && millseconds > 100)
				millseconds -= 90;
			if (millseconds <= 50 && millseconds > 10)
				millseconds -= 5;
			if (millseconds <= 10 && millseconds > 1)
				millseconds -= 1;
			if (millseconds <= 1)
				millseconds -= 1;
			mater.setDiffuseColor(new Color3f((float) Math.random(), (float) Math.random(), (float) Math.random()));
			mater.setSpecularColor(new Color3f((float) Math.random(), (float) Math.random(), (float) Math.random()));
			mater.setShininess(150);
			wakeupCondition = new WakeupOr(cond);
			wakeupOn(wakeupCondition);

		}
	}

}

class MyBehavior extends Behavior {
	private TransformGroup target;
	private Transform3D t = new Transform3D();
	private float x, y, z;

	public MyBehavior(TransformGroup target) {
		this.target = target;
		t.setTranslation(new Vector3f(0.f, -0.4f, .0f));
	}

	public void initialize() {
		wakeupOn(new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED));
	}

	public void processStimulus(Enumeration criteria) {
		WakeupOnAWTEvent ev;
		WakeupCriterion gener;
		AWTEvent[] events;
		KeyEvent event;
		Vector3f position = new Vector3f();
		gener = (WakeupCriterion) criteria.nextElement();
		if (gener instanceof WakeupOnAWTEvent) {
			ev = (WakeupOnAWTEvent) gener;
			events = ev.getAWTEvent();
			if (events[0] instanceof KeyEvent) {
				event = (KeyEvent) events[0];
				t.get(position);
				x = position.x;
				y = position.y;
				z = position.z;
				if (event.getKeyCode() == KeyEvent.VK_LEFT) {
					x -= 0.1;
					t.setTranslation(new Vector3f(x, y, z));
					target.setTransform(t);
				} else if (event.getKeyCode() == KeyEvent.VK_RIGHT) {
					x += 0.1;
					t.setTranslation(new Vector3f(x, y, z));
					target.setTransform(t);
				} else if (event.getKeyCode() == KeyEvent.VK_UP) {
					y += 0.1;
					t.setTranslation(new Vector3f(x, y, z));
					target.setTransform(t);

				} else if (event.getKeyCode() == KeyEvent.VK_DOWN) {
					y -= 0.1;
					t.setTranslation(new Vector3f(x, y, z));
					target.setTransform(t);
				} else if (event.getKeyCode() == KeyEvent.VK_PAGE_UP) {
					z -= 0.1;
					t.setTranslation(new Vector3f(x, y, z));
					target.setTransform(t);
				} else if (event.getKeyCode() == KeyEvent.VK_PAGE_DOWN) {

					z += 0.1;
					t.setTranslation(new Vector3f(x, y, z));
					target.setTransform(t);
				}
			}
		}
		wakeupOn(new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED));
	}
}

class Sounds extends Behavior {
	private WakeupCondition wakeupCondition;
	BackgroundSound myc;
	Sphere sp;
	TransformGroup transformgroup;
	private Vector3f position;

	// private WakeupCriterion[] cond;
	public Sounds(Sphere sp, TransformGroup transformgroup) {
		this.sp = sp;
		this.transformgroup = transformgroup;
		// cond = new WakeupCriterion[2];
		// cond[0] = new WakeupOnElapsedTime(millseconds);
		// cond[1] = new WakeupOnCollisionEntry(sp);
		Bounds bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
		MediaContainer media = new MediaContainer();
		// media.setURLString(getClass().getClassLoader().getResource("./water.wav").toString());
		media.setURLString("file:./bin/hike.wav");
		myc = new BackgroundSound();
		myc.setCapability(BackgroundSound.ALLOW_ENABLE_WRITE);
		myc.setSchedulingBounds(bounds);
		myc.setInitialGain(.3f);
		myc.setSoundData(media);
		myc.setContinuousEnable(true);
		myc.setPause(false);
		transformgroup.addChild(myc);
		wakeupCondition = new WakeupOnCollisionEntry(sp);
	}

	public void initialize() {
		wakeupOn(wakeupCondition);
	}

	public void processStimulus(Enumeration criteria) {
		WakeupCriterion wakeup;
		wakeup = (WakeupCriterion) criteria.nextElement();
		if (wakeup instanceof WakeupOnCollisionEntry) {
			myc.setEnable(true);
			System.out.print("sound:  ");
			System.out.print("isplaying? ");
			System.out.print(myc.isPlaying());
			System.out.print("     isplayingSilenty? ");
			System.out.println(myc.isPlayingSilently());
			// System.out.println(myc.isLive());// 没有被激活
			// System.out.println(myc.isReady());
			// myc.setContinuousEnable(true);
		}
		wakeupCondition = new WakeupOnCollisionEntry(sp);
		wakeupOn(wakeupCondition);

	}

}

碰撞检测_第1张图片

你可能感兴趣的:(java3D)