2015-12-03 3 views
0

Я хочу, чтобы мой объект попал в стену. Когда мои спрайты сталкиваются, я хочу запустить новый экран с надписью «Вы разбились».NullException при попытке начать свою деятельность

Я все равно получаю такую ​​же ошибку!

package com.example.rushhour; 

    import java.util.Random; 

    import android.content.Intent; 
    import android.graphics.Bitmap; 
    import android.graphics.Canvas; 
    import android.graphics.Rect; 
    import android.media.MediaPlayer; 


public class TrafficSprite extends PlayScreen { 
     Random rand = new Random(); 
     private int x = 5; 
     private int y = 30; 
     private int xSpeed = 0; 
     private int ySpeed = 0; 
     private GameView gameView; 
     private PlayScreen playScreen; 
     private Sprite sprite; 
     private Bitmap bmp; 
     private int width; 
     private int height; 
     private MediaPlayer crashsound; 



     public TrafficSprite(GameView gameView, Bitmap bmp) { 
      this.gameView = gameView; 
      this.playScreen = playScreen; 
      this.sprite = sprite; 
      this.bmp = bmp; 
      this.width = bmp.getWidth(); 
      this.height = bmp.getHeight(); 
      System.out.println(gameView.getWidth()); 
      int randomwidth = gameView.getWidth(); 
      Math.abs(randomwidth); 
      x=rand.nextInt(760); 
     } 



     private void update(){ 
     collision(); 
     ySpeed = 10; 
     y+=ySpeed; 



     } 

     **private void collision(){ 
      Rect policerect = new Rect(Sprite.getPolicex(),Sprite.getPolicey(),Sprite.getPolicex()+Sprite.getPoliceWidth(),Sprite.getPolicey()+Sprite.getPoliceHeight()); 
      Rect trafficsprite = new Rect(x,y,x+bmp.getWidth(),y+bmp.getHeight()); 
      if (Rect.intersects(policerect, trafficsprite)){ 
       GameView.getCrashSound().start(); 
       CrashScreen(); 

      } 

     } 

     public void CrashScreen(){ 
     System.out.println("hi"); 
      Intent intent = new Intent(this, Crash.class); 
      startActivity(intent); 

    }** 



     public void drawTraffic(Canvas canvas) { 

       update(); 
       Rect src = new Rect (0,0,width,height); 
       Rect dst = new Rect (x,y,x+width,y+height); 
       canvas.drawBitmap(bmp, src, dst, null); 

} 

} 

Здесь я создаю намерение:

public void CrashScreen(){ 
      System.out.println("hi"); 
       Intent intent = new Intent(this, Crash.class); 
       startActivity(intent); 

Это ошибка:

FATAL EXCEPTION: Thread-6714 
12-03 17:57:46.497: E/AndroidRuntime(6013): Process: com.example.rushhour, PID: 6013 
12-03 17:57:46.497: E/AndroidRuntime(6013): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
12-03 17:57:46.497: E/AndroidRuntime(6013):  at android.content.ContextWrapper.getPackageName(ContextWrapper.java:131) 
12-03 17:57:46.497: E/AndroidRuntime(6013):  at android.content.ComponentName.<init>(ComponentName.java:77) 
12-03 17:57:46.497: E/AndroidRuntime(6013):  at android.content.Intent.<init>(Intent.java:3996) 
12-03 17:57:46.497: E/AndroidRuntime(6013):  at com.example.rushhour.TrafficSprite.CrashScreen(TrafficSprite.java:65) 
12-03 17:57:46.497: E/AndroidRuntime(6013):  at com.example.rushhour.TrafficSprite.collision(TrafficSprite.java:58) 
12-03 17:57:46.497: E/AndroidRuntime(6013):  at com.example.rushhour.TrafficSprite.update(TrafficSprite.java:45) 
12-03 17:57:46.497: E/AndroidRuntime(6013):  at com.example.rushhour.TrafficSprite.drawTraffic(TrafficSprite.java:82) 
12-03 17:57:46.497: E/AndroidRuntime(6013):  at com.example.rushhour.GameView.createTraffic(GameView.java:218) 
12-03 17:57:46.497: E/AndroidRuntime(6013):  at com.example.rushhour.GameLoopThread.run(GameLoopThread.java:25) 

Экран воспроизведения является активность, он имеет "Gameview" на верхней

setContentView(new GameView(this)); 

Gameview:

package com.example.rushhour; 

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

import android.content.Context; 
import android.content.Intent; 
import android.content.res.TypedArray; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.media.MediaPlayer; 
import android.os.Handler; 
import android.os.Looper; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 



public class GameView extends SurfaceView { 
     private Bitmap background,police,audi; 
     private Sprite policesprite; 
     private TrafficSprite audisprite; 

     private List<TrafficSprite> trafficsprites = new ArrayList<TrafficSprite>(); 
     private SurfaceHolder holder; 
     private GameLoopThread gameLoopThread; 
     private int x = 0; 
     final Handler handler = new Handler(); 
     private int i =-1; 
     public static MediaPlayer crashsound; 


     public GameView(Context context) { 
      super(context); 
      gameLoopThread = new GameLoopThread(this); 
      holder = getHolder(); 
      crashsound = MediaPlayer.create(context, R.raw.crash); 
      holder.addCallback(new SurfaceHolder.Callback() { 

        @Override 
        public void surfaceDestroyed(SurfaceHolder holder) { 
         boolean retry = true; 
         gameLoopThread.setRunning(false); 
         while (retry){ 
           try { 
            gameLoopThread.join(); 
            retry = false; 
           } catch (InterruptedException e) { 
           } 
         } 

        } 

        @Override 
        public void surfaceCreated(SurfaceHolder holder) { 
         createSprites(); 
         gameLoopThread.setRunning(true); 
         gameLoopThread.start(); 

        } 

        @Override 
        public void surfaceChanged(SurfaceHolder holder, int format, 
            int width, int height) { 
        } 
      }); 

      background = BitmapFactory.decodeResource(getResources(), R.drawable.playbackground); 
      police = BitmapFactory.decodeResource(getResources(), R.drawable.policered); 
      audi = BitmapFactory.decodeResource(getResources(), R.drawable.audi); 
      policesprite = new Sprite(this,police); 
      audisprite = new TrafficSprite(this,audi); 




     } 

     private void createSprites() { 
      final int[] spriteID = { 
        R.drawable.amb, 
        R.drawable.audi, 
        R.drawable.car, 
        R.drawable.mini, 
        R.drawable.truck, 
        R.drawable.taxi, 
        R.drawable.van 
        // etc for as many images you have 
      }; 
      new Thread(new Runnable() { 
       public void run() { 
        Looper.prepare(); 
        for(int i = 0; i < 6; i++) { 
         if (i == 5){ 
          mediumspeed(); 
         } 
         Random generator = new Random(); 
         int randomImageId = spriteID[generator.nextInt(spriteID.length)]; 
         trafficsprites.add(createSprite(randomImageId)); 
         try 
         { 
          Thread.sleep(3000); //Waits for 1 second 
         } 
         catch(InterruptedException e) 
         { 
          e.printStackTrace(); 
         } 


        } 
       } 
      }).start(); 

     } 

     public void mediumspeed(){ 

      final int[] spriteID = { 
        R.drawable.amb, 
        R.drawable.audi, 
        R.drawable.car, 
        R.drawable.mini, 
        R.drawable.truck, 
        R.drawable.taxi, 
        R.drawable.van 
        // etc for as many images you have 
      }; 
      new Thread(new Runnable() { 
       public void run() { 
        Looper.prepare(); 
        for(int i = 0; i < 6; i++) { 
         if (i==5){ 
          fastspeed(); 
         } 
        Random generator = new Random(); 
        int randomImageId = spriteID[generator.nextInt(spriteID.length)]; 
        trafficsprites.add(createSprite(randomImageId)); 
        try 
         { 
         Thread.sleep(1850); //Waits for 1 second 
         } 
        catch(InterruptedException e) 
         { 
         e.printStackTrace(); 
         } 


        } 
       } 
      }).start(); 


     } 



     public void fastspeed(){ 

      final int[] spriteID = { 
        R.drawable.amb, 
        R.drawable.audi, 
        R.drawable.car, 
        R.drawable.mini, 
        R.drawable.truck, 
        R.drawable.taxi, 
        R.drawable.van 
        // etc for as many images you have 
      }; 
      new Thread(new Runnable() { 
       public void run() { 
        Looper.prepare(); 
        for(int i = 0; i < 6; i++) { 
        Random generator = new Random(); 
        int randomImageId = spriteID[generator.nextInt(spriteID.length)]; 
        trafficsprites.add(createSprite(randomImageId)); 
        try 
         { 
         Thread.sleep(1200); //Waits for 1 second 
         } 
        catch(InterruptedException e) 
         { 
         e.printStackTrace(); 
         } 


        } 
       } 
      }).start(); 


     } 




     private TrafficSprite createSprite(int resouce) { 
      Bitmap bmp = BitmapFactory.decodeResource(getResources(), resouce); 
      return new TrafficSprite(this,bmp); 
    } 





     @Override 
     protected void onDraw(Canvas canvas){ 
       canvas.drawBitmap(background, 0, 0, null); 
       policesprite.onDraw(canvas); 
    } 

     protected void createTraffic(Canvas canvas){ 
      for (TrafficSprite trafficsprite : trafficsprites) { 
       trafficsprite.drawTraffic(canvas); 
     } 

     } 
     protected void createTraffic1(Canvas canvas){ 
      trafficsprites.get(1).drawTraffic(canvas); 

     } 

     public static MediaPlayer getCrashSound(){ 
      return crashsound; 
     } 

Когда спрайты сталкиваются я хочу, чтобы открыть новое направление деятельности, мастер спрайт находится в нижней части экрана, и имеет свой собственный класс Sprite.java, каждый спрайт управляется TrafficSprite.java

+1

Проверьте, если это вам поможет: http://stackoverflow.com/questions/16745806/java-lang-nullpointerexception-at-android-content-contextwrapper-getpackagename – Ishamael

+0

PlayScreen простирается от? деятельность? Я думаю, что проблема связана с контекстом. –

+0

PlayScreen простирается от активности, это проблема? спасибо –

ответ

0

Попробуйте этот код:

public void CrashScreen(){ 
     Intent intent = new Intent(this, Crash.class); 
     startActivity(intent); 

} 

и в новой деятельности установить TextView с текстом, чтобы показать.

+0

, который вызывает ту же ошибку :( –

0

Может быть, вам нужно conext от текущей деятельности, как правило, MainActivity:

public void CrashScreen(){ 
     Intent intent = new Intent(getActivity().getApplicationContext(), Crash.class); 
     startActivity(intent); 

} 

Примите во внимание, вы используете явное намерение, поэтому вам нужно точный класс будет работать, и она будет решена с помощью контекст как documentation says

0

Согласно трассировке стека, возникает ваша ошибка here. Проблема в mBase равна null, это означает, что ваш контекст не инициализирован. Это может произойти по разным причинам.
Пожалуйста, проверьте следующее:

Эта активность указана в манифесте?
- закончен ли закон активации onCreate?
Этот метод вызван после onCreate?

Я уверен, что одна из вышеуказанных проблем.

EDIT
Чтобы решить вашу проблему:

в PlayScreen активность:

new TrafficSprite(this,.....) //refers to the activty 

в TrafficSprite:

private Context cntx; 
public TrafficSprite(Context context,GameView gameView, Bitmap bmp) 
{ 
    cntx=context; 
    .... 

public void CrashScreen(){ 
     System.out.println("hi"); 
      Intent intent = new Intent(cntx, Crash.class); 
      startActivity(intent); 

    } 

Делая это, вы будете иметь действительный контекст ,

Проблема с вашим решением было, хотя вы создали класс (TrafficSprite), который является Activity, но контекст создания методов не называется вовсе (например. onCreate не называется).

Edit2:

Существует уже getContext() метод в классе SurfaceView, так что можно использовать.

public void CrashScreen(){ 
     System.out.println("hi"); 
      Intent intent = new Intent(gameView.getContext(), Crash.class); 
      startActivity(intent); 

    } 

Поскольку ваш SurfaceView имеет контекст активности, то здесь тоже должно быть хорошо.

+0

спасибо! Если я установил действие Crash для запуска из главного меню, он отлично работает. –

+0

Я пытаюсь запустить его с PlayScreen, эта активность уже запущена из главного меню с помощью кнопки –

+0

пожалуйста, покажите, как вы начинаете/создать – csenga

Смежные вопросы