【问题标题】:Problems with graphics in 2D Android game2D Android 游戏中的图形问题
【发布时间】:2012-02-15 15:32:24
【问题描述】:

我使用 OpenGL ES 为 Android 编写了 2d 游戏,但我遇到了问题。我一直在使用eclipse。当我在模拟器上开始游戏时,我只看到背景图像,我听到背景音乐和音效。屏幕上没有图形和精灵。在真实设备上(使用 Android 2.2)是相同的结果。这是我的 LogCat:

E/AndroidRuntime(328):致命异常:GLThread 9

E/AndroidRuntime(328): java.lang.IndexOutOfBoundsException: 无效 索引 1,大小为 0 E/AndroidRuntime(328):在 java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257) E/AndroidRuntime(328): at java.util.ArrayList.get(ArrayList.java:311)

E/AndroidRuntime(328): 在 arek.jumper.GameScreen.updateGameOver(GameScreen.java:166)

E/AndroidRuntime(328): 在 arek.jumper.GameScreen.update(GameScreen.java:86)

E/AndroidRuntime(328): 在 game.framework.impl.GLGame.onDrawFrame(GLGame.java:94) E/AndroidRuntime(328):在 android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1332)

E/AndroidRuntime(328): 在 android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1116)

updateGameOver 方法:

 private void updateGameOver() {

        List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
        int len = touchEvents.size();
        for(int i = 0; i < len; i++) {
        TouchEvent event = touchEvents.get(i);
        if(event.type != TouchEvent.TOUCH_UP)
        continue;
        game.setScreen(new MainMenuScreen(game));
        }
        }

更新方法:

@Override

public void update(float deltaTime) {
if(deltaTime > 0.1f)
deltaTime = 0.1f;
switch(state) {
case GAME_READY:
updateReady();
break;
case GAME_RUNNING:
updateRunning(deltaTime);
break;
case GAME_PAUSED:
updatePaused();
break;
case GAME_LEVEL_END:
updateLevelEnd();
break;
case GAME_OVER:
updateGameOver();
break;
}
}

和 onDrawFrame:

@Override

public void onDrawFrame(GL10 gl) {
GLGameState state = null;


synchronized(stateChanged) {
    state = this.state;
    }
    if(state == GLGameState.Running) {
    float deltaTime = (System.nanoTime()-startTime) / 1000000000.0f;
    startTime = System.nanoTime();
    screen.update(deltaTime);
    screen.present(deltaTime);
    }
    if(state == GLGameState.Paused) {
    screen.pause();
    synchronized(stateChanged) {
    this.state = GLGameState.Idle;
    stateChanged.notifyAll();
    }
    }
    if(state == GLGameState.Finished) {
    screen.pause();
    screen.dispose();
    synchronized(stateChanged) {
    this.state = GLGameState.Idle;
    stateChanged.notifyAll();
    }
    }
    }

onCreate 方法:

@覆盖 public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
glView = new GLSurfaceView(this);
glView.setRenderer(this);
setContentView(glView);
glGraphics = new GLGraphics(glView);
fileIO = new AndroidFileIO(getAssets());
audio = new AndroidAudio(this);
input = new AndroidInput(this, glView, 1, 1);
PowerManager powerManager = (PowerManager)
getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GLGame");
}

这是 OpenGL ES 库的问题吗? 有人对此有什么建议吗? 如何解决这个问题? 非常感谢

【问题讨论】:

  • 我在您的代码中看不到最可能导致问题的以下内容: 1. 表面初始化。像这样的视图 = new GLView(This) (在您的活动的 Oncreate 中)。 setContentView(view) 2. 渲染器配置
  • 这看起来与 OpenGL 无关,您需要修复数组索引越界异常。其中没有数组元素 [2],大小为 2 的数组只有 [0] 和 [1]。如果您尝试访问超过一个,则会出现该异常。请修正您的帖子,使其不包含 OpenGL。

标签: android opengl-es 2d-games


【解决方案1】:

改变

int len = touchEvents.size();
for(int i = 0; i < len; i++) {
TouchEvent event = touchEvents.get(i);
if(event.type != TouchEvent.TOUCH_UP)
continue;
game.setScreen(new MainMenuScreen(game));
}

for (TouchEvent touchEvent : touchEvents){
    if(touchEvent.type != TouchEvent.TOUCH_UP)
    continue;
    game.setScreen(new MainMenuScreen(game));
}

这样你就不会冒险在列表中请求一个不存在的对象。如果列表为空,就像您的情况一样,它根本不会运行。

我不知道它是否能完全解决您的问题;但你应该摆脱 indexOutOfBOundsException。

【讨论】:

  • 我改变了它,我有一个错误:E/libEGL(301): 无法加载 库(无法加载库:load_library[984]: Library 'libhgl.so'未找到)。
  • 您能否发布您的 logcat 以及导致它的相应代码。很多人都有这个问题,而且发生这种情况的原因似乎很多。
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 2023-03-07
  • 2020-12-31
相关资源
最近更新 更多