Java Tutorial/J2ME/m3g
Use m3g package
<source lang="java">
import javax.microedition.lcdui.rumand; import javax.microedition.lcdui.rumandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.game.GameCanvas; import javax.microedition.m3g.Camera; import javax.microedition.m3g.Graphics3D; import javax.microedition.m3g.Loader; import javax.microedition.m3g.World; import javax.microedition.midlet.MIDlet; public class RMMIDlet extends MIDlet implements CommandListener {
private Display myDisplay = null; private RetainedCanvas myCanvas = null; private Command exitCommand = new Command("Exit", Command.ITEM, 1); public RMMIDlet() { super(); myDisplay = Display.getDisplay(this); myCanvas = new RetainedCanvas(); myCanvas.setCommandListener(this); myCanvas.addCommand(exitCommand); } public void startApp() { myCanvas.init(); myDisplay.setCurrent(myCanvas); myCanvas.start(); } public void pauseApp() { } public void destroyApp(boolean unconditional) { myCanvas.stop(); } public void commandAction(Command cmd, Displayable disp) { if (cmd == exitCommand) { try { destroyApp(false); notifyDestroyed(); } catch (Exception e) { e.printStackTrace(); } } }
} class RetainedCanvas extends GameCanvas implements Runnable {
private boolean mRunning = false; private Thread mPaintThrd = null; private Graphics3D mGraphics3D = Graphics3D.getInstance(); private World mWorld = null; private Camera mCam = null; private long mWorldStartTime = 0; public RetainedCanvas() { super(true); } public void init() { try { mWorld = (World) Loader.load("/p.m3g")[0]; mCam = mWorld.getActiveCamera(); mCam.translate(0, 0, -1.5f); mCam.setOrientation(180, 0, 1, 0); } catch (Exception e) { e.printStackTrace(); } mWorldStartTime = System.currentTimeMillis(); } public void start() { mRunning = true; mPaintThrd = new Thread(this); mPaintThrd.start(); } public void stop() { mRunning = false; try { mPaintThrd.join(); } catch (InterruptedException ex) { } } public void run() { Graphics g = getGraphics(); long startTime; while (mRunning) { cameraForward(); startTime = System.currentTimeMillis() - mWorldStartTime; mWorld.animate((int) startTime); mGraphics3D.bindTarget(g); mGraphics3D.render(mWorld); mGraphics3D.releaseTarget(); flushGraphics(); try { Thread.sleep(100); } catch (InterruptedException ie) { } } } private void cameraForward() { mCam.translate(0f, 0f, 0.2f); }
}</source>