空指针异常 求助!!!
自己写得一个坦克大战的代码 目前只实现了地图和我方坦克的走动(用图片的切换搞定的) 在做子弹的时候出现了该错误 代码本来有三个类 我自己折磨了好几天都没搞定。现在发下我整合在一个activity的代码 求解(新手代码有点乱 见谅 会改进的 呵呵)
package my.packa;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.KeyEvent;
import android.view.View;
public class Game_oldview extends View {
public static final Canvas canvas = null;
int x=96,y=288,dir_x,dir_y;
Bitmap player,up,down,right,left;
String dir;
Resources res;
Paint p = new Paint();
int[][] map={
{0,0,0,0,0,0,3,4,0,0,0,0,0, 0,3,4,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,17,18,0,0,0,0,0,0,17,18,0,0,0,0,0,0,0,0,0,0},
{0,0,1,2,0,0,3,4,0,0,0,0,0, 0,1,2,0,0,1,2,0,0,1,2,0,0},
{0,0,15,16,0,0,17,18,0,0,0,0,0, 0,15,16,0,0,15,16,0,0,15,16,0,0},
{0,0,1,2,0,0,0,0,0,0,0,0,1, 2,1,2,0,0,1,2,3,4,1,2,0,0},
{0,0,15,16,0,0,0,0,0,0,0,0,15, 16,15,16,0,0,15,16,17,18,15,16,0,0},
{0,0,0,0,1,2,0,0,0,0,0,0,0, 0,0,0,0,0,3,4,0,0,0,0,0,0},
{0,0,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,17,18,0,0,0,0,0,0},
{5,6,0,0,0,0,1,2,0,0,0,0,3, 4,0,0,0,0,1,2,5,6,1,2,3,4},
{19,20,0,0,0,0,15,16,0,0,0,0,17,18,0,0,0,0,15,16,19,20,15,16,17,18},
{5,6,5,6,0,0,0,0,0,0,1,2,0, 0,0,0,3,4,0,0,5,6,0,0,0,0},
{19,20,19,20,0,0,0,0,0,0,15,16,0, 0,0,0,17,18,0,0,19,20,0,0,0,0},
{0,0,1,2,1,2,1,2,5,6,5,6,5, 6,3,4,0,0,0,0,5,6,1,2,0,0},
{0,0,15,16,15,16,15,16,19,20,19,20,19, 20,17,18,0,0,0,0,19,20,15,16,0,0},
{0,0,0,0,0,0,3,4,5,6,1,2,0, 0,1,2,0,0,1,2,0,0,1,2,0,0},
{0,0,0,0,0,0,17,18,19,20,15,16,0, 0,15,16,0,0,15,16,0,0,15,16,0,0},
{3,4,1,2,0,0,3,4,0,0,1,2,0, 0,1,2,0,0,0,0,0,0,1,2,0,0},
{17,18,15,16,0,0,17,18,0,0,15,16,0, 0,15,16,0,0,0,0,0,0,15,16,0,0},
{0,0,1,2,0,0,1,2,0,0,1,2,0, 0,1,2,0,0,1,2,3,4,1,2,0,0},
{0,0,15,16,0,0,15,16,0,0,15,16,0, 0,15,16,0,0,15,16,17,18,15,16,0,0},
{0,0,1,2,0,0,1,2,0,0,1,2,1, 2,1,2,0,0,0,0,0,0,0,0,0,0},
{0,0,15,16,0,0,15,16,0,0,15,16,15, 16,15,16,0,0,0,0,0,0,0,0,0,0},
{0,0,1,2,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,2,0,0,1,2,0,0},
{0,0,15,16,0,0,0,0,0,0,0,16,15, 16,15,0,0,0,15,16,0,0,15,16,0,0},
{0,0,1,2,0,0,1,2,0,0,0,2,11,12,1,0,0,0,1,2,1,2,1,2,0,0},
{0,0,15,16,0,0,15,16,0,0,0,16,25, 26,15,0,0,0,15,16,15,16,15,16,0,0},
};
Bitmap bmp;
public Game_oldview(Context context) {
super(context);
// TODO Auto-generated constructor stub
res=context.getResources();
bmp = BitmapFactory.decodeResource(res,R.drawable.map);
player=BitmapFactory.decodeResource(res, R.drawable.player_top);
up=BitmapFactory.decodeResource(res, R.drawable.player_top);
down=BitmapFactory.decodeResource(res, R.drawable.player_bottom);
right=BitmapFactory.decodeResource(res, R.drawable.player_right);
left=BitmapFactory.decodeResource(res, R.drawable.player_left);
setFocusable(true);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
Rect src=new Rect(0,0,0,23);
Rect dst=new Rect();
for(int i=0;i<26;i++){
for(int j=0;j<26;j++){
if(map[i][j]<15){
src.left=(map[i][j]-1)*12;
src.right=src.left+12;
src.top=0;
src.bottom=12;
}else{
src.left=(map[i][j]-15)*12;
src.right=src.left+12;
src.top=12;
src.bottom=24;
}
dst.left=j*12;
dst.right=dst.left+12;
dst.top=i*12;
dst.bottom=dst.top+12;
canvas.drawBitmap(bmp,src,dst,new Paint());
}
}
canvas.drawBitmap(player,x,y,new Paint());
}
private boolean tankPress(int x,int y){
if(x<0||x>288||y<0||y>288)
{System.out.println("ok");
return false;}
int tidtopx=map[y/12][x/12];
if(tidtopx==1||tidtopx==2||tidtopx==3||tidtopx==4||tidtopx==15||tidtopx==16||tidtopx==17||tidtopx==18)
{return false;}
int tidtopy=map[y/12][x/12+1];
if(tidtopy==1||tidtopy==2||tidtopy==3||tidtopy==4||tidtopy==15||tidtopy==16||tidtopy==17||tidtopy==18)
{return false;}
int tidbotx=map[y/12+1][x/12];
if(tidbotx==1||tidbotx==2||tidbotx==3||tidbotx==4||tidbotx==15||tidbotx==16||tidbotx==17||tidbotx==18)
{return false;}
int tidboty=map[y/12+1][x/12+1];
if(tidboty==1||tidboty==2||tidboty==3||tidboty==4||tidboty==15||tidboty==16||tidboty==17||tidboty==18)
{return false;}
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_UP:
System.out.println("x:"+x+"y:"+y);
player=up;
if(tankPress(x,y-12))
{y-=12;}
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
System.out.println("x:"+x+"y:"+y);
player=down;
if(tankPress(x,y+12))
{y+=12;}
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
System.out.println("x:"+x+"y:"+y);
player=left;
if(tankPress(x-12,y))
{x-=12;}
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
System.out.println("x:"+x+"y:"+y);
player=right;
if(tankPress(x+12,y))
{x+=12;}
break;
case KeyEvent.KEYCODE_DPAD_CENTER:
{
new Thread(new PaintThread()).start();
}
}
postInvalidate();
return super.onKeyDown(keyCode, event);
}
public void dir(){
if(up.equals(player)){dir="dir_up";dir_x=x+12;dir_y=y;}
else if(down.equals(player)){dir="dir_down";dir_x=x+12;dir_y=y+24;}
else if(left.equals(player)){dir="dir_left";dir_x=x;dir_y=y+12;}
else if(right.equals(player)){dir="dir_right";dir_x=x+24;dir_y=y+12;}
}
public class PaintThread implements Runnable{
public void run() {
// TODO Auto-generated method stub
while(true){
if(dir=="dir_up"){dir_y-=12;}
else if(dir=="dir_down"){dir_y+=12;}
else if(dir=="dir_left"){dir_x-=12;}
else if(dir=="dir_right"){dir_x+=12;}
try {
canvas.drawCircle(dir_x, dir_y, 8, p);// 小圆
p.setColor(Color.RED);// 设置红色
p.setAntiAlias(true);// 设置画笔的锯齿效果。 true是去除,大家一看效果就明白了
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}}
空指针异常发生在调用PaintThread线程时发生的。经过多次更改 感觉每次都是在调用子弹的关节上发生空指针异常 本来子弹也是用图片做的 后来改了 直接画个圆代替了。。=_=