MyActor类
环境摄像机和模型
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.Camera;
public class MyActor{
private Camera m_Camera;
private float m_fRot;
private float m_fX;
private float m_fY;
private float m_fZ;
public MyActor(Camera c,int scrWidth,int scrHeight){
float aspect=(float)scrWidth/(float)scrHeight;
m_Camera=c;
m_Camera.setPerspective(30.0f, aspect, 1.0f, 1000.0f);
m_fRot=0.f;
m_Camera.setOrientation(m_fRot, 0.f, 1.f, 0.f);
m_fX=0.f;
m_fY=1.5f;
m_fZ=0.f;
m_Camera.setTranslation(m_fX, m_fX, m_fZ);
}
public void Input(int keyStates)
{
//如果按下了方向键的左键,则摄影机沿Y轴逆时针旋转
if((keyStates&GameCanvas.LEFT_PRESSED)!=0)
m_fRot+=2.f;
//如果按下了方向键的右键,则摄影机沿Y轴的顺时针旋转
if((keyStates&GameCanvas.RIGHT_PRESSED)!=0)
m_fRot-=2.f;
m_Camera.setOrientation(m_fRot, 0.f, 1.f, 0.f);
double rads=Math.toRadians(m_fRot);
double Sin=Math.sin(rads);
double Cos=Math.cos(rads);
//如果按下了方向键的上键,则摄影机沿当前方向前进
if((keyStates&GameCanvas.UP_PRESSED)!=0)
{
m_fX-=3.0f*(float)Sin;
m_fZ-=0.0f*(float)Cos;
}
if((keyStates&GameCanvas.DOWN_PRESSED)!=0)
{
m_fX+=0.8f*(float)Sin;
m_fZ+=0.8f*(float)Cos;
}
m_Camera.setTranslation(m_fX, m_fY, m_fZ);
}
}
GameCanvas类:
环境渲染和实现
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.Background;
import javax.microedition.m3g.Camera;
import javax.microedition.m3g.Graphics3D;
import javax.microedition.m3g.Image2D;
import javax.microedition.m3g.Light;
import javax.microedition.m3g.Loader;
import javax.microedition.m3g.Object3D;
import javax.microedition.m3g.Transform;
import javax.microedition.m3g.World;
public class MainCanvas_bk extends GameCanvas implements Runnable{
private boolean m_bRunning;
private Graphics3D m_G3D;
private World m_World;
private MyActor m_Actor;
public MainCanvas_bk(){
super(true);
try{
m_G3D=Graphics3D.getInstance();
Object3D[] roots=Loader.load("/scene.m3g");
m_World=(World)roots[0];
//在构造方法中,创建角色实例
//创建角色控制实例
m_Actor=new MyActor(m_World.getActiveCamera(),getWidth(),getHeight());
//在构造方法中,设置场景的背景,并向场景添加光源
//创建背景
Background back=new Background();
Image m=Image.createImage("/gmbk.png");
Image2D m2d=new Image2D(Image2D.RGB,m);
back.setImage(m2d);
m_World.setBackground(back);
Light light=new Light();
light.setMode(Light.OMNI);
m_World.addChild(light);
}catch(Exception e){
e.printStackTrace();
}
Start();
}
private void Start() {
// TODO Auto-generated method stub
m_bRunning=true;
Thread thread=new Thread(this);
thread.start();
}
public void run() {
// TODO Auto-generated method stub
long T1=System.currentTimeMillis();
long T2=T1;
while(m_bRunning)
{
T2=System.currentTimeMillis();
if(T2-T1>50){
T1=T2;
Input();
Logic();
Paint();
}
}
}
private void Paint() {
// TODO Auto-generated method stub
Graphics g=getGraphics();
try{
m_G3D.bindTarget(g);
m_G3D.render(m_World);
}catch(Exception e){
e.printStackTrace();
}
finally{
m_G3D.releaseTarget();
}
flushGraphics();
}
private void Logic() {
// TODO Auto-generated method stub
}
private void Input() {
// TODO Auto-generated method stub
int keyStates=getKeyStates();
if(keyStates!=0)
{
m_Actor.Input(keyStates);
}
}
}