Java 项目致命错误

Java 项目致命错误,java,android,Java,Android,我这里有个问题,我自己解决不了。以前一切正常,但当我决定添加方法doShoot()拍摄项目的素材停止工作。 这里有一些代码 为运动员上课 package game.objectsmain; import game.main.R; import game.objects.animation.PlayerBullet; import java.util.List; import java.util.Random; import android.c

我这里有个问题,我自己解决不了。以前一切正常,但当我决定添加方法
doShoot()拍摄项目的素材停止工作。
这里有一些代码
为运动员上课

    package game.objectsmain;

    import game.main.R;
    import game.objects.animation.PlayerBullet;

    import java.util.List;
    import java.util.Random;

    import android.content.Context;
    import android.content.res.Resources;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.Drawable;
    import android.view.MotionEvent;


    public class Player extends GameObject {

         public static final int P_DEF_SPEED = 3;
         public static final int P_HIGH_SPEED = 6;

         //......//


         private static Random rand = new Random();


         private List<PlayerBullet> bulletList;
         private GunType gunType;
         Context context; 
         Bitmap mBasic;
         Bitmap  mSpray;

        public Player(Drawable image, int cordX, int cordY) {
            super(image);
            // TODO Auto-generated constructor stub
            setXCoord(cordX);
            setYCoord(cordY);
            setSpeedX(P_DEF_SPEED);
            setSpeedY(P_DEF_SPEED);
            update();
            mBasic = BitmapFactory.decodeResource(context.getResources(), R.drawable.bullet3);
    mSpray = BitmapFactory.decodeResource(context.getResources(), R.drawable.spray);

        }

        //......//

        public void doShoot()
        {
        //I ADDED THIS
            if(gunType == GunType.BASIC)
        {


                PlayerBullet b = new PlayerBullet(mBasic, getXCoord(), getYCoord(), 15, 35, 3, 3, BulletDirection.CENTER);
                bulletList.add(b);



        }
        if(gunType == GunType.SPRAY)
        {

                PlayerBullet b1 = new PlayerBullet(mSpray, getXCoord(), getYCoord(), 15, 15, 3, 3, BulletDirection.CENTER);
                PlayerBullet b2 = new PlayerBullet(mSpray, getXCoord(), getYCoord(), 15, 15, 3, 3, BulletDirection.RIGHT);
                PlayerBullet b3 = new PlayerBullet(mSpray, getXCoord(), getYCoord(), 15, 15, 3, 3, BulletDirection.LEFT);


                bulletList.add(b1);
                bulletList.add(b2);
                bulletList.add(b3);



        }//

        }

//......//

     public void draw(Canvas canvas)
       {

        mImage.draw(canvas);
       //AND ADDED THIS
        synchronized (bulletList) {
               for (PlayerBullet bullet: bulletList) {

                   bullet.animate();
                   bullet.draw(canvas);
                   //bullet.animate();
               }
           }
       }//BTW i tried to add this foreach path into doShoot() too it not helps





}
package game.objectsmain;
进口游戏.main.R;
导入game.objects.animation.PlayerBullet;
导入java.util.List;
导入java.util.Random;
导入android.content.Context;
导入android.content.res.Resources;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.drawable.drawable;
导入android.view.MotionEvent;
公共类玩家扩展游戏对象{
公共静态最终int P_DEF_速度=3;
公共静态最终int P_高速=6;
//......//
私有静态随机兰德=新随机();
私人名单通讯录;
私人枪械;
语境;
位图mBasic;
位图mSpray;
公共播放器(可绘制图像、int cordX、int cordY){
超级(图像);
//TODO自动生成的构造函数存根
setXCoord(cordX);
塞蒂库尔德(科迪);
设置速度dx(P_DEF_速度);
设置速度(P_DEF_速度);
更新();
mBasic=BitmapFactory.decodeResource(context.getResources(),R.drawable.bullet3);
mSpray=BitmapFactory.decodeResource(context.getResources(),R.drawable.spray);
}
//......//
公共无效doShoot()
{
//我加了这个
if(gunType==gunType.BASIC)
{
PlayerBullet b=新的PlayerBullet(mBasic,getXCoord(),getYCoord(),15,35,3,3,BulletDirection.CENTER);
项目清单。增加(b);
}
if(gunType==gunType.SPRAY)
{
PlayerBullet b1=新的PlayerBullet(mSpray,getXCoord(),getYCoord(),15,15,3,3,BulletDirection.CENTER);
PlayerBullet b2=新的PlayerBullet(mSpray,getXCoord(),getYCoord(),15,15,3,3,BulletDirection.RIGHT);
PlayerBullet b3=新的PlayerBullet(mSpray,getXCoord(),getYCoord(),15,15,3,3,BulletDirection.LEFT);
增补(b1);
增补(b2);
项目清单。添加(b3);
}//
}
//......//
公共空白绘制(画布)
{
画画(画布);
//加上这个
已同步(项目清单){
用于(PlayerBullet项目符号:项目列表){
bullet.animate();
子弹画(画布);
//bullet.animate();
}
}
}//顺便说一句,我也尝试将这个foreach路径添加到doShoot()中,但没有帮助
}
子弹级。尽管如此

package game.objects.animation;


import game.objectsmain.BulletDirection;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;

public class PlayerBullet extends AnimatedObject{

    private double mSpeedY;
    private double mSpeedX;
    private BulletDirection bulletDir;// direction here it's just enum looks like public enum BulletDirection{LEFT,RIGHT,CENTER}

    public PlayerBullet(Bitmap bitmap, int x, int y, int width, int height, int fps,
            int frameCount, BulletDirection dir) {
        super(bitmap, x, y, width, height, fps, frameCount);
        // TODO Auto-generated constructor stub
        bulletDir = dir;//направление пули
        setFramePeriod(5000/ fps);
        setSpeeds();



    }

    public void draw(Canvas canvas) {
        // where to draw the sprite
        //setY(getY() - mSpeedY);
        Rect destRect = new Rect(getX(), getY(), getX() + spriteWidth, getY() + spriteHeight);
        canvas.drawBitmap(bitmap, sourceRect, destRect, null);

    }

    public void animate()//анимация движения
    {
        super.animate();
        setY(getY() + (int)mSpeedY);
        setX(getX() + (int)mSpeedX); 
       // checkBorders(rect);
    }

    private void setSpeeds()
    {
        if(bulletDir.equals(BulletDirection.CENTER))
        {
             mSpeedY = -10;
             mSpeedX = 0;
        }
        else
        {
            mSpeedY = -8;
            mSpeedX = 5;

            if(bulletDir.equals(BulletDirection.LEFT))
                mSpeedX = -1 * mSpeedX;
        }

    }

    /*public void move()
    {
        xCoord = xCoord + xSpeed;       
        yCoord = yCoord + ySpeed;
        this.resetBounds();
        if(yCoord < (0 - width) || xCoord < 0-width || xCoord > screenWidth) 
            alive = false;

    }*/
打包game.objects.animation;
导入game.objectsmain.BulletDirection;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Rect;
导入android.graphics.drawable.drawable;
公共类PlayerBullet扩展了AnimatedObject{
私人双mSpeedY;
专用双mSpeedX;
private BulletDirection bulletDir;//这里的方向只是enum看起来像公共enum BulletDirection{LEFT,RIGHT,CENTER}
公共播放器bullet(位图、整数x、整数y、整数宽度、整数高度、整数fps、,
int帧计数,BulletDirection目录){
超级(位图、x、y、宽度、高度、fps、帧数);
//TODO自动生成的构造函数存根
bulletDir=dir;//
设置帧周期(5000/fps);
设置速度();
}
公共空白绘制(画布){
//在哪里画精灵
//setY(getY()-mSpeedY);
Rect desect=new Rect(getX(),getY(),getX()+spriteWidth,getY()+spriteHeight);
drawBitmap(位图、sourceRect、desect、null);
}
public void animate()//
{
super.animate();
setY(getY()+(int)mSpeedY);
setX(getX()+(int)mSpeedX);
//检查边界(rect);
}
私有无效设置速度()
{
if(bulletDir.等于(BulletDirection.中心))
{
mSpeedY=-10;
mSpeedX=0;
}
其他的
{
mSpeedY=-8;
mSpeedX=5;
if(bulletDir.等于(BulletDirection.左))
mSpeedX=-1*mSpeedX;
}
}
/*公开作废动议()
{
xCoord=xCoord+xSpeed;
yCoord=yCoord+Y速度;
这是resetBounds();
如果(yCoord<(0-宽度)| | xCoord<0-宽度| | xCoord>屏幕宽度)
活着=假;
}*/
}

主线程类

package game.view;

import game.main.R;
import game.objects.animation.Explosion;
import game.objects.animation.PlayerBullet;
import game.objects.animation.ScrollingElement;
import game.objectsmain.BulletDirection;
import game.objectsmain.Player;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;

public class ViewManager extends Thread 
{
    private static final int FIELD_WIDTH = 480;
    private static final int FIELD_HEIGHT = 800;
    private static final int dist = 100;

    public int touchedX, touchedY;

    /** Область, на которой будем рисовать */
    private SurfaceHolder mSurfaceHolder;

    /** Состояние потока (выполняется или нет. Нужно, чтобы было удобнее прибивать поток, когда потребуется) */
    private boolean mRunning;

    /** Стили рисования */
    private Paint mPaint;

   /** The drawable to use as the background of the animation canvas */
    private Bitmap mBackgroundImage;
    private Bitmap mLinesImage;
    private Bitmap mExplosionImage;
    private Bitmap mBulletImage;
    private Drawable mPlayerImage;

    private ArrayList<ScrollingElement> mScrollEls = new ArrayList<ScrollingElement>();
    private ArrayList<PlayerBullet> mBullets = new ArrayList<PlayerBullet>();
    private ArrayList<Explosion> mBang = new ArrayList<Explosion>();
    public Player mHero;

    // desired fps
    private final static int    MAX_FPS = 50;
    // maximum number of frames to be skipped
    private final static int    MAX_FRAME_SKIPS = 5;
    // the frame period
    private final static int    FRAME_PERIOD = 1000 / MAX_FPS;  

    private Explosion mBoom;//объект класса взрыв

    public ViewManager(SurfaceHolder surfaceHolder, Context context)
    {
        mSurfaceHolder = surfaceHolder;
        mRunning = false;
        Resources res = context.getResources();
        mExplosionImage = BitmapFactory.decodeResource(res, R.drawable.explosion);
        mBackgroundImage = BitmapFactory.decodeResource(res, R.drawable.bckgr1);
        mLinesImage = BitmapFactory.decodeResource(res, R.drawable.lines3); 
        mPlayerImage = res.getDrawable(R.drawable.test);
        mBulletImage = BitmapFactory.decodeResource(res, R.drawable.bullet3);
        InitElements(res);
        mHero = new Player(mPlayerImage, 240, 400);
        mBoom = new Explosion(mExplosionImage, 200, 500, 64, 64, 7, 7);

    }


    /**
        * Задание состояния потока
        * @param running
        */
       public void setRunning(boolean running)
       {
           mRunning = running;
       }

       public void run()
       {
           while (mRunning)
           {
               Canvas canvas = null;
               try
               {
                   // подготовка Canvas-а
                   canvas = mSurfaceHolder.lockCanvas();
                   synchronized (mSurfaceHolder)
                   {

                       mHero.update();
                       // собственно рисование

                       doDraw(canvas);
                       //mImage.draw(canvas);



                   }
               }
               catch (Exception e) { }
               finally
               {
                   if (canvas != null)
                   {
                       mSurfaceHolder.unlockCanvasAndPost(canvas);
                   }
               }
           }
       }

       public boolean gettouch = false;

       private void doDraw(Canvas canvas) {

        canvas.drawBitmap(mBackgroundImage, 0, 0, null);
        //отрисовка анимации
           //......//
           mHero.draw(canvas);




           }

    }



    //....//
}
package.view;
进口游戏.main.R;
导入game.objects.animation.Explosion;
导入game.objects.animation.PlayerBullet;
导入game.objects.animation.ScrollingElement;
导入game.objectsmain.BulletDirection;
导入game.objectsmain.Player;
导入java.util.ArrayList;
导入android.app.Activity;
导入android.content.Context;
导入android.content.res.Resources;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.Canvas;
导入android.graphics.Paint;
导入android.graphics.drawable.drawable;
导入android.util.Log;
导入android.view.MotionEvent;
导入android.view.SurfaceHolder;
公共类ViewManager扩展线程
{
专用静态最终整型字段_宽度=480;
专用静态最终整型字段_高度=800;
专用静态最终整数距离=100;
公共int-touchedX,touchedY;
/** Область, на которой будем рисовать */
私人地表持有人;
/** Состояние потока (выполняется или нет. Нужно, чтобы было удобнее прибивать поток, когда потребуется) */
私有布尔运算;
/** Стили рисования */
普里瓦
11-27 15:39:36.852: INFO/ActivityManager(58): Displayed activity game.main/game.mainmenu.MainMenuActivity: 2102 ms (total 2102 ms)
11-27 15:39:42.073: DEBUG/dalvikvm(124): GC_EXPLICIT freed 2866 objects / 133872 bytes in 140ms
11-27 15:39:47.113: DEBUG/dalvikvm(197): GC_EXPLICIT freed 117 objects / 5160 bytes in 144ms
11-27 15:39:52.133: DEBUG/dalvikvm(265): GC_EXPLICIT freed 765 objects / 55144 bytes in 138ms
11-27 15:39:52.383: INFO/ActivityManager(58): Starting activity: Intent { cmp=game.main/game.mainmenu.StartGame }
11-27 15:39:52.693: DEBUG/dalvikvm(303): GC_EXTERNAL_ALLOC freed 267 objects / 13328 bytes in 50ms
11-27 15:39:53.054: DEBUG/AndroidRuntime(303): Shutting down VM
11-27 15:39:53.054: WARN/dalvikvm(303): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): FATAL EXCEPTION: main
11-27 15:39:53.073: ERROR/AndroidRuntime(303): java.lang.RuntimeException: Unable to start activity ComponentInfo{game.main/game.mainmenu.StartGame}: java.lang.NullPointerException
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at android.os.Looper.loop(Looper.java:123)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at java.lang.reflect.Method.invokeNative(Native Method)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at java.lang.reflect.Method.invoke(Method.java:521)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at dalvik.system.NativeStart.main(Native Method)
11-27 15:39:53.073: ERROR/AndroidRuntime(303): Caused by: java.lang.NullPointerException
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at game.objectsmain.Player.<init>(Player.java:45)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at game.view.ViewManager.<init>(ViewManager.java:73)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at game.view.ViewPanel.<init>(ViewPanel.java:24)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at game.mainmenu.StartGame.onCreate(StartGame.java:18)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-27 15:39:53.073: ERROR/AndroidRuntime(303):     ... 11 more
11-27 15:39:53.093: WARN/ActivityManager(58):   Force finishing activity game.main/game.mainmenu.StartGame
11-27 15:39:53.104: WARN/ActivityManager(58):   Force finishing activity game.main/game.mainmenu.MainMenuActivity
11-27 15:39:53.373: INFO/ARMAssembler(58): generated scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x2d2d78:0x2d2e34] in 463339 ns
11-27 15:39:53.677: WARN/ActivityManager(58): Activity pause timeout for HistoryRecord{44ec3010 game.main/game.mainmenu.StartGame}
11-27 15:40:04.141: WARN/ActivityManager(58): Activity destroy timeout for HistoryRecord{44f01440 game.main/game.mainmenu.MainMenuActivity}
11-27 15:40:04.143: WARN/ActivityManager(58): Activity destroy timeout for HistoryRecord{44ec3010 game.main/game.mainmenu.StartGame}
11-27 15:40:14.553: DEBUG/AndroidRuntime(312): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
11-27 15:40:14.553: DEBUG/AndroidRuntime(312): CheckJNI is ON
11-27 15:40:14.703: DEBUG/AndroidRuntime(312): --- registering native functions ---
 bulletList = new List<PlayerBullet>();