2015-02-11 166 views
0

我试图从给定精灵的抽头做出另一个从一个场景变化。要做到这一点,我创建了一个场景管理器(引许多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在索引2上得到3的情况下。 索引2不存在所以它会抛出一个索引超出界限。

+0

如果解决这个问题,我会下跌像一个完整的白痴 – 2015-02-11 23:04:53

+0

我是个白痴。谢谢 – 2015-02-12 00:59:26

+0

没问题,你是不是只是错过了一些白痴。任何人都可能遇到 – 2015-02-12 09:03:40

相关问题