ソース人の憩いの場

ソース人の憩いの場

Sourcegeneの説明と、時々技術的なこと。

Amebaでブログを始めよう!

こんにちは。

そーす人です。

 

クラウドソーシングとマーケットプレイスが合わさったサービスを展開しています。

https://www.source-gene.com

ゲームやそれ以外、画像素材などもソースジンで販売や募集ができます。ご利用いただければと思います。

 

連載でマッチ3ゲームを作っていきます。

 

---------------------------------------------------------

今回は前回作成した描画処理用のクラスを編集していきたいと思います。

SceneRenderer

を開きます。

以下のように追加します。

 

public class SceneRenderer implements GLSurfaceView.Renderer {


    @Override
    public void onDrawFrame(GL10 gl) {

    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {

    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

    }

}


上記のonDrawFrameに処理を書くことで画面に描画されます。

名称からなんとなく予測がつきますが、onSurfaceChangedで画面の大きさなどが変わった時に呼び出され、onSurfaceCreatedで初期化処理が呼び出されます。

 

ではonSurfaceCreatedにOpenGLの初期状態を定義してみましょう。

 

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    	//ティザの無効化
    gl.glDisable(GL10.GL_DITHER);

   	 //アンチエイリアスの設定
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);

   	 //塗りつぶし
    gl.glClearColor(0,0,0,0);

    	//陰影処理を設定
    gl.glShadeModel(GL10.GL_SMOOTH);

   	 //有効な描画方法を設定
    gl.glEnable(GL10.GL_DEPTH_TEST);
     gl.glEnable(GL10.GL_BLEND);
     gl.glEnable(GL10.GL_ALPHA_TEST);

     //アルファブレンド
    gl.glBlendFunc(GL10.GL_SRC_ALPHA,   	GL10.GL_ONE_MINUS_SRC_ALPHA);
     //アルファ値の比較
    gl.glAlphaFunc(GL10.GL_GREATER,0.1f);

}

 

 

以プログラムに直接コメントを振ってみました。

基本的にグラフィックの描画精度をどのようにするかを設定します。

当然、アンチエイリアスや陰影処理をスムース設定すると処理能力が必要になりますので、古い機種など貧弱な環境では厳しくなりますが、今回は3Dを使ってガンガン描画しましょうみたいなことはないので、まあ、大丈夫かな…と思います。

設定を変更するとどのように変わるかは、今後画面ができ始めたときに上記の値を変えて遊んでみてください。

 

今回、gl.glHintにGL_PERSPECTIVE_CORRECTION_HINTにGL10.GL_FASTESTを設定していますが、それ以外だと以下のようなものを設定できます。

 

項目は、

 

GL_FOG_HINT フォグの精度
GL_LINE_SMOOTH_HINT アンチエイリアス処理された線のサンプリング
GL_PERSPECTIVE_CORRECTION_HINT カラーとテクスチャ座標の補間精度
GL_POINT_SMOOTH_HINT アンチエイリアス処理された点のサンプリング
GL_POLYGON_SMOOTH_HINT アンチエイリアス処理されたポリゴンのサンプリング

 

値は、

GL_FASTEST 効率的
GL_NICEST 最高品質
GL_DONT_CARE 選択しない

 

のような感じです。

描画関係を最高にしたい場合は、全部の項目を最高品質にすれば良いわけですね。

 

OpenGLの部分は、ちょっと細かく説明しておりますが、もうちょっとペースを上げたいですね…。

まあ、のんびり分かりやすくいきますか。

 

次回は、テスト的に何か描画する説明をしたいと思います。

 

 

---------------------------------------------------------

 

 

製品、サンプルソース、デザイン、素材などIT開発関連マーケットプレイス+ワーキング

Sourcegene ソースジン

http://www.source-gene.com/

 

こんにちは。

そーす人です。

 

クラウドソーシングとマーケットプレイスが合わさったサービスを展開しています。

https://www.source-gene.com

ゲームやそれ以外、画像素材などもソースジンで販売や募集ができます。ご利用いただければと思います。

 

連載でマッチ3ゲームを作っていきます。

初心者向けに一つ一つ説明しながらじっくり作っていきます。

連載をじっくり追っていくと、全然わからない方でも、応用してゲームが作れるようになるんじゃないかと思います。

その際は、ぜひソースジンで販売もご検討ください!

 

---------------------------------------------------------

今回は描画処理などの下準備を整えていきたいと思います。

 

まず、

MainActivity

にライフサイクル用の関数をオーバーライドしておきます。

今の時点では準備をしておくだけなので、特に処理内容が入ることはないのですが、今後しようします。

ライフサイクルとは、アプリが、起動したり、一時停止したり、終了したりした際の立ち振る舞いです。

Androidの場合、他のアプリが立ち上がった、電話がかかってきた、充電が切れた、など様々な要因でゲームが中断されることがありますので、そういった際にどのように挙動をするかを決めておく必要があります。

 

先日作成したonCreate関数の下あたりに以下を追加します。

@Override
protected void onStart() {
    super.onStart();

}


@Override
protected void onStop() {
    super.onStop();
}


@Override
protected void onResume() {
    super.onResume();
}


@Override
protected void onPause() {
    super.onPause();
}


@Override
public void onDestroy() {
    super.onDestroy();
}

 

呼び出されるタイミングは、以下のような感じです。

 

 onCreate()  Activityが生成された最初の1回だけ呼び出される
 onStart()  Activityが画面に表示されるときに呼び出される
 onRestart()  ActivityがonStop()からの再開時に呼び出される。 このあと、onStart()が呼び出される。
 onResume()  Activityが前面になる時に呼び出される。
 onPause()  Activityがバックグラウンドに移動するときに呼び出される。
 onStop()  Activityが画面から見えなくなる時に呼び出される。
 onDestroy()  Activityが終わる時に呼び出される。

 

さて、次に、もう一つクラスを追加したいと思います。

先日、

GLSurfaceView

を追加しましたが、これの実際の画面描画を担当するクラスを作ります。

GLSurfaceViewの中に内部クラスとして宣言してしまうとクラス数的にすっきりはするのですが、コードが長くなってしまったり、初心者では後で分かりにくくなってしまったりする可能性があるので、外部のクラスとして新規作成します。

 

 

 

新しく作成します。

 

 

Interfaceにandroid.opengl.GLSurfaceView.Rendererを指定しておきましょう。

指定しなかった場合は、ソースが生成されたあと、implementsを追加してください。

 

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

public class SceneRenderer implements GLSurfaceView.Renderer {

 

で、上記のように使用するopenGLのクラスをimportしておきます。

 

続きは次回となります。

 

---------------------------------------------------------

 

 

製品、サンプルソース、デザイン、素材などIT開発関連マーケットプレイス+ワーキング

Sourcegene ソースジン

http://www.source-gene.com/

こんにちは。

そーす人です。

 

クラウドソーシングとマーケットプレイスが合わさったサービスを展開しています。

https://www.source-gene.com

 

マッチ3ゲームを作っていきます。

マッチ3とは、3つ揃えて消す、みたいなパズルゲームです。パズドラなどが有名ですね。

 

ここで出来上がったソースコードは、最終的に整形してソースジン上に掲載いたします。

ゲームやそれ以外、画像素材などもソースジンで販売や募集ができます。ご利用いただければと思います。

 

---------------------------------------------------------

さて、今回は、自動で生成されている

MainActivity
を変更します。


生成されているのは、
―――――――――――――――――――――――――――――――――――――――――
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
―――――――――――――――――――――――――――――――――――――――――
こんな感じかと思います。
これ以下のように変更します。


―――――――――――――――――――――――――――――――――――――――――
public class MainActivity extends AppCompatActivity {

    MySurfaceView mySV;     

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFormat(PixelFormat.TRANSLUCENT);

        mySV = new MySurfaceView(this);     
        setContentView(mySV);               
        mySV.requestFocus();                
        mySV.setFocusableInTouchMode(true); 
    }
}
―――――――――――――――――――――――――――――――――――――――――
もともと記述してあった
setContentView(R.layout.activity_main);
は画面表示にレイアウトのXMLファイルとしてactivity_main.xmlを使いますよ、という宣言ですが、前回作成したMySurfaceViewでOpenGLで画面を表示しますので、いらなくなります。
ゲーム用の画面ですので、それように表示するように設定をします。


デフォルトでは、端末を横にすると横向き用に画面が変わります。
これではゲームが成り立たなくなってしまいますので、横向きに固定します。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


ステータスバーなども消して画面を全画面表示します。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);


タイトルを消します。
requestWindowFeature(Window.FEATURE_NO_TITLE);


背景を半透明にします。
getWindow().setFormat(PixelFormat.TRANSLUCENT);


画面描画のためのクラスのインスタンスを生成します。ゲームの画面はここに描かれていくわけですね。
mySV = new MySurfaceView(this); 


画先ほど、setContentViewにセットしているactivity_mainを削除しましたが、代わりに上記のインスタンスをセットします。
setContentView(mySV);  


起動直後にカーソルを当てます。
mySV.requestFocus(); 
タッチモードでフォーカスを受け取れるようにしておきます。これで画面がタッチされたら反応を返すことができるようになります。
mySV.setFocusableInTouchMode(true); 

 

これで、画面描画をするための下準備が整いました。

 

続きは次回です。