⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simple3dexample_2.java

📁 java 3d 手机游戏 开发环境Eclipse
💻 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 + -