📄 simple3dexample_2.java
字号:
/*
* 使用定时器播放3D动画
*/
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.CommandListener;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.m3g.*;
public class Simple3DExample_2 extends MIDlet implements CommandListener {
private Display myDisplay = null;
private Simple3DCanvas_2 myCanvas = null;
private Timer myRefreshTimer = new Timer();
private TimerTask myRefreshTask = null;
private Command exitCommand = new Command("Exit", Command.ITEM, 1);
private World myWorld = null;
public Simple3DExample_2() {
//设置Canvas显示接口
myDisplay = Display.getDisplay(this);
myCanvas = new Simple3DCanvas_2(this);
myCanvas.setCommandListener(this);
myCanvas.addCommand(exitCommand);
}
public void startApp() throws MIDletStateChangeException {
myDisplay.setCurrent(myCanvas);
try {
//读取3d资源文件
Object3D[] roots = Loader.load("/pogoroo.m3g");
// 确定 world读取的是第一个播放结点
myWorld = (World) roots[0];
//强迫重画启动循环播放3d动画
myCanvas.repaint();
} catch (Exception e) {
e.printStackTrace();
}
}
public void pauseApp() {
// Release resources.
myWorld = null;
}
public void destroyApp(boolean unconditional)
throws MIDletStateChangeException {
myRefreshTimer.cancel();
myRefreshTimer = null;
// 释放资源
myWorld = null;
}
public void paint(Graphics g) {
//如果canvas 和world为空
if (myCanvas == null || myWorld == null)
return;
// 如果已经有一个定时器了
if (myRefreshTask != null) {
myRefreshTask.cancel();
myRefreshTask = null;
}
// 获得当前时间
long currentTime = System.currentTimeMillis();
//更新动画时间
int validity = myWorld.animate((int) currentTime);
//读取3d数据
Graphics3D myGraphics3D = Graphics3D.getInstance();
myGraphics3D.bindTarget(g);
myGraphics3D.render(myWorld);
myGraphics3D.releaseTarget();
// 获得播放一帧3d动画所需要的时间
validity -= System.currentTimeMillis() - currentTime;
if (validity < 1) {
//如果时间小于1ms,则设置维1ms.
validity = 1;
}
//控制每帧播放的间隔时间
if (validity < 0x7fffffff) {
// Create a new refresh task.
myRefreshTask = new RefreshTask();
// Schedule an update.
myRefreshTimer.schedule(myRefreshTask, validity);
}
}
public void commandAction(Command cmd, Displayable disp) {
if (cmd == exitCommand) {
try {
destroyApp(false);
notifyDestroyed();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//定时器任务
private class RefreshTask extends TimerTask {
public void run() {
myCanvas.repaint();
}
}
class Simple3DCanvas_2 extends Canvas {
Simple3DExample_2 myTestlet;
Simple3DCanvas_2(Simple3DExample_2 Testlet) {
myTestlet = Testlet;
}
void init() {
}
void destroy() {
}
protected void paint(Graphics g) {
myTestlet.paint(g);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -