Я пытаюсь сделать смену сцены от одного к другому от крана заданного спрайта. Для этого я создал 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();
}
}
Если это исправить, я упаду как полный идиот. –
Я идиот. Спасибо –
Нет проблем, вы не идиот, просто что-то пропустили. Может случиться с любым –