Почему я получаю исключение нулевого указателя потока обновления (Android AndEngine)?

Я новичок в использовании AndEngine и пытаюсь получить спрайт для увеличения размера при касании . Это похоже на работу, но иногда эта ошибка иногда возникает. Есть идеи? На данный момент мне просто нужно достаточно текста, поэтому я позволю мне задать свой вопрос. Если кому-то нужна дополнительная информация, дайте мне знать, и я опубликую его. Я очень открыт для идей. Если у вас есть лучший способ или проблема с кодом, сообщите мне. На данный момент мир физики даже не работает.

 06-17 22:44:25.809: E/AndroidRuntime(20526): FATAL EXCEPTION: UpdateThread 06-17 22:44:25.809: E/AndroidRuntime(20526): java.lang.NullPointerException 06-17 22:44:25.809: E/AndroidRuntime(20526): at org.andengine.util.modifier.ModifierList.onUpdate(ModifierList.java:66) 06-17 22:44:25.809: E/AndroidRuntime(20526): at org.andengine.entity.Entity.onManagedUpdate(Entity.java:1392) 06-17 22:44:25.809: E/AndroidRuntime(20526): at org.andengine.entity.Entity.onUpdate(Entity.java:1167) 06-17 22:44:25.809: E/AndroidRuntime(20526): at org.andengine.entity.Entity.onManagedUpdate(Entity.java:1402) 06-17 22:44:25.809: E/AndroidRuntime(20526): at org.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:284) 06-17 22:44:25.809: E/AndroidRuntime(20526): at org.andengine.entity.Entity.onUpdate(Entity.java:1167) 06-17 22:44:25.809: E/AndroidRuntime(20526): at org.andengine.engine.Engine.onUpdateScene(Engine.java:591) 06-17 22:44:25.809: E/AndroidRuntime(20526): at org.andengine.engine.Engine.onUpdate(Engine.java:586) 06-17 22:44:25.809: E/AndroidRuntime(20526): at org.andengine.engine.Engine.onTickUpdate(Engine.java:548) 06-17 22:44:25.809: E/AndroidRuntime(20526): at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820) 

Это мой код:

 public class TestGFX2Activity extends SimpleBaseGameActivity implements IAccelerationListener, IOnSceneTouchListener { /** Called when the activity is first created. */ private static final int CAMERA_WIDTH = 720; private static final int CAMERA_HEIGHT = 480; private final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f); private BitmapTextureAtlas mBitmapTextureAtlas; private TextureRegion circleTR; private Scene scene; boolean down=false; float scale; final float growRate = (float) .0001; private PhysicsWorld mPhysicsWorld; @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 public void onCreateResources() { /*Line 66*/ this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 64, 128, TextureOptions.BILINEAR); //Line 66 this.circleTR = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "circle.png", 0, 0); // 64x32 this.mBitmapTextureAtlas.load(); } @Override public Scene onCreateScene() { this.mEngine.registerUpdateHandler(new FPSLogger()); this.scene = new Scene(); this.scene.setBackground(new Background(0, 1, 0)); Log.e("Tag","Got to background"); this.scene.setOnSceneTouchListener(this); this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false); final VertexBufferObjectManager vertexBufferObjectManager = this.getVertexBufferObjectManager(); final Rectangle ground = new Rectangle(0, CAMERA_HEIGHT - 2, CAMERA_WIDTH, 2, vertexBufferObjectManager); final Rectangle roof = new Rectangle(0, 0, CAMERA_WIDTH, 2, vertexBufferObjectManager); final Rectangle left = new Rectangle(0, 0, 2, CAMERA_HEIGHT, vertexBufferObjectManager); final Rectangle right = new Rectangle(CAMERA_WIDTH - 2, 0, 2, CAMERA_HEIGHT, vertexBufferObjectManager); final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f); PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground, BodyType.StaticBody, wallFixtureDef); PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof, BodyType.StaticBody, wallFixtureDef); PhysicsFactory.createBoxBody(this.mPhysicsWorld, left, BodyType.StaticBody, wallFixtureDef); PhysicsFactory.createBoxBody(this.mPhysicsWorld, right, BodyType.StaticBody, wallFixtureDef); this.scene.attachChild(ground); this.scene.attachChild(roof); this.scene.attachChild(left); this.scene.attachChild(right); this.scene.registerUpdateHandler(this.mPhysicsWorld); return this.scene; } @Override public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) { Sprite face; Body body; scale = 1; if(this.mPhysicsWorld != null) { if(pSceneTouchEvent.isActionDown()) { //this.addFace(pSceneTouchEvent.getX(), pSceneTouchEvent.getY()); down = true; face = new Sprite(pSceneTouchEvent.getX(), pSceneTouchEvent.getY(), circleTR, this.getVertexBufferObjectManager()); body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF); new Thread(new Grow(face)).start(); return true; } else if(pSceneTouchEvent.isActionUp()){ down = false; } } return false; } @Override public void onAccelerationAccuracyChanged(final AccelerationData pAccelerationData) { } @Override public void onAccelerationChanged(final AccelerationData pAccelerationData) { final Vector2 gravity = Vector2Pool.obtain(pAccelerationData.getX(), pAccelerationData.getY()); this.mPhysicsWorld.setGravity(gravity); Vector2Pool.recycle(gravity); } @Override public void onResumeGame() { super.onResumeGame(); this.enableAccelerationSensor(this); } @Override public void onPauseGame() { super.onPauseGame(); this.disableAccelerationSensor(); } private class Grow implements Runnable{ Sprite s; ScaleModifier mod; public Grow(Sprite sprite){ s = sprite; scene.attachChild(s); } public void run(){ while(down){ //Log.e("Tag",Float.toString(scale)); s.clearEntityModifiers(); mod = new ScaleModifier((float) .1,scale,scale+growRate); scale+=growRate; s.registerEntityModifier(mod); /*s.detachSelf(); s.setScale(scale); scale += growRate; try{ Thread.sleep(100); }catch(InterruptedException e){} scene.attachChild(s);*/ } } } } в public class TestGFX2Activity extends SimpleBaseGameActivity implements IAccelerationListener, IOnSceneTouchListener { /** Called when the activity is first created. */ private static final int CAMERA_WIDTH = 720; private static final int CAMERA_HEIGHT = 480; private final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f); private BitmapTextureAtlas mBitmapTextureAtlas; private TextureRegion circleTR; private Scene scene; boolean down=false; float scale; final float growRate = (float) .0001; private PhysicsWorld mPhysicsWorld; @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 public void onCreateResources() { /*Line 66*/ this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 64, 128, TextureOptions.BILINEAR); //Line 66 this.circleTR = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "circle.png", 0, 0); // 64x32 this.mBitmapTextureAtlas.load(); } @Override public Scene onCreateScene() { this.mEngine.registerUpdateHandler(new FPSLogger()); this.scene = new Scene(); this.scene.setBackground(new Background(0, 1, 0)); Log.e("Tag","Got to background"); this.scene.setOnSceneTouchListener(this); this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false); final VertexBufferObjectManager vertexBufferObjectManager = this.getVertexBufferObjectManager(); final Rectangle ground = new Rectangle(0, CAMERA_HEIGHT - 2, CAMERA_WIDTH, 2, vertexBufferObjectManager); final Rectangle roof = new Rectangle(0, 0, CAMERA_WIDTH, 2, vertexBufferObjectManager); final Rectangle left = new Rectangle(0, 0, 2, CAMERA_HEIGHT, vertexBufferObjectManager); final Rectangle right = new Rectangle(CAMERA_WIDTH - 2, 0, 2, CAMERA_HEIGHT, vertexBufferObjectManager); final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f); PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground, BodyType.StaticBody, wallFixtureDef); PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof, BodyType.StaticBody, wallFixtureDef); PhysicsFactory.createBoxBody(this.mPhysicsWorld, left, BodyType.StaticBody, wallFixtureDef); PhysicsFactory.createBoxBody(this.mPhysicsWorld, right, BodyType.StaticBody, wallFixtureDef); this.scene.attachChild(ground); this.scene.attachChild(roof); this.scene.attachChild(left); this.scene.attachChild(right); this.scene.registerUpdateHandler(this.mPhysicsWorld); return this.scene; } @Override public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) { Sprite face; Body body; scale = 1; if(this.mPhysicsWorld != null) { if(pSceneTouchEvent.isActionDown()) { //this.addFace(pSceneTouchEvent.getX(), pSceneTouchEvent.getY()); down = true; face = new Sprite(pSceneTouchEvent.getX(), pSceneTouchEvent.getY(), circleTR, this.getVertexBufferObjectManager()); body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF); new Thread(new Grow(face)).start(); return true; } else if(pSceneTouchEvent.isActionUp()){ down = false; } } return false; } @Override public void onAccelerationAccuracyChanged(final AccelerationData pAccelerationData) { } @Override public void onAccelerationChanged(final AccelerationData pAccelerationData) { final Vector2 gravity = Vector2Pool.obtain(pAccelerationData.getX(), pAccelerationData.getY()); this.mPhysicsWorld.setGravity(gravity); Vector2Pool.recycle(gravity); } @Override public void onResumeGame() { super.onResumeGame(); this.enableAccelerationSensor(this); } @Override public void onPauseGame() { super.onPauseGame(); this.disableAccelerationSensor(); } private class Grow implements Runnable{ Sprite s; ScaleModifier mod; public Grow(Sprite sprite){ s = sprite; scene.attachChild(s); } public void run(){ while(down){ //Log.e("Tag",Float.toString(scale)); s.clearEntityModifiers(); mod = new ScaleModifier((float) .1,scale,scale+growRate); scale+=growRate; s.registerEntityModifier(mod); /*s.detachSelf(); s.setScale(scale); scale += growRate; try{ Thread.sleep(100); }catch(InterruptedException e){} scene.attachChild(s);*/ } } } } 

Вместо того, чтобы называть этот отдельный поток, вы, вероятно, должны называть это

 new Grow(face)).start(); 

В блоке runOnUpdate (), как в

 myActivity.runonUpdateThread(new Grow(face))); 

Просто замените

 new Thread(new Grow(face)).start(); 

с

 TestGFX2Activity.runonUpdateThread(new Grow(face))); 
Intereting Posts
Android: autocompletetextview, список предложений отображается над текстом? Не удается выполнить отладку через onReceive () в загруженном получателе Андроидальная камера: Ошибка выдачи результата ResultInfo {who = null, request = 0, result = -1, data = null} к активности Снять дополнительное пространство вокруг GridView программно Несколько прядильщиков и onItemSelected Как создать полупрозрачную страницу инструкций в Android? Какой самый простой способ поддерживать синхронизацию базы данных между несколькими устройствами iOS и Android? RecyclerView странное поведение раздувания клеток Размер карты IllegalStateException не должен быть 0 Добавить неправильное место в mapview? Что означают цветные пузыри в средстве просмотра иерархии? Уникальный идентификатор Android SMS Android objectAnimator animate backgroundColor of Layout Андроид вертикальная оценка бар размер вопрос Как проверить, что намерение транслировалось