JavaとJavaEEプログラマのブログ

JavaEEを中心にしたをソフトウェア開発についてのブログ

ハエの表示と移動まで

EsGameRenderクラスにハエの表示と移動の処理を追加。
GCが走ると一瞬、移動が止まる…。LogCatを見るとGCに100msほどかかっている。

package sample.game;

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

import sample.game.utils.TextureLoader;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.Log;

import static sample.game.utils.GraphicUtils.*;

public class EsGameRender implements GLSurfaceView.Renderer {

	private final int one = 0x10000;

	private Context context;

	public EsGameRender(Context context){
		this.context = context;
	}

	@Override
	public void onDrawFrame(GL10 gl10) {

		makeWorld(gl10);
		drawTextureRectangle(gl10, context, 0.0f, 0.0f, 2.0f, 3.0f, background, 0, 0, 0, one);//背景

		moveTarget();

		gl10.glPushMatrix();
		gl10.glTranslatef(targetX, targetY, 0.0f);
		gl10.glRotatef(targetAngle, 0.0f, 0.0f, 1.0f);
		gl10.glScalef(targetSize, targetSize, 1.0f);
		drawTextureRectangle(gl10, context, 0.0f, 0.0f, 1.0f, 1.0f, target, 0, 0, 0, one);//標的
		gl10.glPopMatrix();

	}


	private void moveTarget() {

		//100回に1度の割合で方向を転換する。
		if((int)(Math.random() * (100+1)) % 100 == 0 ){

			//旋回角度を-2.0〜2.0の範囲で変化させる。
			targetTurnAngle = (float) (Math.random()  * 4.0f - 2.0f );
			Log.d("EsGame", "方向転換! targetTurnAngle=" + targetTurnAngle);
		}


		targetAngle = targetAngle + targetTurnAngle;
		double theta = targetAngle / 180.0 * Math.PI;
		targetX = (float) (targetX + Math.cos(theta) * targetSpeed);
		targetY = (float) (targetY + Math.sin(theta) * targetSpeed);

		//画面外へ出たら反対の端へ移動させる
		if(targetX >= 2.0f){
			targetX -= 4.0f;
		}else if(targetX <= -2.0f){
			targetX += 4.0f;
		}

		if(targetY >= 2.5f){
			targetY -= 5.0f;
		}else if(targetY <= -2.5f){
			targetY += 5.0f;
		}

	}

	@Override
	public void onSurfaceChanged(GL10 gl10, int width, int height) {
		gl10.glViewport(0, 0, width, height);
	}

	@Override
	public void onSurfaceCreated(GL10 gl10, EGLConfig eglconfig) {
		background = TextureLoader.loadTexture(gl10, context, R.drawable.circuit);//リソース読み込み
		target = TextureLoader.loadTexture(gl10, context, R.drawable.fly);
		targetAngle = 30.0f;//初期の角度は30度
		targetX =  0.5f; //右に0.5f
		targetY = -0.5f; //下に0.5f
		targetSize = 0.5f; //大きさ
		targetSpeed = 0.05f; //速度
		targetTurnAngle = 1.0f; //旋回角度

	}

	private int background ;
	private int target;

	private float targetAngle;
	private float targetX,targetY;
	private float targetSize;
	private float targetSpeed;
	private float targetTurnAngle;
}