?? maincanvas.java
字號:
package demo;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.Appearance;
import javax.microedition.m3g.Camera;
import javax.microedition.m3g.Graphics3D;
import javax.microedition.m3g.Light;
import javax.microedition.m3g.Transform;
import javax.microedition.m3g.TriangleStripArray;
import javax.microedition.m3g.VertexArray;
import javax.microedition.m3g.VertexBuffer;
public class MainCanvas extends GameCanvas implements Runnable{
private boolean m_bRunning; //控制項目運行
private VertexArray m_vaPos; //頂點數組
private VertexArray m_vaColor;
private VertexBuffer m_VB;
private Camera m_Camera; //攝像機對象
private Light m_Light; //燈光對象
private Graphics3D m_G3D;
private TriangleStripArray m_TSA; //三角形帶對象
private float m_fRotY = 0.0f;
private float m_fPosY = 0.0f;
public MainCanvas(){
super(true);
Reset();
Start(); //啟動線程
}
public void Reset(){
//定義頂點位置信息
short[] vert =
{ //頂點坐標
0,5,0, 0,5,5, 5,5,5, 5,5,0,
0,0,0, 0,0,5, 5,0,5, 5,0,0
};
try{//m_vaPos是VertexArray對象
m_vaPos =new VertexArray(vert.length/3,3,2);
m_vaPos.set(0,vert.length/3,vert);
}
catch (Exception e){
e.printStackTrace();
}
//定義頂點顏色信息
byte[] vertColor =
{ //頂點顏色
(byte)255,0,0, 0,(byte)255,0,
0,0,(byte)255, (byte)255,(byte)255,0,
0,(byte)255,(byte)255, (byte)255,0,(byte)255,
0,0,0, (byte)255,(byte)255,(byte)255
};
try{
m_vaColor =new VertexArray(vert.length/3,3,1);
m_vaColor.set(0, vertColor.length/3, vertColor);
}
catch (Exception e){
e.printStackTrace();
}
m_VB = new VertexBuffer();
m_VB.setPositions(m_vaPos, 1.f, null);
m_VB.setColors(m_vaColor);
//定義頂點索引序列
int[] indexs = { //注意三角形的正面方向
0, 1, 3, 2, //構成立方體頂面的三角形帶
7, 6, 4, 5, //構成立方體底面的三角形帶
1, 5, 2, 6, //構成立方體前面的三角形帶
7, 4, 3, 0, //構成立方體后面的三角形帶
0, 4, 1, 5, //構成立方體左面的三角形帶
2, 6, 3, 7 //構成立方體右面的三角形帶
};
//將頂點索引,切割成6個三角形帶,每個三角形帶由4個頂點構成
int[] stripLens = { 4, 4, 4, 4, 4, 4 };
m_TSA = new TriangleStripArray( indexs, stripLens );
//獲取當前的Graphics3D對象
m_G3D = Graphics3D.getInstance();
//創建“攝像機”
m_Camera = new Camera();
float aspect = (float) getWidth() / (float) getHeight();
m_Camera.setPerspective(30.0f, aspect, 1.0f, 1000.0f);
m_Camera.translate(0, 0, 1);
//將“攝像機”添入G3D
m_G3D.setCamera(m_Camera, null);
//創建燈光,并將燈光添入G3D
m_Light = new Light();
m_Light.setMode(Light.OMNI);
m_Light.setColor(0xFF00FFFF);
m_G3D.addLight(m_Light, null);
}
public void Start(){
m_bRunning = true;
Thread thread = new Thread(this); //分配新線程
thread.start(); //線程啟動
}
public void run() { //新線程自動調用此方法
//獲得系統當前時間,并將時間換算成毫秒
long T1 = System.currentTimeMillis();
long T2 = T1;
while(m_bRunning){
T2 = System.currentTimeMillis();
if( T2 - T1 > 100 ){ //間隔100毫秒
T1 = T2;
Input();
Logic();
Paint();
}
}
}
public void Stop(){ //終止游戲
m_bRunning = false;
}
public void Input(){
int keyStates = getKeyStates();
if( ( keyStates & GameCanvas.UP_PRESSED ) != 0 )
m_fPosY --;
if( ( keyStates & GameCanvas.DOWN_PRESSED ) != 0 )
m_fPosY ++;
if( ( keyStates & GameCanvas.LEFT_PRESSED ) != 0 )
m_fRotY --;
if( ( keyStates & GameCanvas.RIGHT_PRESSED ) != 0 )
m_fRotY ++;
}
public void Logic(){
}
public void Paint(){
Graphics g = getGraphics();
//與屏幕綁定
m_G3D.bindTarget(g);
//清空背景
m_G3D.clear(null);
Appearance ap = new Appearance();
//設置轉換
Transform tran = new Transform();
//平移
tran.postTranslate( 0.0f, m_fPosY, -25.0f );
//旋轉
tran.postRotate( m_fRotY, 0.0f, 1.0f, 0.0f );
tran.postRotate( 15, 1.0f, 0.0f, 0.0f );
//渲染實物
m_G3D.render(m_VB, m_TSA, ap, tran);
//釋放綁定對象
m_G3D.releaseTarget();
flushGraphics();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -