📄 democanvas.java
字号:
package com.j2medev.chapter5;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import java.io.*;
public class DemoCanvas
extends GameCanvas
implements CommandListener, Runnable {
private Image imgA,imgB;//飞机(imgA)和敌人(imgB)的Image对象
private Image mapImg0,mapImg1;//背景0和背景1的Image对象
private TiledLayer tiledLayer0;//背景0
private TiledLayer tiledLayer1;//背景1
private LayerManager layers;//管理所有层的层管理器
private Sprite spriteA,spriteB;//声明精灵A和精灵B对象
private int keyState;//按键状态
private boolean collideSta;//状态变量,表示是否碰撞
private Graphics g;//画笔的引用
private int Ypos0;//可视窗口的纵坐标
public DemoCanvas() {
//构造GameCanvas,参数true意味着CameCanvas不会自动调用KeyPressed,keyRepeated,keyReleased方法
super(true);
//全屏
this.setFullScreenMode(true);
try {//初始化两个精灵的Image对象和两个背景的Image对象
imgA = Image.createImage("/img0.png");
imgB = Image.createImage("/img1.png");
mapImg0 = Image.createImage("/map0.png");
mapImg1 = Image.createImage("/map1.png");
} catch (IOException ex) {
ex.printStackTrace();
}
tiledLayer0 = new TiledLayer(9,20,mapImg0,28,28);//实例化背景层0,用mapImg0填充20行9列
tiledLayer1 = new TiledLayer(12,11,mapImg1,21,40);//实例化背景层1,用mapImg1填充11行12列
tiledLayer1.setPosition(-6,0);//初始化背景层1的位置
int[][] map0 = {//背景层0的块儿分布(全用1号块儿填充)
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1}
};
int[][] map1 = {//背景层1的块儿分布(左侧用1号块儿填充,右侧用2号块儿填充,其它位置不填)
{ 1,0,0,0,0,0,0,0,0,0,0,2},
{ 1,0,0,0,0,0,0,0,0,0,0,2},
{ 1,0,0,0,0,0,0,0,0,0,0,2},
{ 1,0,0,0,0,0,0,0,0,0,0,2},
{ 1,0,0,0,0,0,0,0,0,0,0,2},
{ 1,0,0,0,0,0,0,0,0,0,0,2},
{ 1,0,0,0,0,0,0,0,0,0,0,2},
{ 1,0,0,0,0,0,0,0,0,0,0,2},
{ 1,0,0,0,0,0,0,0,0,0,0,2},
{ 1,0,0,0,0,0,0,0,0,0,0,2},
{ 1,0,0,0,0,0,0,0,0,0,0,2},
};
//利用map0中的地图信息填充背景层0
for (int i = 0; i < map0.length; i++)
for(int j = 0;j<map0[i].length;j++)
tiledLayer0.setCell(j, i, map0[i][j]);
spriteA = new Sprite(imgA,110,89);//实例化精灵A
spriteB = new Sprite(imgB,80,80);//实例化精灵B
spriteA.setPosition(50,100);//初始化精灵A的位置
spriteB.setPosition(50,0);//初始化精灵B的位置
layers= new LayerManager();//实例化一个层管理器
layers.append(tiledLayer0);//将背景层添加到层管理器中
Ypos0 = tiledLayer0.getHeight() - this.getHeight();//初始化背景层0的位置
this.setFullScreenMode(true);//全屏
setCommandListener(this);
addCommand(new Command("Exit", Command.EXIT, 1));
new Thread(this).start();//启动GameCanvas线程
}
public void check(){//碰撞检测
if(spriteA.collidesWith(spriteB,true)) collideSta = true;
else collideSta = false;
}
public void run() {
while (true) {
// repaint();
this.g = getGraphics();//获取画笔
keyState = getKeyStates();//获取按键状态
//精灵A向左移动
if((keyState & this.LEFT_PRESSED)!=0){
spriteA.move(-3,0);
}
//精灵A向右移动
if((keyState & this.RIGHT_PRESSED)!=0){
spriteA.move(3,0);
}
//精灵A向上移动
if((keyState & this.UP_PRESSED)!=0){
spriteA.move(0,-3);
}
//精灵A向下移动
if((keyState & this.DOWN_PRESSED)!=0){
spriteA.move(0,3);
}
check();//碰撞检测
this.draw(g);//调用自定义的画图方法
try {
Thread.sleep(33);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void draw(Graphics g) {
//清屏
g.setColor(0);
g.fillRect(0,0,this.getWidth(),this.getHeight());
//准备画下一帧
spriteA.nextFrame();
//实现背景0的循环滚动,实际上是可视窗口在循环滚动
if(Ypos0<=0) Ypos0 = tiledLayer0.getHeight() - this.getHeight();
//设置可视区域
layers.setViewWindow(0,Ypos0,this.getWidth(),this.getHeight());
//可视窗口向上移动
Ypos0 = Ypos0-2;
//画出层管理器中的所有层
layers.paint(g,0,0);
//画精灵A
spriteA.paint(g);
//刷新
flushGraphics();
}
public void keyPressed(int keyCode) {
//System.out.println(" ");
}
public void commandAction(Command command, Displayable displayable) {
if (command.getCommandType() == Command.EXIT) {
GameDemo.quitApp();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -