📄 micro3dcanvas.java
字号:
import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;import com.mascotcapsule.micro3d.v3.*;public class Micro3DCanvas extends GameCanvas implements Runnable { private Graphics3D g3d; private Figure figure; //model private Texture[] textures = new Texture[3]; //Texture的排列 private AffineTrans vtrans = new AffineTrans(); // 视点变换行列 private AffineTrans trans = new AffineTrans(); // 视点变换行列 private AffineTrans xtrans = new AffineTrans(); // 视点变换行列 private AffineTrans ytrans = new AffineTrans(); // 视点变换行列 private FigureLayout layout = new FigureLayout(); // FigureLayout 对象 private Effect3D effect = new Effect3D(); // Effect3D 对象 private boolean running; // 根据thread显示有无loop处理的flag private int cx = getWidth() / 2; // display的中心x坐标 private int cy = getHeight() / 2; // display的中心y坐标 private int x_angle = 0; // x 轴周围的转角 private int y_angle = 0; // y 轴周围的转角 private int frameNumber = 0; // frame号码 private int actionIndex = 0; // action号码 private ActionTable actionTable; // ActionTable对象 private int frameSpacing = 65536 * 2; // frame的变化量 private int frameMax; // frame号码的最大值 private int textureIndex = 0; // 使用的texture的index private int move_delta = 10; // 平行移动单位 private int angle_delta = 4096 / 36; // 转动单位 private int distance = 4096 / 2; // 从视点到对象的距离 private int distance_delta = 4096 / 60; // 从视点起距离的变化量 public Micro3DCanvas(){ super(false); // resource的读取 try { figure = new Figure( "/robot.mbac" ); textures[0] = new Texture( "/robot_texture1.bmp", true ); textures[1] = new Texture( "/robot_texture2.bmp", true ); textures[2] = new Texture( "/robot_texture3.bmp", true ); actionTable = new ActionTable( "/robot.mtra" ); } catch( Exception e ) { e.printStackTrace(); } figure.setTexture( textures[0] ); vtrans.lookAt(new Vector3D(0, 0, distance), new Vector3D(0, 0, -1), new Vector3D(0, 1, 0)); frameMax = actionTable.getNumFrames(actionIndex); // thread的开始 running = true; Thread t = new Thread(this); t.start(); } /** * 根据thread执行的方法 */ public void run() { Graphics g = getGraphics(); while(running) { tick(); draw(g); try { Thread.sleep(100); } catch (InterruptedException e) { stop(); } } } /** * 根据被按下按键改变移动方向 */ protected void keyPressed(int key) { switch(key){ // 1-9的数字键操作 case KEY_NUM1: // 缩小(远离视点) distance += distance_delta; vtrans.lookAt(new Vector3D(0, 0, distance), new Vector3D(0, 0, -1), new Vector3D(0, 1, 0)); break; case KEY_NUM2: // 向上移动 cy -= move_delta; break; case KEY_NUM3: // 扩大(接近视点) distance -= distance_delta; vtrans.lookAt(new Vector3D(0, 0, distance), new Vector3D(0, 0, -1), new Vector3D(0, 1, 0)); break; case KEY_NUM4: // 向左移动 cx -= move_delta; break; case KEY_NUM6: // 向右移动 cx += move_delta; break; case KEY_NUM7: // 降低动画速度 if(frameSpacing > 1) { frameSpacing /= 2; } break; case KEY_NUM8: // 向下移动 cy += move_delta; break; case KEY_NUM9: // 提高动画速度 if(frameSpacing < frameMax / 8) { frameSpacing *= 2; } break; default: // 上下左右的动作键操作 switch(getGameAction(key)) { case UP: // x 轴周围正向转动 x_angle += angle_delta; break; case DOWN: // x 轴周围负向转动 x_angle -= angle_delta; break; case RIGHT: // y 轴周围正向转动 y_angle += angle_delta; break; case LEFT: // y 轴周围负向转动 y_angle -= angle_delta; break; case FIRE: // texture的切换 textureIndex = (textureIndex + 1 ) % 3; figure.setTexture( textures[textureIndex] ); break; } } } /** * 每经过一定时间的处理 */ private void tick() { frameNumber = frameNumber + frameSpacing; if (frameNumber >= actionTable.getNumFrames(actionIndex)) { actionIndex = (actionIndex + 1) % 2; frameNumber = 0; frameMax = actionTable.getNumFrames(actionIndex); } figure.setPosture(actionTable, actionIndex, frameNumber); xtrans.setRotationX( x_angle ); ytrans.setRotationY( y_angle ); trans.mul( xtrans, ytrans ); trans.mul( vtrans, trans ); layout.setAffineTrans( trans ); layout.setCenter( cx, cy * 3 / 2); layout.setPerspective( 1, 4096 * 2, 4096/6 ); } /** * 描绘处理 */ protected void draw( Graphics g ) { g.setColor( 255, 255, 255 ); g.fillRect( 0, 0, getWidth(), getHeight() ); try{ g3d.drawFigure( figure, 0, 0, layout, effect ); g3d.flush(); }catch(Exception e){ System.err.println(e); }finally{ g3d.release(g); } g.setColor( 0, 0, 0 ); g.drawString("frameNumber:" + frameNumber, 10, getHeight() - 15, Graphics.BOTTOM | Graphics.LEFT ); g.drawString("frameSpacing:" + frameSpacing, 10, getHeight(), Graphics.BOTTOM | Graphics.LEFT ); flushGraphics(); } /** * thread的停止 */ public void stop() { running = false; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -