2015-07-03 35 views
-1
package com.example.testnew; 

import org.andengine.opengl.texture.ITexture; 
import org.andengine.opengl.texture.bitmap.BitmapTexture; 
import org.andengine.opengl.texture.region.ITextureRegion; 
import org.andengine.opengl.texture.region.TextureRegionFactory; 
import org.andengine.util.adt.io.in.IInputStreamOpener; 
import org.andengine.util.debug.Debug; 

import java.io.IOException; 
import java.io.InputStream; 

import org.andengine.engine.camera.Camera; 
import org.andengine.engine.options.EngineOptions; 
import org.andengine.engine.options.ScreenOrientation; 
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; 
import org.andengine.entity.scene.Scene; 
import org.andengine.entity.sprite.Sprite; 
import org.andengine.ui.activity.SimpleBaseGameActivity; 


import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MainActivity extends SimpleBaseGameActivity { 

    private static int CAMERA_WIDTH = 800; 
    private static int CAMERA_HEIGHT = 480; 

    private ITextureRegion mBackgroundTextureRegion, mTowerTextureRegion,  mRing1, mRing2, mRing3; 

    ITexture backgroundTexture,ring1,ring2,ring3,towerTexture; 



    @Override 
public EngineOptions onCreateEngineOptions() { 

    final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 

      return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, 
    new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera); 

} 


@Override 
protected void onCreateResources() throws IOException { 

try{ 

     ITexture backgroundTexture = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() 
     { 

     @Override 
     public InputStream open() throws IOException 
     { 
      //AssetManager Class:-getAsset(); 
      //Provides access to an application's raw asset files 
      // for the way most applications will want to retrieve their resource data. 
      return getAssets().open("gfx/background.png"); 
      } 
     }); 
ITexture towerTexture = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() 
     { 
      @Override 
      public InputStream open() throws IOException { 
      return getAssets().open("gfx/tower.png"); 
      } 
     }); 

     ITexture ring1 = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() 
     { 
      @Override 
      public InputStream open() throws IOException { 
       return getAssets().open("gfx/ring1.png"); 
       } 
     }); 

     ITexture ring2 = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() 
     { 
       @Override 
       public InputStream open() throws IOException { 
       return getAssets().open("gfx/ring2.png"); 
       } 
     }); 

     ITexture ring3 = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() 
     { 
      @Override 
      public InputStream open() throws IOException { 
      return getAssets().open("gfx/ring3.png"); 
       } 
     }); 

      backgroundTexture.load(); 
      towerTexture.load(); 
      ring1.load(); 
      ring2.load(); 
      ring3.load();  
    } catch (IOException e) { 
      Debug.e(e); 
    }  

this.mBackgroundTextureRegion = TextureRegionFactory.extractFromTexture(backgroundTexture); 
this.mTowerTextureRegion = TextureRegionFactory.extractFromTexture(towerTexture); 
this.mRing1 = TextureRegionFactory.extractFromTexture(ring1); 
this.mRing2 = TextureRegionFactory.extractFromTexture(ring2); 

mBackgroundTextureRegion.setTextureSize(1600, 1000); 
} 

@Override 
protected Scene onCreateScene() { 

    final Scene scene = new Scene(); 

    Sprite backgroundSprite = new Sprite(0, 0, this.mBackgroundTextureRegion, getVertexBufferObjectManager()); 
    scene.attachChild(backgroundSprite); 

    return scene; 

} 

} 

我的例外:我試圖讓河內簡單的遊戲塔在android系統與andengine.And我得到以下異常

07-03 13:04:23.904: E/AndEngine(7060): MainActivity.onCreateGame failed. @(Thread: 'GLThread 216') 
07-03 13:04:23.904: E/AndEngine(7060): java.lang.NullPointerException 
07-03 13:04:23.904: E/AndEngine(7060): at org.andengine.opengl.texture.region.TextureRegionFactory.extractFromTexture(TextureRegionFactory.java:50) 
07-03 13:04:23.904: E/AndEngine(7060): at org.andengine.opengl.texture.region.TextureRegionFactory.extractFromTexture(TextureRegionFactory.java:42) 
07-03 13:04:23.904: E/AndEngine(7060): at com.example.testnew.MainActivity.onCreateResources(MainActivity.java:144) 
07-03 13:04:23.904: E/AndEngine(7060): at org.andengine.ui.activity.SimpleBaseGameActivity.onCreateResources(SimpleBaseGameActivity.java:43) 
07-03 13:04:23.904: E/AndEngine(7060): at org.andengine.ui.activity.BaseGameActivity.onCreateGame(BaseGameActivity.java:183) 
07-03 13:04:23.904: E/AndEngine(7060): at org.andengine.ui.activity.BaseGameActivity.onSurfaceCreated(BaseGameActivity.java:112) 
07-03 13:04:23.904: E/AndEngine(7060): at org.andengine.opengl.view.EngineRenderer.onSurfaceCreated(EngineRenderer.java:80) 
07-03 13:04:23.904: E/AndEngine(7060): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1494) 
07-03 13:04:23.904: E/AndEngine(7060): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 

回答

1

你的問題可能是你捕捉和記錄任何異常,只是繼續使用您的onCreateResources方法,這意味着您的某些變量(backgroundTexture,towerTexture,ring1ring2 - 取決於第43行)保持未初始化狀態,導致NullPointerException

相反的Debug.e(e),重新拋出異常作爲RuntimeException對於初學者,這樣,你的代碼可以編譯,並且你的代碼將與你的問題的真正原因崩潰 - 直到你解決它:

} catch (IOException e) { 
    throw new RuntimeException(e); 
} 

在一般情況下,捕獲並記錄一個異常,然後繼續前進是非常糟糕的做法,因爲您將繼續執行處於不一致狀態的程序。我始終將異常重新拋出爲未經檢查的異常(RuntimeException),直到我的代碼正常工作,然後找出我想如何處理特定的異常。