📄 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 + -