Javaで記述されたCocos2DでAndroidで2Dゲームを作成しています。主なもののコードは次のとおりです。
public void gameLoop(float dt) {
//Player Gravity
if(canExecuteMovement(0, 6)) {
guy.moveY(6);
}
//Player Movement
if(direction == 1) {
if(canExecuteMovement(-3, 0))
guy.moveX(-3);
} else if(direction == 2) {
if(canExecuteMovement(3, 0))
guy.moveX(3);
}
}
private boolean canExecuteMovement(int xChange, int yChange) {
int projectedX = guy.getBounds().left + xChange;
int projectedY = guy.getBounds().top + yChange;
Log.i("DD", "guy:" + guy.getBounds().toString());
Rect projectedBounds = new Rect(projectedX, projectedY, projectedX + guy.getWidth(), projectedY + guy.getHeight());
Log.i("DD", "guy:" + projectedBounds.toString());
for (int i = 0; i < platformCount; i++) {
if (Rect.intersects(projectedBounds, platform[i].getBounds())) {
return false;
}
}
return true;
}
ご覧のとおり、この関数は見た目が良く、canExecuteMovementの長方形も完全にきれいですが、この行では:
LINE 107: if (Rect.intersects(projectedBounds, platform[i].getBounds())) {
InvocationTargetExceptionが発生しています。 logcatは次のとおりです。
01-21 23:10:12.601: W/System.err(13118): Java.lang.reflect.InvocationTargetException
01-21 23:10:12.601: W/System.err(13118): at Java.lang.reflect.Method.invokeNative(Native Method)
01-21 23:10:12.605: W/System.err(13118): at Java.lang.reflect.Method.invoke(Method.Java:511)
01-21 23:10:12.605: W/System.err(13118): at org.cocos2d.actions.CCTimer.update(CCTimer.Java:82)
01-21 23:10:12.605: W/System.err(13118): at org.cocos2d.actions.CCScheduler.tick(CCScheduler.Java:253)
01-21 23:10:12.605: W/System.err(13118): at org.cocos2d.nodes.CCDirector.drawCCScene(CCDirector.Java:679)
01-21 23:10:12.605: W/System.err(13118): at org.cocos2d.nodes.CCDirector.onDrawFrame(CCDirector.Java:649)
01-21 23:10:12.605: W/System.err(13118): at Android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.Java:1462)
01-21 23:10:12.605: W/System.err(13118): at Android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.Java:1216)
01-21 23:10:12.605: W/System.err(13118): Caused by: Java.lang.NullPointerException
01-21 23:10:12.608: W/System.err(13118): at com.qasim.platformer.GameLayer.canExecuteMovement(GameLayer.Java:107)
01-21 23:10:12.608: W/System.err(13118): at com.qasim.platformer.GameLayer.gameLoop(GameLayer.Java:86)
01-21 23:10:12.608: W/System.err(13118): ... 8 more
01-21 23:10:12.620: D/dalvikvm(13118): GC_CONCURRENT freed 460K, 6% free 9279K/9863K, paused 2ms+3ms
01-21 23:10:12.624: I/DD(13118): guy:Rect(252, 63 - 300, 111)
何が問題なのでしょうか? guyのgetBounds()クラスは次のとおりです。
public Rect getBounds() {
return new Rect(x, y, x+width, y+height);
}
InvocationTargetException
は、動的呼び出し内でスローされる例外の単なるラッパーです。本当の問題は NullPointerException
それがラッピングしていることです:
_Caused by: Java.lang.NullPointerException
at com.qasim.platformer.GameLayer.canExecuteMovement(GameLayer.Java:107)
at com.qasim.platformer.GameLayer.gameLoop(GameLayer.Java:86)
_
あなたが指摘したように、これは問題のある行です:
_if (Rect.intersects(projectedBounds, platform[i].getBounds())) {
_
この行でnullポインタが発生する可能性があるのは、platform[i].getBounds()
のみです。 platform
自体がnull
であるか、_platform[i]
_の要素がそうです。