2012-02-21 25 views
3

問題はonCreate()が呼び出されていないことです!私は本当に原因は分かりませんが、Log.d()はonCreate()とonSurfaceCreated()で呼び出されていないことがわかります。私はAndroidのゲーム2011のコードは、例えば、ここで始まり呼ば読んでいます帳から三角形を作るためのOpenGL ESを使用しようとしています:ここでhttp://beginning-android-games.googlecode.com/svn/trunk/ch07-gl-basics/Android onCreateが呼び出されていませんか?

は私のコードです:

AndroidManifest.xmlを

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="another.game" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:debuggable="true" > 
     <activity 
      android:name=".Main" 
      android:label="@string/app_name" 
      android:configChanges="keyboard|keyboardHidden|orientation" 
      android:screenOrientation="landscape" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8"/> 

</manifest> 

Main.java

package another.game; 

public class Main extends GLTriangleGame { 

// @Override 
// public Screen getStartScreen() { 
//  return new LoadingScreen(this); 
// } 
} 

GLGame.java

package framework.impl; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import framework.Audio; 
import framework.FileIO; 
import framework.Game; 
import framework.Graphics; 
import framework.Input; 
import framework.Screen; 
import android.app.Activity; 
import android.content.Context; 
import android.opengl.GLSurfaceView; 
import android.opengl.GLSurfaceView.Renderer; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 
import android.util.Log; 
import android.view.Window; 
import android.view.WindowManager; 

public abstract class GLGame extends Activity implements Game, Renderer { 
    enum GLGameState { 
     Initialized, 
     Running, 
     Paused, 
     Finished, 
     Idle 
    } 

    GLSurfaceView glView; 
    GLGraphics glGraphics; 
    Audio audio; 
    Input input; 
    FileIO fileIO; 
    Screen screen; 
    GLGameState state = GLGameState.Initialized; 
    Object stateChanged = new Object(); 
    long startTime = System.nanoTime(); 
    WakeLock wakeLock; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     Log.d("requestWindowFeature", "Past point"); 
     this.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, "AnotherGame"); 
    } 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     Log.d("onSurfaceCreated()", "Worked!"); 
     glGraphics.setGl(gl); 

     synchronized(stateChanged) { 
      if(state == GLGameState.Initialized) { 
       screen = getStartScreen(); 
       Log.d("getStartScreen()", "Worked!"); 
      } 
      state = GLGameState.Running; 
      screen.resume(); 
      startTime = System.nanoTime(); 
     } 
    } 

    @Override 
    public void onDrawFrame(GL10 arg0) { 
     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(); 
      } 
     } 
    } 

    @Override 
    public void onSurfaceChanged(GL10 arg0, int arg1, int arg2) { 
     // Not much to do. Screen will note change! 
    } 

    @Override 
    public void setScreen(Screen screen) { 
     if(screen!= null) { 
      this.screen.pause(); 
      this.screen.dispose(); 
      screen.resume(); 
      screen.update(0); 
      this.screen = screen; 
     } else { 
      throw new IllegalArgumentException("Screen must not be null!"); 
     } 
    } 

    public GLGraphics getGLGraphics() { 
     return this.glGraphics; 
    } 

    public Graphics getGraphics() { 
     throw new IllegalStateException("Using OpenGL!"); 
    } 

    @Override 
    public Input getInput() { 
     return this.input; 
    } 

    @Override 
    public Screen getScreen() { 
     return this.screen; 
    } 

    @Override 
    public Audio getAudio() { 
     return this.audio; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     glView.onResume(); 
     wakeLock.acquire(); 
    } 

    @Override 
    public void onPause() { 
     synchronized(stateChanged) { 
      if(isFinishing()) { 
       state = GLGameState.Finished; 
      } else { 
       state = GLGameState.Paused; 
      } 
      while(true) { 
       try { 
        stateChanged.wait(); 
        break; 
       } catch(Exception e) { 
       } 
      } 
     } 
     wakeLock.release(); 
     glView.onPause(); 
     super.onPause(); 
    } 
} 

GLTriangleGame.java

package another.game; 

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

import javax.microedition.khronos.opengles.GL10; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.os.PowerManager.WakeLock; 
import framework.Game; 
import framework.Screen; 
import framework.impl.FastRenderView; 
import framework.impl.GLGame; 
import framework.impl.GLGraphics; 

public class GLTriangleGame extends GLGame { 

    @Override 
    public Screen getStartScreen() { 
     return new TriangleScreen(this); 
    } 

    public class TriangleScreen extends Screen { 
     GLGraphics glGraphics; 
     FloatBuffer vertices; 

     public TriangleScreen(Game game) { 
      super(game); 
      glGraphics = ((GLGame) game).getGLGraphics(); 

      ByteBuffer byteBuffer = ByteBuffer.allocate(3 * 2 * 4); 
      byteBuffer.order(ByteOrder.nativeOrder()); 
      vertices = byteBuffer.asFloatBuffer(); 
      vertices.put(new float[] { 
         0.0f,  0.0f, 
        319.0f,  0.0f, 
        160.0f, 479.0f 
      }); 
      vertices.flip(); 
     } 

     @Override 
     public void update(float deltaTime) { 
      game.getInput().getTouchEvents(); 
      game.getInput().getKeyEvents(); 
     } 

     @Override 
     public void present(float deltaTime) { 
      GL10 gl = glGraphics.getGL(); 
      gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight()); 
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
      gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadIdentity(); 
      gl.glOrthof(0, 320, 0, 480, 1, -1); 

      gl.glColor4f(1, 0, 0, 1); 
      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices); 
      gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 
     } 

     @Override 
     public Bitmap getCurrentScreen() { 
      // Nothing yet 
      return null; 
     } 

     @Override 
     public void pause() { 
      // Nothing yet 
     } 

     @Override 
     public void resume() { 
      // Nothing yet 
     } 

     @Override 
     public void dispose() { 
      // Nothing yet 
     } 
    } 

    @Override 
    public Assets getAssetsClass() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public FastRenderView getFastRenderView() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int getFrameWidth() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public int getFrameHeight() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public float getScaleX() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public float getScaleY() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public Context getContext() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public WakeLock getWakeLock() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

GLGraphics.java

package framework.impl; 

import javax.microedition.khronos.opengles.GL10; 
import android.opengl.GLSurfaceView; 

public class GLGraphics { 
    GLSurfaceView glView; 
    GL10 gl; 

    GLGraphics(GLSurfaceView glView) { 
     this.glView = glView; 
    } 

    public GL10 getGL() { 
     return gl; 
    } 

    public void setGl(GL10 gl) { 
     this.gl = gl; 
    } 

    public int getWidth() { 
     return glView.getWidth(); 
    } 

    public int getHeight() { 
     return glView.getHeight(); 
    } 
} 
+0

なぜメインにランチャーアクティビティがありますか? – user936414

+0

@ user936414これはちょうどその方法で生成されたものであり、確かではありません。私はMAINクラスと関係があると思っていましたが、そうではないようです。それはいつもうまくいっていて、私はOpenGLで動作しないローディング画面でテストしました...だから私はそれが問題だとは思っていません。 – Zeveso

答えて

0

はonResumeのすべてと同様にのonCreateをインスタンス化するコードを入れてみてください。

+0

それはなぜ機能するのですか? onCreateのLogに到達することさえありません。 (GLGame.javaの48行目) – Zeveso

+0

時には特定の条件によってアプリケーションがonresumeに撮影されることがあるためです。私はそれが奇妙に聞こえることは知っているが、私は異なるデバイス上で私のアプリケーションの問題をデバッグしながら見たことがあり、時々私はonresumeで物事をインスタンス化することによってそれを修正することができます。インスタンス化したいものが最初にnullであるかどうかを確認します。 –

+0

ここでは取引があります。なぜなら、コードは "input = new AndroidInput(this、glView、1、1);"までonCreateで実行されているからです。しかし、私はまだ "this.requestWindowFeature(Window.FEATURE_NO_TITLE);でタイトルを取り除くことはできません; ...何が間違っていますか? – Zeveso

0

あなたのonCreate()メソッドで次の行が欠落していると思います。

setContentView(R.layout.main); 
+0

なぜコンテンツを設定しないでしょうか(glView);作業?また、setContentView(R.layout.main);私は 'メインは解決できないか、フィールドではない'というエラーを出しました。 – Zeveso

+0

HesはsetContentView(glView)でこれを取得しました。私はsomethingsがoncreateを撮影し、onresumeに行くために彼のアプリを引き起こすと思っていた –

+0

@ Jamesandresakis私は何を探しますか?これに関する情報は? – Zeveso

1

あなたのソースはリンク元のコピーではありません。

ソースでは、android:name = "。Main"は、パッケージ "another.game"で定義されているクラスmainのonCreateを探します。あなたの情報源からはこれが存在することは明らかではありません。あなたが使っているクラスは、抽象的ではないはずですか?

0

問題はログ機能内にあると思います。

私はAndroidの初心者ですので、Log関数の仕組みはわかりませんが、フィードバックが得られないという大きな問題がありました。

Logをe(error)に設定した後、私はフィードバックを得始めました。それがあなたを助けることを願ってください。

関連する問題