📄 maincanvas.java
字号:
package demo;
import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;
public class MainCanvas extends GameCanvas implements Runnable{
private boolean m_bRunning; //控制线程运行
public TiledLayer m_TLayer; //管理场景
public int m_aCells[][] = //存储m_TLayer中各cell的取值
{{ 2, 2, 3, 2, 2, 2, 2, 2 },
{ 2, 3, 2, 4, 3, 4, 3, 2 },
{ 2, 3, 3, 3, 4, 2, 4, 2 },
{ 2, 3, 2, 3, 3, 4, 1, 2 },
{ 2, 4, 3, 3, 3, 3, 4, 2 },
{ 2, 3, 2, 3, 3, 4, 3, 2 },
{ 2, 3, 3, 4, 1, 3, 3, 2 },
{ 4, 2, 2, 4, 2, 2, 4, 4 } };
public Sprite m_ManSprite; //用于显示精灵动画
public LayerManager m_Manager; //图层管理器,管理各个图层
public int m_nX = 0; //显示区域左上角的横坐标
public int m_nY = 0; //显示区域左上角的纵坐标
public MainCanvas(){
super(true);
try{
//读取tile图片
Image image = Image.createImage("/demo/map.png");
//创建TiledLayer场景
m_TLayer = new TiledLayer( 8, 8, image, 32, 32 );
//设置场景的位置
m_TLayer.setPosition( 0, 0 );
LoadMap();
//读取精灵图片,创建精灵,精灵的像素大小为27*36
Image image2 = Image.createImage("/demo/Man.png");
m_ManSprite = new Sprite( image2, 27, 36 );
//设置精灵左上角的位置
m_ManSprite.setPosition( 80 , 80 );
//将各个图层添入m_Manager
m_Manager = new LayerManager();
m_Manager.append(m_ManSprite);
m_Manager.append(m_TLayer);
//设置m_Manager的显示区域
m_Manager.setViewWindow( m_nX, m_nY, getWidth(), getHeight() );
}
catch (IOException e){}
Start(); //启动线程
}
public void LoadMap(){
//设置m_TLayer中各cell的值
for( int row = 0; row < 8; row ++ ){
for( int col = 0; col < 8; col ++ ){
m_TLayer.setCell( row, col, m_aCells[row][col] );
}
}
}
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(); //得到当前按键状态
boolean m_bKeyDown = false; //有无按键的标志
//如果按下方向键的上键,则显示区域向上移动
if( ( keyStates & GameCanvas.UP_PRESSED ) != 0 ){
m_nY -= 2;
m_bKeyDown = true;
}
//如果按下方向键的下键,则显示区域向下移动
if( ( keyStates & GameCanvas.DOWN_PRESSED ) != 0 ){
m_nY += 2;
m_bKeyDown = true;
}
//如果按下方向键的左键,则显示区域向左移动
if( ( keyStates & GameCanvas.LEFT_PRESSED ) != 0 ){
m_nX -= 2;
m_bKeyDown = true;
}
//如果按下方向键的右键,则显示区域向右移动
if( ( keyStates & GameCanvas.RIGHT_PRESSED ) != 0 ){
m_nX += 2;
m_bKeyDown = true;
}
if( m_bKeyDown ){
//调整显示区域,使显示区域不超出场景
if( m_nX < 0 )
m_nX = 0;
//m_TLayer中存储的场景图像的宽度为8*32,高度也为8*32
if( m_nX > 8 * 32 - getWidth() )
m_nX = 8 * 32 - getWidth();
if( m_nY < 0 )
m_nY = 0;
if( m_nY > 8 * 32 - getHeight() )
m_nY = 8 * 32 - getHeight();
//重新设置显示区域
m_Manager.setViewWindow( m_nX, m_nY, getWidth(), getHeight() );
}
}
public void Logic(){
//更换精灵当前显示的“帧”编号,“帧”编号不能大于上限
int n = m_ManSprite.getFrame();
n ++;
//getFrameSequenceLength可获取精灵图像中“帧”的个数
if( n >= m_ManSprite.getFrameSequenceLength() )
n = 0;
m_ManSprite.setFrame(n);
}
public void Paint(){
Graphics g = getGraphics();
//用黑色清屏
g.setColor(0);
g.fillRect( 0, 0, getWidth(), getHeight() );
//从屏幕的(0,0)点开始显示图像
m_Manager.paint( g, 0, 0 );
flushGraphics();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -