package bomb;import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;public class BombCanvas extends GameCanvas implements Runnable {
private Image bkgImage,planeImage_1,planeImage_2,bombImage; private Graphics g;
private TiledLayer background;
private LayerManager layManager;
private int screenWidth = 0; //屏幕宽度 private int screenHeight = 0; //屏幕高度
private int drawX = 0; //要绘制的X坐标
private int drawY = 0; //要绘制的Y坐标
private int dx = 0; private Sprite plane_1,plane_2,bomb;
private byte[][] backgroundMap = { {1,2,3,4,5,6},
{7,8,9,10,11,12},
{13,14,15,16,17,18},
{19,20,21,22,23,24},
{25,26,27,28,29,30},
{31,32,33,34,35,36},
{1,2,3,4,5,6},
{7,8,9,10,11,12},
{13,14,15,16,17,18},
{19,20,21,22,23,24},
{25,26,27,28,29,30},
{31,32,33,34,35,36}};
protected BombCanvas() {
super(true);
screenHeight = getHeight();
screenWidth = getWidth();
try {
//图片大小为360*360,为了简单没有设置自己的地图格式
bkgImage = Image.createImage("/game/backg.png");
//图片大小为80*64
planeImage_1 = Image.createImage("/game/plane1.png");
//图片大小为144*144
planeImage_2 = Image.createImage("/game/plane2.png");
bombImage = Image.createImage("/game/bomb.png"); } catch (Exception e) { }
int i,j;
g = this.getGraphics();
//绘画图层1,共6行6列
background = new TiledLayer(6,12,bkgImage,60,60);
for(i=0;i<12;i++)
for(j=0;j<6;j++){
background.setCell(j,i,backgroundMap[i][j]);
}
plane_1= new Sprite(planeImage_1,80,64);
plane_2= new Sprite(planeImage_2,144,144);
bomb = new Sprite(bombImage,256,128);
layManager = new LayerManager();
//图层2现在在最前面
layManager.append(plane_1);
//大飞机在第2层
layManager.append(plane_2);
//爆炸在第3层
layManager.append(bomb);
//没有发生碰撞,所以不可视
bomb.setVisible(false);
//添加背景图层
layManager.append(background); plane_1.setPosition(60,180);
plane_2.setPosition(80,0);
//绘制在屏幕撒上
layManager.paint(g,0,0);
flushGraphics();
Thread thread = new Thread(this);
thread.start(); } public void keyPressed() {
int x,y;
int keyState = getKeyStates(); //判断上下左右键是否被按下
if ((keyState & UP_PRESSED) != 0) {
if (drawY - 2 > screenHeight){
drawY = drawY - 2;
dx = dx +1;
}
else{
drawY = 720-screenHeight;
dx = dx +1;
} }
if ((keyState & DOWN_PRESSED) != 0) {
if (drawY + 2 < 720 - screenHeight){
drawY = drawY + 2;
dx = dx + 1;
}
else{
drawY = screenHeight;
dx = dx + 1 ;
} }
}
public void run() {
//无限循环检测键盘的输入
while (true) {
keyPressed();
draw();
try {
Thread.sleep(50);
} catch (InterruptedException ie) {
}
}
}
public void draw(){
//移动背景
layManager.setViewWindow(drawX,drawY,screenWidth,screenHeight);
plane_2.setPosition(drawX+60,drawY+0+dx);
plane_1.setPosition(drawX+80,drawY+180);
//使用象素碰撞检查,如果发生碰撞则显示爆炸图片
if(plane_1.collidesWith(plane_2,true)){
bomb.setPosition(drawX+10,drawY+180);
bomb.setVisible(true);
plane_1.setVisible(false);
plane_2.setVisible(false);
}
//绘制在屏幕撒上
layManager.paint(g,0,0);
flushGraphics();
}最近在学J2ME游戏编程,上面的程序是书里的,我运行程序时就是我上面程序标红色字的那行出了错``我看不懂``请高手指教```谢谢``
import javax.microedition.lcdui.game.*;public class BombCanvas extends GameCanvas implements Runnable {
private Image bkgImage,planeImage_1,planeImage_2,bombImage; private Graphics g;
private TiledLayer background;
private LayerManager layManager;
private int screenWidth = 0; //屏幕宽度 private int screenHeight = 0; //屏幕高度
private int drawX = 0; //要绘制的X坐标
private int drawY = 0; //要绘制的Y坐标
private int dx = 0; private Sprite plane_1,plane_2,bomb;
private byte[][] backgroundMap = { {1,2,3,4,5,6},
{7,8,9,10,11,12},
{13,14,15,16,17,18},
{19,20,21,22,23,24},
{25,26,27,28,29,30},
{31,32,33,34,35,36},
{1,2,3,4,5,6},
{7,8,9,10,11,12},
{13,14,15,16,17,18},
{19,20,21,22,23,24},
{25,26,27,28,29,30},
{31,32,33,34,35,36}};
protected BombCanvas() {
super(true);
screenHeight = getHeight();
screenWidth = getWidth();
try {
//图片大小为360*360,为了简单没有设置自己的地图格式
bkgImage = Image.createImage("/game/backg.png");
//图片大小为80*64
planeImage_1 = Image.createImage("/game/plane1.png");
//图片大小为144*144
planeImage_2 = Image.createImage("/game/plane2.png");
bombImage = Image.createImage("/game/bomb.png"); } catch (Exception e) { }
int i,j;
g = this.getGraphics();
//绘画图层1,共6行6列
background = new TiledLayer(6,12,bkgImage,60,60);
for(i=0;i<12;i++)
for(j=0;j<6;j++){
background.setCell(j,i,backgroundMap[i][j]);
}
plane_1= new Sprite(planeImage_1,80,64);
plane_2= new Sprite(planeImage_2,144,144);
bomb = new Sprite(bombImage,256,128);
layManager = new LayerManager();
//图层2现在在最前面
layManager.append(plane_1);
//大飞机在第2层
layManager.append(plane_2);
//爆炸在第3层
layManager.append(bomb);
//没有发生碰撞,所以不可视
bomb.setVisible(false);
//添加背景图层
layManager.append(background); plane_1.setPosition(60,180);
plane_2.setPosition(80,0);
//绘制在屏幕撒上
layManager.paint(g,0,0);
flushGraphics();
Thread thread = new Thread(this);
thread.start(); } public void keyPressed() {
int x,y;
int keyState = getKeyStates(); //判断上下左右键是否被按下
if ((keyState & UP_PRESSED) != 0) {
if (drawY - 2 > screenHeight){
drawY = drawY - 2;
dx = dx +1;
}
else{
drawY = 720-screenHeight;
dx = dx +1;
} }
if ((keyState & DOWN_PRESSED) != 0) {
if (drawY + 2 < 720 - screenHeight){
drawY = drawY + 2;
dx = dx + 1;
}
else{
drawY = screenHeight;
dx = dx + 1 ;
} }
}
public void run() {
//无限循环检测键盘的输入
while (true) {
keyPressed();
draw();
try {
Thread.sleep(50);
} catch (InterruptedException ie) {
}
}
}
public void draw(){
//移动背景
layManager.setViewWindow(drawX,drawY,screenWidth,screenHeight);
plane_2.setPosition(drawX+60,drawY+0+dx);
plane_1.setPosition(drawX+80,drawY+180);
//使用象素碰撞检查,如果发生碰撞则显示爆炸图片
if(plane_1.collidesWith(plane_2,true)){
bomb.setPosition(drawX+10,drawY+180);
bomb.setVisible(true);
plane_1.setVisible(false);
plane_2.setVisible(false);
}
//绘制在屏幕撒上
layManager.paint(g,0,0);
flushGraphics();
}最近在学J2ME游戏编程,上面的程序是书里的,我运行程序时就是我上面程序标红色字的那行出了错``我看不懂``请高手指教```谢谢``
虽然单看是没问题,可是ME有没有特别的限制我不清楚
不过你那个方法里x,y从来没用过,既然说有问题,何不直接删掉?
你看这下面2张切图:http://photo.56.com/displayimage.php?pid=31424249&u=chen8624
正常的可以运行会显示这个http://photo.56.com/displayimage.php?u=chen8624&pid=31424250
但我这个没那个可以运行.. 我就很奇怪了...
还是说开发环境的虚拟平台不同造成的结果呢.还有,我发现得我程序里有这个:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
才能正常运行出现手机界面显示程序结果如果是出现这2句:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
就不出现"Emulated J2ME Midlet"这句话,还有一运行手机一闪而过``