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

📄 micro3dcanvas.java

📁 3D手机游戏开发实例源代码
💻 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 + -