之前那个诡异的飞猴已经不飞了,改成一个天上随机的位置往下掉各种各样的东西然后由用户操纵一张猴子脸左右跑来跑去去接这些东西。有的东西掉的快,接到的话就得的分儿多,有的掉的慢,接到就得的分儿少。还有一个黑色的炸弹脸,掉的很慢,但是碰到就会减分儿或者结束游戏。
·《诡异的飞猴》里提到的异常:java.sun.NullPointerException已经搞明白了,本质上是没有使用的数组指针的内存溢出报错。为什么会“Cannot read”第二张图片呢?明明已经把图片放进RES资源文件夹里了嘛!——是这样的,因为在工程文件夹里有个class文件夹里并没有那张图片,编译的时候程序应该自动拷贝一张进去,但是有时就不会拷,有时就会拷- _-|||,所以要么自己动手把图片拷进去,要么关了JB重新进去,就能编译了,而且不会报错。
代码:
// ok3.java
package ok3;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ok3 extends MIDlet {
private Canvas canvas;
private Canvas canvas2;
private Display display;
public void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
canvas = new ok3Displayable();
display.setCurrent(canvas);
}
public void pauseApp() {}
public void destroyApp(boolean bool) throws MIDletStateChangeException {
}
}
// ok3Displayable.java
package ok3;
import javax.microedition.lcdui.*;
import java.io.*;
import java.util.Random;
public class ok3Displayable extends Canvas implements Runnable{
private Image[] monkey;
private int x = 70;//猴子x坐标
private int y = 80;//猴子y坐标
private Random random = new Random();
private int xiongX = Math.abs(random.nextInt() % 128);
private int xiongY = 0;
private int neiX = Math.abs(random.nextInt() % 128);
private int neiY = 0;
private int shoseX = Math.abs(random.nextInt() % 128);
private int shoseY = 0;
private int deadX = Math.abs(random.nextInt() % 128);
private int deadY = 0;
private int s = 0; //分数
public ok3Displayable(){
try {
monkey = new Image[6];
monkey[0] = Image.createImage("/ohyeah.png");
monkey[1] = Image.createImage("/back.png");
monkey[2] = Image.createImage("/xiong.png");
monkey[3] = Image.createImage("/nei.png");
monkey[4] = Image.createImage("/shose.png");
monkey[5] = Image.createImage("/dead.png");
}
catch(IOException e) {e.printStackTrace();}
Thread th1 = new Thread(this);//制作新线程
th1.start();//开始线程
}
protected void paint(Graphics g) {
g.setColor(225, 255, 255); // white
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(monkey[1],0,0, Graphics.LEFT | Graphics.TOP );
g.drawImage(monkey[0],x,y, Graphics.HCENTER | Graphics.VCENTER );
g.drawImage(monkey[2],xiongX,xiongY, Graphics.HCENTER | Graphics.VCENTER );
g.drawImage(monkey[3],neiX,neiY, Graphics.HCENTER | Graphics.VCENTER );
g.drawImage(monkey[4],shoseX,shoseY, Graphics.HCENTER | Graphics.VCENTER );
g.drawImage(monkey[5],deadX,deadY, Graphics.HCENTER | Graphics.VCENTER );
g.drawString("Score:"+s,0,0,0);
}
public void run() {
while (true){
if(x < 0)x = getWidth();
if(x > getWidth())x = 0;
if(y > getHeight()) y = 0;
//xiong下落
xiongY+=3;
if(xiongY > getHeight()) {
xiongX = Math.abs(random.nextInt() % 128);
xiongY = 0;
}
//nei下落
neiY+=5;
if(neiY > getHeight()) {
neiX = Math.abs(random.nextInt() % 128);
neiY = 0;
}
//shose下落
shoseY+=7;
if(shoseY > getHeight()) {
shoseX = Math.abs(random.nextInt() % 128);
shoseY = 0;
}
//dead下落
deadY+=1;
if(deadY > getHeight()) {
deadX = Math.abs(random.nextInt() % 128);
deadY = 0;
}
try { //判断与xiong的碰撞
if(x-monkey[0].getWidth()/2 <xiongX +monkey[2].getWidth()/2 &&
x+monkey[0].getWidth()/2 >xiongX -monkey[2].getWidth()/2){
if(y-monkey[0].getHeight()/2 < xiongY + monkey[2].getHeight()/2 &&
y+monkey[0].getHeight()/2 > xiongY - monkey[2].getHeight()/2){
xiongX = Math.abs(random.nextInt() % 128);
xiongY = 0;
s+=5;
Thread.sleep(300);//0.3秒待机,用于吃到东西时的停顿感
//repaint();
//wait();//使游戏停顿 (目前使用时总是出错)
}
}
} catch (InterruptedException e1) {}
try { //判断与nei的碰撞
if(x-monkey[0].getWidth()/2 <neiX +monkey[3].getWidth()/2 &&
x+monkey[0].getWidth()/2 >neiX -monkey[3].getWidth()/2){
if(y-monkey[0].getHeight()/2 < neiY + monkey[3].getHeight()/2 &&
y+monkey[0].getHeight()/2 > neiY - monkey[3].getHeight()/2){
neiX = Math.abs(random.nextInt() % 128);
neiY = 0;
s+=15;
Thread.sleep(100);//0.1秒待机
}
}
} catch (InterruptedException e2) {}
try { //判断与shose的碰撞
if(x-monkey[0].getWidth()/2 <neiX +monkey[4].getWidth()/2 &&
x+monkey[0].getWidth()/2 >neiX -monkey[4].getWidth()/2){
if(y-monkey[0].getHeight()/2 < neiY + monkey[4].getHeight()/2 &&
y+monkey[0].getHeight()/2 > neiY - monkey[4].getHeight()/2){
shoseX = Math.abs(random.nextInt() % 128);
shoseY = 0;
s+=30;
Thread.sleep(300);//0.3秒待机
}
}
} catch (InterruptedException e3) {}
try { //判断与dead的碰撞
if(x-monkey[0].getWidth()/2 <neiX +monkey[5].getWidth()/2 &&
x+monkey[0].getWidth()/2 >neiX -monkey[5].getWidth()/2){
if(y-monkey[0].getHeight()/2 < neiY + monkey[5].getHeight()/2 &&
y+monkey[0].getHeight()/2 > neiY - monkey[5].getHeight()/2){
deadX = Math.abs(random.nextInt() % 128);
deadY = 0;
s+=-10;
Thread.sleep(400);//0.4秒待机
}
}
} catch (InterruptedException e4) {}
repaint();
try{
Thread.sleep(60);//60毫秒待机,用于控制游戏速度。
}catch(InterruptedException e){}
}//while()
}//run()
public void keyPressed(int key) {
int gameaction = getGameAction(key);
switch(gameaction){
case Canvas.RIGHT:
x+=3;
break;
case Canvas.LEFT:
x-=3;
break;
default :
}
}
}
=============================================
·之前在这里:
xiongX = Math.abs(random.nextInt() % 128);
xiongY = 0;
是写的“wait()”,表示让线程暂停。但是之后会出现异常:java/lang/IllegalMoniterStateException。后来我在网上找到一篇文章这样说的:“在Runnable接口定义的线程里,有两种等待方法,一种是wait,一种是sleep,如果使用wait方法,则要注意在线程run方法里,用synchonized标志符将该线程设置为同步锁定状态,否则会出现该异常,大致意思是线程当前请求的监视器对象不能响应,因为被别的线程占用了。”——所以这里干脆改成让图片回到天上去算了。
·在这里:
g.drawString("Score:"+s,0,0,0);
会出现DEBUG报错:cannot access java.lang.StringBuilder,在网上查了查,据说是JB2006 的 JDK1.5的问题,暂时还没有改成1.4,所以也没有验证,所以目前只好先把“+s”给去了再说了。
·另外,导进去四张图片的时候(一张背景、一张猴子脸和两张从天上掉下来的东西)都没有问题,再加两张图片(一张加分的东西和一颗地雷脸)的时候,那新加的图片竟然不对碰撞算法进行反映!!烦死了,就很牛儿逼的从猴子脸上划了过去,重起了机器和JB还是没有解决,暂时不知道怎么回事……