2015-02-11 5 views
0

Я пытаюсь сделать смену сцены от одного к другому от крана заданного спрайта. Для этого я создал SceneManager (как указано во многих рецептах AndEngine) с помощью метода setCurrentScene. Сначала я вхожу в заставку, чем экран меню, и чем первая игровая сцена. Переходы между этими сценами выполняются без проблем, но при переходе от первой игровой сцены к следующей возникают проблемы. Я получаю сообщение благородных предшественников:ArrayIndexOutOfBoundsException при смене сцены

02-11 19:56:59.192: E/AndroidRuntime(777): FATAL EXCEPTION: UpdateThread 
02-11 19:56:59.192: E/AndroidRuntime(777): java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 
02-11 19:56:59.192: E/AndroidRuntime(777):  at com.stockalley.resourcemanagers.PlaceResourceManager$1.onAreaTouched(PlaceResourceManager.java:125) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.entity.scene.Scene.onAreaTouchEvent(Scene.java:409) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.entity.scene.Scene.onSceneTouchEvent(Scene.java:357) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.engine.Engine.onTouchScene(Engine.java:452) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.engine.Engine.onTouchEvent(Engine.java:438) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.input.touch.controller.BaseTouchController$TouchEventRunnablePoolItem.run(BaseTouchController.java:102) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.util.adt.pool.RunnablePoolUpdateHandler.onHandlePoolItem(RunnablePoolUpdateHandler.java:54) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.util.adt.pool.RunnablePoolUpdateHandler.onHandlePoolItem(RunnablePoolUpdateHandler.java:1) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.util.adt.pool.PoolUpdateHandler.onUpdate(PoolUpdateHandler.java:88) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.input.touch.controller.BaseTouchController.onUpdate(BaseTouchController.java:62) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.engine.Engine.onUpdate(Engine.java:584) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.engine.Engine.onTickUpdate(Engine.java:548) 
02-11 19:56:59.192: E/AndroidRuntime(777):  at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820) 

Это код для спрайта, чтобы изменить изображение:

textBox.sprite = new StockSprite(textBox.sprite.getX(), textBox.sprite.getY(), 
       sm.engine.getSurfaceWidth(), 
       textBox.sprite.getHeight(), 
       textBox.region, sm.engine.getVertexBufferObjectManager()) { 

     @Override 
     public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float x, float y){ 
       if (pSceneTouchEvent.isActionDown()){ 
         if (lineCounter == 2 || !puttingText){ 
           // If the changeScene boolean is activated we should change the scene 
           if (changeScene) { 
             // We call the scene manager method to do it 
             sm.setCurrentScene(newScene); 
           } 

           // If we got to the lineCounter to the max we wait until the 
           // player touchs the screen 
           if (lineCounter >= lines.length || !puttingText){ 
             lineCounter = 0; 
             line1.setText(""); 
             line2.setText(""); 

             if (!puttingText) { 
               // We should make he disappear 
               dem.reset(); 
               sequence[k].mImage.sprite.clearEntityModifiers(); 
               sequence[k].mImage.sprite.registerEntityModifier(dem); 
             } 
           } 
         } 
       } 
       return super.onAreaTouched(pSceneTouchEvent, x, y); 
     } 
}; 

Это метод seCurrentScene

public void setCurrentScene(AllScenes currentScene){ 
       // Change the current scene 
       this.currentScene = currentScene; 
       switch(currentScene) { 
         case SPLASH: 
           break; 
         case MAINMENU: 
           // Set the scene to be the main menu 
           mmrm = new MainMenuResourceManager(this); 
           break; 
         case NEWGAME: 
           // Load the new game resource 
           hrm = new HouseResourceManager(this, true); 
           break; 
         case LOADGAME: 
           break; 
         case NEWSPAPER: 
           nprm = new NewspaperResourceManager(this); 
           break; 
         default: 
           break; 
       } 
     } 

И сцена, в которой переходный это

public class NewspaperResourceManager { 
     private SceneManager sm; 
     private Font cFont; 
     private Text line1; 
     private Scene nScene; 
     public NewspaperResourceManager(SceneManager s) { 
       sm = s; 
       loadFont(); 
       loadText(); 
       nScene = new Scene(); 
       nScene.setBackground(new Background(1,1,1)); 
       nScene.attachChild(line1); 
       sm.engine.setScene(nScene); 

     } 

     private void loadText() { 
       // TODO Auto-generated method stub 
       line1 = new Text(0.3f*sm.engine.getSurfaceWidth(), sm.engine.getSurfaceHeight()/2, 
           cFont, "Please Ivan-san make the images!", 48, sm.engine.getVertexBufferObjectManager()); 
     } 

     public void loadFont() { 
       // Set the font for the character 
       cFont = FontFactory.create(
         sm.engine.getFontManager(), 
         sm.engine.getTextureManager(), 
         256, 
         256, 
         Typeface.create(Typeface.DEFAULT, Typeface.NORMAL), 
         32f*((float)sm.engine.getSurfaceWidth()/800), 
         true); 
       cFont.prepareLetters("abcdefghijklmnopqrstuvwxyz!?-".toCharArray()); 
       cFont.load(); 
     } 
} 

ответ

2
sequence[k].mImage.sprite.clearEntityModifiers(); 
sequence[k].mImage.sprite.registerEntityModifier(dem); 

Не знаю, где k происходит, но масса массажа указана длиной 2 с индексом 0 и 1. В точке вы обрабатываете сенсорный вход и K получаете 3 по индексу 2. Индекс 2 не существует поэтому он выкинет индекс из строя.

+0

Если это исправить, я упаду как полный идиот. –

+0

Я идиот. Спасибо –

+0

Нет проблем, вы не идиот, просто что-то пропустили. Может случиться с любым –

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