致命异常:线程Android

时间:2017-07-15 19:16:38

标签: android multithreading fatal-error

我正试图在播放器按下时在屏幕上绘制子弹,但是 在几个子弹后我得到以下错误:致命异常:线程-2 这是子弹和游戏视图的类

public class Bullet {
    private int x;
    private int y;
    private int speed;
    private Bitmap bitmap;


    public Bullet(Context context,int PositionX,int PositionY) {
        Log.v("i am in bullet","  come on!!!");

        speed = 10;
        x = PositionX;
        y = PositionY;
        bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.flash);

    }

    public void update() {
        //Log.v("i am in update bullet","  come on!!!");
        //animating the star horizontally right side
        //by increasing x coordinate with player speed
        x += 20;

    }


    public Bitmap getBitmap(){return bitmap;}

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

返回

public class GameView extends SurfaceView implements Runnable {
    private long fps;
    private long timeThisFrame;

    volatile boolean playing;
    private Thread gameThread = null;
    private Player player;

    //a screenX holder
    int screenX;
    int i=0;


    //context to be used in onTouchEvent to cause the activity transition from GameAvtivity to MainActivity.
    Context context;

    //the score holder
    int score;

    //the high Scores Holder
    int highScore[] = new int[4];

    //Shared Prefernces to store the High Scores
    SharedPreferences sharedPreferences;


    //to count the number of Misses
    int countMisses;

    //indicator that the enemy has just entered the game screen
    boolean flag ;

    //an indicator if the game is Over
    private boolean isGameOver ;

    private Paint paint;
    private Canvas canvas;
    private SurfaceHolder surfaceHolder;

    private Enemy enemies;



    //created a reference of the class Friend
    private Friend friend;

    //private  Bullet bullet;


    private ArrayList<Star> stars = new
            ArrayList<Star>();
    private ArrayList<Bullet> bullet = new
            ArrayList<Bullet>();

    //defining a boom object to display blast
    private Boom boom;

    //the mediaplayer objects to configure the background music
    static  MediaPlayer gameOnsound;

    final MediaPlayer killedEnemysound;

    final MediaPlayer gameOversound;



    public GameView(Context context, int screenX, int screenY) {
        super(context);
        player = new Player(context, screenX, screenY);


        surfaceHolder = getHolder();
        paint = new Paint();

        //initializing context
        this.context = context;

        int starNums = 20;
        for (int i = 0; i < starNums; i++) {
            Star s = new Star(context,screenX, screenY);
            stars.add(s);
        }
        enemies = new Enemy(context,screenX,screenY);

        //initializing boom object
        boom = new Boom(context);

        //initializing the Friend class object
        friend = new Friend(context, screenX, screenY);

        //setting the score to 0 initially
        score = 0;

        //setting the countMisses to 0 initially
        countMisses = 0;

        this.screenX = screenX;

        isGameOver = false;


        //initializing shared Preferences
        sharedPreferences = context.getSharedPreferences("SHAR_PREF_NAME",Context.MODE_PRIVATE);


        //initializing the array high scores with the previous values
        highScore[0] = sharedPreferences.getInt("score1",0);
        highScore[1] = sharedPreferences.getInt("score2",0);
        highScore[2] = sharedPreferences.getInt("score3",0);
        highScore[3] = sharedPreferences.getInt("score4",0);


        //initializing the media players for the game sounds
        gameOnsound = MediaPlayer.create(context,R.raw.gameon);
        killedEnemysound = MediaPlayer.create(context,R.raw.killedenemy);
        gameOversound = MediaPlayer.create(context,R.raw.gameover);

        //starting the music to be played across the game
        gameOnsound.start();

    }

    @Override
    public void run() {

        while (playing) {
            long startFrameTime = System.currentTimeMillis();

            synchronized (surfaceHolder) {
                update();
                draw();
                control();
            }
            timeThisFrame = System.currentTimeMillis() - startFrameTime;

            if (timeThisFrame >= 1) {
                fps = 1000 / timeThisFrame;
            }
        }
    }

    private void update() {

        //incrementing score as time passes
        score++;

        player.update();

        //setting boom outside the screen
        boom.setX(-250);
        boom.setY(-250);

        for (Star s : stars) {
            s.update(player.getSpeed());
        }

        for (Bullet b : bullet) {
                b.update();
        }

        //setting the flag true when the enemy just enters the screen
        if(enemies.getX()==screenX){

            flag = true;
        }
        enemies.update(player.getSpeed(),getFps());
    }


    private void draw() {
        if (surfaceHolder.getSurface().isValid()) {
            canvas = surfaceHolder.lockCanvas();
            canvas.drawColor(Color.argb(500,135,206,250));



            paint.setColor(Color.WHITE);
            paint.setTextSize(20);

            for (Star s : stars) {
                canvas.drawBitmap(
                        s.getBitmap(),
                        s.getX(),
                        s.getY(),
                        paint);
            }

            for (Bullet b : bullet) {
                    canvas.drawBitmap(
                            b.getBitmap(),
                            b.getX(),
                            b.getY(),
                            paint);
            }

            canvas.drawBitmap(
                    player.getBitmap(),
                    player.getX(),
                    player.getY(),
                    paint);


            canvas.drawBitmap( enemies.getBitmap(), enemies.getframeToDraw(),  enemies.getwhereToDraw(), null);
            //drawing the score on the game screen
            paint.setTextSize(30);
            canvas.drawText("Score:"+score,100,50,paint);


            //drawing boom image
            canvas.drawBitmap(
                    boom.getBitmap(),
                    boom.getX(),
                    boom.getY(),
                    paint
            );

            //draw game Over when the game is over
            if(isGameOver){
                paint.setTextSize(150);
                paint.setTextAlign(Paint.Align.CENTER);

                int yPos=(int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2));
                canvas.drawText("Game Over",canvas.getWidth()/2,yPos,paint);
            }

            surfaceHolder.unlockCanvasAndPost(canvas);

        }
    }

    private void control() {
        try {
            gameThread.sleep(17);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void pause() {
        playing = false;
        try {
            gameThread.join();
        } catch (InterruptedException e) {
            gameThread.interrupt();
        }
    }

    public void resume() {
        playing = true;
        gameThread = new Thread(this);
        gameThread.start();
    }

    //stop the music on exit
    public static void stopMusic(){

        gameOnsound.stop();
    }


    @Override
    public boolean onTouchEvent(MotionEvent motionEvent) {


        switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_UP:
                player.stopBoosting();
                break;
            case MotionEvent.ACTION_DOWN:
                player.setBoosting();
                break;

        }
//if touch the player
        if (player.getDetectCollision().contains((int)motionEvent.getX(), (int)motionEvent.getY())) {
            Bullet b = new Bullet(context,player.getX()+player.getDetectCollision().width()
                    ,player.getY()-(player.getDetectCollision().height()/2));
            bullet.add(b);
            Log.d("test", "touch not inside myEditText");
        }
//if the game's over, tappin on game Over screen sends you to MainActivity
        if(isGameOver){

            if(motionEvent.getAction()==MotionEvent.ACTION_DOWN){

                context.startActivity(new Intent(context,MainActivity.class));

            }

        }

        return true;

    }
public long getFps(){
    return fps;
}

}

0 个答案:

没有答案