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 + -
显示快捷键?