更改场景时出现ArrayIndexOutOfBoundsException

时间:2015-02-11 21:56:54

标签: java android opengl-es-2.0 andengine

我试图通过给定精灵的点击将场景从一个变为另一个。为此,我使用setCurrentScene方法创建了一个SceneManager(在许多AndEngine配方中引用)。我首先进入启动画面,而不是菜单屏幕,而不是第一个游戏场景。这些场景之间的过渡没有问题,但是当从第一个游戏场景变为下一个场景时,问题开始发生。我收到了一条消息:

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();
        }
}

1 个答案:

答案 0 :(得分:2)

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

我不知道k来自哪里,但按摩表示长度为2,因此索引为0和1.在某一点,您正在处理触摸输入,K在索引2处得到3。 索引2不存在,因此它会使索引超出范围。