package com.bn.clp; import static com.bn.clp.Constant.*; import com.bn.core.MatrixState; import com.bn.st.d2.MyActivity; import android.opengl.GLES20; import static com.bn.clp.MyGLSurfaceView.*; //可碰撞部件控制类,交通柱的id为0,交通锥的id为1 public class KZBJForControl { KZBJDrawer kzbjdrawer; int id;//对应的碰撞物id,0表示交通筒;1表示障碍物 boolean state=false;//false表示可被碰撞,true表示被撞后飞行中,否则不可碰撞。 float x;//摆放的初始位置 float y; float z; float alpha;//转动角度 float alphaX;//转动轴向量 float alphaY; float alphaZ; float currentX;//飞行中的当前位置 float currentY; float currentZ; int row;//位置所在地图行和列 int col; float vx;//飞行中的速度分量 float vy; float vz; float time_Fly;//飞行累计时间 MyActivity ma; public KZBJForControl(KZBJDrawer kzbjdrawer,int id,float x,float y,float z,int row,int col,MyActivity ma) { this.kzbjdrawer=kzbjdrawer; this.id=id; this.x=x; this.y=y; this.z=z; this.row=row; this.col=col; this.ma=ma; } public void drawSelf(int texId,int dyFlag) { if(dyFlag==0)//绘制实体 { MatrixState.pushMatrix(); if(!state) {//原始状态绘制 MatrixState.translate(x, y, z); //MyGLSurfaceView类中的该控制类的列表 ma.gameV.kzbj_array[id].drawSelf(texId); } else {//飞行中绘制 if(currentY>-40) {//如果已经飞行到地面以下,就不再绘制 MatrixState.translate(currentX, currentY, currentZ); MatrixState.rotate(alpha,alphaX, alphaY, alphaZ); ma.gameV.kzbj_array[id].drawSelf(texId); } } MatrixState.popMatrix(); } else if(dyFlag==1)//绘制倒影 { //实际绘制时Y的零点 float yTranslate=y; //进行镜像绘制时的调整值 float yjx=(0-yTranslate)*2; MatrixState.pushMatrix(); //关闭背面剪裁 GLES20.glDisable(GLES20.GL_CULL_FACE); if(!state) {//原始状态绘制 MatrixState.translate(x, y, z); MatrixState.translate(0, yjx, 0); MatrixState.scale(1, -1, 1); //MyGLSurfaceView类中的该控制类的列表 ma.gameV.kzbj_array[id].drawSelf(texId); } else {//飞行中绘制 if(currentY>-40) {//如果已经飞行到地面以下,就不再绘制 MatrixState.translate(currentX, currentY, currentZ); MatrixState.rotate(alpha,alphaX, alphaY, alphaZ); MatrixState.translate(0, yjx, 0); MatrixState.scale(1, -1, 1); ma.gameV.kzbj_array[id].drawSelf(texId); } } //打开背面剪裁 GLES20.glEnable(GLES20.GL_CULL_FACE); MatrixState.popMatrix(); } } //根据船的位置计算出船头位置,并判断是否与某个可撞物体碰撞 public void checkColl(float bX,float bZ,float carAlphaTemp) { //首先求出碰撞检测点坐标 float bPointX=(float) (bX-BOAT_UNIT_SIZE*Math.sin(Math.toRadians(sight_angle))); float bPointZ=(float) (bZ-BOAT_UNIT_SIZE*Math.cos(Math.toRadians(sight_angle))); //计算碰撞点在地图上的行和列 float carCol=(float) Math.floor((bPointX+UNIT_SIZE/2)/UNIT_SIZE); float carRow=(float) Math.floor((bPointZ+UNIT_SIZE/2)/UNIT_SIZE); if(carRow==row&&carCol==col) {//如果大家在同一个格子里,进行严格的碰撞检测KZBJBJ double disP2=(bPointX-x)*(bPointX-x)+(bPointZ-z)*(bPointZ-z); //若船头距离目标小于4则为碰撞 if(disP2<=4) { if(SoundEffectFlag) { ma.shengyinBoFang(4, 0); } state=true;//设置状态为飞行中状态 time_Fly=0;//飞行持续时间清零 alpha=0; alphaX=(float) (-20*Math.cos(Math.toRadians(carAlphaTemp))); alphaY=0; alphaZ=(float) (20*Math.sin(Math.toRadians(carAlphaTemp))); currentX=x;//设置飞行起始点为原始摆放点 currentY=y; currentZ=z; //根据船的行进方向确定飞行速度的三个分量 vx=(float) (-20*Math.sin(Math.toRadians(carAlphaTemp))); vy=15; vz=(float) (-10*Math.cos(Math.toRadians(carAlphaTemp))); } } } //飞行移动方法,线程定时调用此方法,实现可撞物体飞行 public void go() { if(!state) {//如果不在飞行状态中不需要go return; } time_Fly=time_Fly+0.3f;//飞行持续时间增加 alpha=alpha+10; //根据飞行速度的三个分量及飞行持续时间与飞行起点计算当前位置 currentX=x+vx*time_Fly; currentZ=z+vz*time_Fly; currentY=y+vy*time_Fly-0.5f*5*time_Fly*time_Fly;//5为重力加速度 //当碰撞物体飞行落到地面以下2000时恢复原位 if(currentY<-2000) { state=false; } } }