📄 simplejmeapplet.java
字号:
/*
* Copyright (c) 2003-2009 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jmex.awt.applet;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelListener;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.jme.image.Texture;
import com.jme.input.FirstPersonHandler;
import com.jme.input.InputHandler;
import com.jme.input.InputSystem;
import com.jme.input.KeyBindingManager;
import com.jme.input.KeyInput;
import com.jme.input.MouseInput;
import com.jme.light.PointLight;
import com.jme.math.Vector3f;
import com.jme.renderer.Camera;
import com.jme.renderer.ColorRGBA;
import com.jme.renderer.Renderer;
import com.jme.scene.Node;
import com.jme.scene.Spatial;
import com.jme.scene.Text;
import com.jme.scene.shape.Quad;
import com.jme.scene.state.LightState;
import com.jme.scene.state.WireframeState;
import com.jme.system.DisplaySystem;
import com.jme.system.canvas.JMECanvas;
import com.jme.system.canvas.SimpleCanvasImpl;
import com.jme.util.Debug;
import com.jme.util.GameTaskQueue;
import com.jme.util.GameTaskQueueManager;
import com.jme.util.TextureManager;
import com.jme.util.geom.Debugger;
import com.jme.util.stat.StatCollector;
import com.jme.util.stat.StatType;
import com.jme.util.stat.graph.GraphFactory;
import com.jme.util.stat.graph.LineGrapher;
import com.jme.util.stat.graph.TabledLabelGrapher;
import com.jmex.awt.input.AWTKeyInput;
import com.jmex.awt.input.AWTMouseInput;
import com.jmex.awt.lwjgl.LWJGLAWTCanvasConstructor;
public class SimpleJMEApplet extends Applet {
private static final Logger logger = Logger.getLogger(SimpleJMEApplet.class
.getName());
private static final long serialVersionUID = 1L;
private Canvas glCanvas;
private SimpleAppletCanvasImplementor impl;
private static final String INIT_LOCK = "INIT_LOCK";
protected static final int STATUS_INITING = 0;
protected static final int STATUS_RUNNING = 1;
protected static final int STATUS_DESTROYING = 2;
protected static final int STATUS_DEAD = 3;
private static final String USE_APPLET_CANVAS_SIZE = "useAppletCanvasSize";
private static final int DEFAULT_JME_CANVAS_WIDTH = 640;
private static final int DEFAULT_JME_CANVAS_HEIGHT = 480;
protected int status = STATUS_INITING;
/**
* Alpha bits to use for the renderer. Must be set in the constructor.
*/
protected int alphaBits = 0;
/**
* Depth bits to use for the renderer. Must be set in the constructor.
*/
protected int depthBits = 8;
/**
* Stencil bits to use for the renderer. Must be set in the constructor.
*/
protected int stencilBits = 0;
/**
* Number of samples to use for the multisample buffer. Must be set in the constructor.
*/
protected int samples = 0;
@Override
public void init() {
synchronized (INIT_LOCK) {
TextureManager.clearCache();
Text.resetFontTexture();
DisplaySystem display = DisplaySystem.getDisplaySystem();
display.registerCanvasConstructor("AWT", LWJGLAWTCanvasConstructor.class);
display.setMinDepthBits( depthBits );
display.setMinStencilBits( stencilBits );
display.setMinAlphaBits( alphaBits );
display.setMinSamples( samples );
int canvasWidth;
int canvasHeight;
/**
* Check if we're using the applet's specified dimensions or the
* default.
*/
if (Boolean.parseBoolean(this.getParameter(USE_APPLET_CANVAS_SIZE))) {
canvasWidth = getWidth();
canvasHeight = getHeight();
} else {
canvasWidth = DEFAULT_JME_CANVAS_WIDTH;
canvasHeight = DEFAULT_JME_CANVAS_HEIGHT;
}
glCanvas = (Canvas)DisplaySystem.getDisplaySystem().createCanvas(canvasWidth, canvasHeight);
// Important! Here is where we add the guts to the canvas:
impl = new SimpleAppletCanvasImplementor(getWidth(), getHeight());
((JMECanvas) glCanvas).setImplementor(impl);
setLayout(new BorderLayout());
add(glCanvas, BorderLayout.CENTER);
glCanvas.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent ce) {
if (impl != null) {
impl.resizeCanvas(glCanvas.getWidth(), glCanvas
.getHeight());
if (impl.getCamera() != null) {
Callable<?> exe = new Callable<Object>() {
public Object call() {
impl.getCamera().setFrustumPerspective(
45.0f,
(float) glCanvas.getWidth()
/ (float) glCanvas
.getHeight(), 1,
1000);
return null;
}
};
GameTaskQueueManager.getManager().getQueue(GameTaskQueue.RENDER).enqueue(exe);
}
}
}
});
glCanvas.setFocusable(true);
glCanvas.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent arg0) {
((AWTKeyInput) KeyInput.get()).setEnabled(true);
((AWTMouseInput) MouseInput.get()).setEnabled(true);
}
public void focusLost(FocusEvent arg0) {
((AWTKeyInput) KeyInput.get()).setEnabled(false);
((AWTMouseInput) MouseInput.get()).setEnabled(false);
}
});
// We are going to use jme's Input systems, so enable updating.
((JMECanvas) glCanvas).setUpdateInput(true);
if (!KeyInput.isInited())
KeyInput.setProvider(InputSystem.INPUT_SYSTEM_AWT);
((AWTKeyInput) KeyInput.get()).setEnabled(false);
KeyListener kl = (KeyListener) KeyInput.get();
glCanvas.addKeyListener(kl);
if (!MouseInput.isInited())
MouseInput.setProvider(InputSystem.INPUT_SYSTEM_AWT);
((AWTMouseInput) MouseInput.get()).setEnabled(false);
((AWTMouseInput) MouseInput.get()).setDragOnly(true);
glCanvas.addMouseListener((MouseListener) MouseInput.get());
glCanvas.addMouseWheelListener((MouseWheelListener) MouseInput
.get());
glCanvas.addMouseMotionListener((MouseMotionListener) MouseInput
.get());
glCanvas.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent e) {
if (!glCanvas.hasFocus())
glCanvas.requestFocus();
};
});
}
}
public void simpleAppletSetup() {
}
public void simpleAppletUpdate() {
}
public void simpleAppletRender() {
}
public Camera getCamera() {
return impl.getCamera();
}
public Renderer getRenderer() {
return impl.getRenderer();
}
public Node getRootNode() {
return impl.getRootNode();
}
public Node getStatNode() {
return impl.getStatNode();
}
public float getTimePerFrame() {
return impl.getTimePerFrame();
}
public LightState getLightState() {
return impl.getLightState();
}
public WireframeState getWireframeState() {
return impl.getWireframeState();
}
public InputHandler getInputHandler() {
return impl.getInputHandler();
}
public void setInputHandler(InputHandler input) {
impl.setInputHandler(input);
}
class SimpleAppletCanvasImplementor extends SimpleCanvasImpl {
/**
* True if the renderer should display the depth buffer.
*/
protected boolean showDepth = false;
/**
* True if the renderer should display bounds.
*/
protected boolean showBounds = false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -