reusableobjectlayer.java

来自「Java mulitplayer strategy game. Adaptati」· Java 代码 · 共 131 行

JAVA
131
字号
/*
 * Created on 2005-10-10
 * $Id: ReusableObjectLayer.java,v 1.1 2005/11/10 13:59:08 macx2k Exp $ 
 */
package net.sf.jawp.j3d.object;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;

import javax.media.j3d.BranchGroup;

/**
 * Class which manages Java3D pool of scenegraph objects.
 * 
 * @author Maciej Malecki
 * @version $Revision: 1.1 $
 * @param <RENDERABLE>
 *            type to be managed with this pool
 */
public abstract class ReusableObjectLayer<RENDERABLE> implements TemporaryObjectLayer<RENDERABLE>
{
	private final Queue<ReusableSceneObject<RENDERABLE>> freeObjects;

	private final Map<RENDERABLE, ReusableSceneObject<RENDERABLE>> usedObjects;

	private BranchGroup branch = null;
	
	private boolean inited = false;
	
	private final int poolSize;

	/**
	 * Creates new instance of TemporaryObjectSceneNodePool.
	 * 
	 * @param poolSize
	 *            size of object pool
	 */
	public ReusableObjectLayer(final int poolSize)
	{
		this.poolSize = poolSize;
		freeObjects = new LinkedList<ReusableSceneObject<RENDERABLE>>();
		usedObjects = new HashMap<RENDERABLE, ReusableSceneObject<RENDERABLE>>(
				poolSize);
	}

	/**
	 * {@inheritDoc}
	 */
	public void show(final RENDERABLE renderedObject)
	{
		final ReusableSceneObject<RENDERABLE> renderer = freeObjects
				.poll();
		if (renderer == null)
		{
			// no elements in pool
			return;
		}
		renderer.connect(renderedObject);
		usedObjects.put(renderedObject, renderer);
	}

	/**
	 * {@inheritDoc}
	 */
	public void update(final RENDERABLE renderedObject)
	{
		final ReusableSceneObject<RENDERABLE> renderer = usedObjects
				.get(renderedObject);
		if (renderer != null)
		{
			renderer.update();
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public void hide(final RENDERABLE renderedObject)
	{
		final ReusableSceneObject<RENDERABLE> renderer = usedObjects
				.get(renderedObject);
		if (renderer != null)
		{
			usedObjects.remove(renderedObject);
			renderer.disconnect();
			freeObjects.offer(renderer);
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public BranchGroup getSceneObjects()
	{
		if (!inited)
		{
			init();
		}
		return branch;
	}

	/**
	 * Factory method which creates TemporaryObjectSceneNodes. This method must
	 * be overriden and proper scene node object must be provided.
	 * 
	 * @return
	 */
	protected abstract ReusableSceneObject<RENDERABLE> createSceneNode();

	private void init()
	{
		if (inited)
		{
			throw new IllegalStateException("Pool is already inited");
		}
		inited = true;
		
		final BranchGroup root = new BranchGroup();
		for (int i = 0; i < poolSize; ++i)
		{
			final ReusableSceneObject<RENDERABLE> sceneGraphNode = createSceneNode();
			assert sceneGraphNode != null : "Scenegraph node is null";
			root.addChild(sceneGraphNode.getSceneObject());
			freeObjects.add(sceneGraphNode);
		}
		branch = root;
	}
}

⌨️ 快捷键说明

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