⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fleetscenenode.java

📁 Java mulitplayer strategy game. Adaptation of KDE Galaxy Conquest. (rules are changed - but still th
💻 JAVA
字号:
/*
 * Created on 2005-10-11
 * $Id: FleetSceneNode.java,v 1.15 2006/01/07 16:19:00 macx2k Exp $
 */
package net.sf.jawp.gui.client.j3d;

import javax.media.j3d.Alpha;
import javax.media.j3d.Appearance;
import javax.media.j3d.Behavior;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Material;
import javax.media.j3d.Node;
import javax.media.j3d.RotationInterpolator;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.AxisAngle4f;
import javax.vecmath.Color3f;

import net.sf.jawp.api.domain.Fleet;
import net.sf.jawp.j3d.object.PlacementHelper;
import net.sf.jawp.j3d.object.ReusableSceneObject;

import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Primitive;

/**
 * @author maciek
 * @version $Revision: 1.15 $
 * 
 */
public class FleetSceneNode extends ReusableSceneObject<Fleet>
{

	private static final float BODY_LENGTH = 800f;

	private static final float BODY_RADIUS = 160f;

	private static final float CABIN_LENGTH = 300f;

	private static final float ENGINE_LENGTH = 20f;

	private static final float ENGINE_RADIUS = 120f;

	private static final float TUNNEL_LENGTH = 1000f;

	private static final float TUNNEL_RADIUS = 40f;

	private static final float GRAVITATION_HABITATS_LENGTH = 350f;

	private static final float GRAVITATION_HABITATS_RADIUS = 100f;

	private static Behavior rotator = null;

	private static TransformGroup rotationTransformGroup;

	private Node bodyNode;

	public FleetSceneNode()
	{
		super(false);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void updatePosition(final Fleet fleet,
			final Transform3D transform3d)
	{
		transform3d.setTranslation(J3DHelper.toJ3d(fleet.getPosition()));
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected Node createScenegraphObject()
	{
		final BranchGroup group = new BranchGroup();

		final Appearance bodyApp = createBodyAppearance();
		final Appearance engineApp = createEngineAppearance();
		// set shape

		final BranchGroup body = new BranchGroup();

		bodyNode = new Cylinder(BODY_RADIUS, BODY_LENGTH,
				Primitive.GENERATE_NORMALS, bodyApp);
		body.addChild(bodyNode);
		final Node engine = new Cylinder(ENGINE_RADIUS, ENGINE_LENGTH,
				Primitive.GENERATE_NORMALS, engineApp);
		body.addChild(PlacementHelper.placeY(engine,
				-(BODY_LENGTH / 2 + ENGINE_LENGTH / 20)));
		final Node cabin = new Cone(BODY_RADIUS, CABIN_LENGTH,
				Primitive.GENERATE_NORMALS, bodyApp);
		body.addChild(PlacementHelper.placeY(cabin, BODY_LENGTH / 2
				+ CABIN_LENGTH / 2));
		final Node tunnel = new Cylinder(TUNNEL_RADIUS, TUNNEL_LENGTH,
				Primitive.GENERATE_NORMALS, bodyApp);
		body.addChild(PlacementHelper.rotate(tunnel, new AxisAngle4f(
				1.0f, 0.0f, 0.0f, (float) Math.PI / 2f)));
		final Node habitatA = new Cylinder(GRAVITATION_HABITATS_RADIUS,
				GRAVITATION_HABITATS_LENGTH, Primitive.GENERATE_NORMALS,
				bodyApp);
		body.addChild(PlacementHelper.placeZ(PlacementHelper
				.rotate(habitatA, new AxisAngle4f(0f, 0f, 1f,
						(float) Math.PI / 2f)), TUNNEL_LENGTH / 2));
		final Node habitatB = new Cylinder(GRAVITATION_HABITATS_RADIUS,
				GRAVITATION_HABITATS_LENGTH, Primitive.GENERATE_NORMALS,
				bodyApp);
		body.addChild(PlacementHelper.placeZ(PlacementHelper
				.rotate(habitatB, new AxisAngle4f(0f, 0f, 1f,
						(float) Math.PI / 2f)), -TUNNEL_LENGTH / 2));

		// set rotation
		final Alpha alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 5000,
				0, 0, 0, 0, 0);
		final Transform3D transform = new Transform3D();
		transform.rotY(Math.PI / 2.0f);

		rotationTransformGroup = new TransformGroup();
		rotationTransformGroup
				.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		rotationTransformGroup
				.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

		rotationTransformGroup.addChild(body);
		group.addChild(rotationTransformGroup);

		rotator = new RotationInterpolator(alpha, rotationTransformGroup,
				transform, 0f, (float) Math.PI * 2f);
		rotator.setSchedulingBounds(Scene.getBoundingSphere());

		group.addChild(rotator);

		return group;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void setUserData(final Fleet renderedObject)
	{
		bodyNode.setUserData(renderedObject);
	}

	private Appearance createBodyAppearance()
	{
		final Appearance app = new Appearance();
		final Color3f objColor = new Color3f(0.3f, 0.3f, 0.3f);
		final Material material = new Material();
		material.setShininess(10f);
		material.setAmbientColor(objColor);
		material.setDiffuseColor(objColor);
		app.setMaterial(material);
		return app;
	}

	private Appearance createEngineAppearance()
	{
		final Appearance app = new Appearance();
		final Color3f objColor = new Color3f(0.9f, 0.9f, 1f);
		final Material material = new Material();
		material.setShininess(10f);
		// material.setAmbientColor(objColor);
		// material.setDiffuseColor(objColor);
		material.setEmissiveColor(objColor);
		app.setMaterial(material);
		return app;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void updateDirection1(final Fleet renderedObject, final Transform3D rotateXZ)
	{
		// TODO Auto-generated method stub
		
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void updateDirection2(final Fleet renderedObject, final Transform3D rotate)
	{
		// TODO Auto-generated method stub
		
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void updateDirection3(final Fleet renderedObject, final Transform3D rotateXZ)
	{
		// TODO Auto-generated method stub
		
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -