我试图通过给定精灵的点击将场景从一个变为另一个。为此,我使用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();
}
}
答案 0 :(得分:2)
sequence[k].mImage.sprite.clearEntityModifiers();
sequence[k].mImage.sprite.registerEntityModifier(dem);
我不知道k来自哪里,但按摩表示长度为2,因此索引为0和1.在某一点,您正在处理触摸输入,K在索引2处得到3。 索引2不存在,因此它会使索引超出范围。