项目致命错误

时间:2011-11-27 15:43:04

标签: 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.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.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;

    }*/

}

主线程类

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);




           }

    }



    //....//
}

LOGCAT说什么

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 ---

2 个答案:

答案 0 :(得分:1)

问题在于您尝试向尚未初始化的bulletList添加项目符号,从而生成NullPointerException。您必须将以下代码添加到构造函数中:

 bulletList = new List<PlayerBullet>();

答案 1 :(得分:0)

NullPointerException中有Player - 看起来您的context成员未初始化。