package wyf.jsc.tdb;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import android.opengl.GLUtils;
import android.view.KeyEvent;
import android.view.MotionEvent;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import static wyf.jsc.tdb.Constant.*;
class MySurfaceView extends GLSurfaceView {
//boolean needCreateFlag=true;
float mPreviousX;
float mPreviousY;
MyActivity activity=(MyActivity)this.getContext();
//摄像机的位置
float cx=0;//摄像机x位置
float cy=50;//75;//摄像机y位置
float cz=50;//摄像机z位置
float tx=0;//BOTTOM_LENGTH/2;//目标点x位置
float ty=0;//目标点y位置
float tz=0;//BOTTOM_WIDE/2;//目标点z位置
static float yAngle=0; //摄像机绕Y轴旋转的角度
static float xAngle=0; //摄像机绕X轴旋转的角度
static float angle=0;
float direction=0.0f; //设置按键后的摄像机
final float MOVE_SPAN=0.8f;
final float DISTANCE_CAMERA_YACHT=50.0f;
final float DISTANCE_CAMERA_TARGET=2.0f;
final float DEGREE_SPAN=(float)(5.0/180.0f*Math.PI);
private SceneRenderer mRenderer;//场景渲染器
BallForControl bfd;
BallGoThread bgt;//桌球的运动线程
ArrayList<BallForControl> ballAl;//桌球的列表
public static boolean turnFlag=true;//视角旋转一周的标志位
public static int ballGoOver=1;//辅助传送球运动结束消息
int size;//记录球的个数
final float UNIT_D=-0.2f;//球与球的距离微控
float tempAngleZ;//临时记录转动的角度
static int id;//1 代表玩家1 2 代表玩家2
public MySurfaceView(Context context) {
super(context);
mRenderer = new SceneRenderer(); //创建场景渲染器
setRenderer(mRenderer); //设置渲染器
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染
ballAl=new ArrayList<BallForControl>();//桌球的列表
}
@Override
public boolean onTouchEvent(MotionEvent e) {
float y = e.getY();
float x = e.getX();
switch (e.getAction()) {
case MotionEvent.ACTION_MOVE:
float dy = y - mPreviousY;//计算触控笔Y位移
float dx = x - mPreviousX;//计算触控笔Y位移
float r=(float)(Math.sqrt(dx*dx+dy*dy));
if(dy>0&&dx!=0)
{
float tempA=(float)Math.toDegrees(Math.acos(dx/r));
if(tempA>=0&&tempA<45)
{//right
direction=direction+DEGREE_SPAN;
cx=(float)(tx+Math.sin(direction)*DISTANCE_CAMERA_YACHT);//摄像机x坐标
cz=(float)(tz+Math.cos(direction)*DISTANCE_CAMERA_YACHT);//摄像机z坐标
}
if(tempA>=45&&tempA<135)
{//down
if(cy>=20)
{
cy-=0.5f;
}
}
if(tempA>=135&&tempA<180)
{//left
direction=direction-DEGREE_SPAN;
//设置新的摄像机XZ坐标
cx=(float)(tx+Math.sin(direction)*DISTANCE_CAMERA_YACHT);//摄像机x坐标
cz=(float)(tz+Math.cos(direction)*DISTANCE_CAMERA_YACHT);//摄像机z坐标
}
}
if(dy<0&&dx!=0)
{
float tempB=(float)Math.toDegrees(Math.asin(dy/r));
if(dx>0)
{
if(tempB>=-45&&tempB<0)
{//right
direction=direction+DEGREE_SPAN;
//设置新的摄像机XZ坐标
cx=(float)(tx+Math.sin(direction)*DISTANCE_CAMERA_YACHT);//摄像机x坐标
cz=(float)(tz+Math.cos(direction)*DISTANCE_CAMERA_YACHT);//摄像机z坐标
}
if(tempB>=-90&&tempB<-45)
{//up
if(cy<=65)
{
cy+=0.5f;
}
}
}
if(dx<0)
{
tempB=tempB-90;
if(tempB>=-135&&tempB<-90)
{//left
direction=direction-DEGREE_SPAN;
//设置新的摄像机XZ坐标
cx=(float)(tx+Math.sin(direction)*DISTANCE_CAMERA_YACHT);//摄像机x坐标
cz=(float)(tz+Math.cos(direction)*DISTANCE_CAMERA_YACHT);//摄像机z坐标
}
if(tempB>=-180&&tempB<-135)
{//up
if(cy<=65)
{
cy+=0.5f;
}
}
}
}
if(dx==0)
{
if(dy>0){//down
if(cy>=20){
cy-=0.5f;
}
}
if(dy<0){//up
if(cy<=65){
cy+=0.5f;
}
}
}
if(dy==0)
{
if(dx>0)
{//right
direction=direction+DEGREE_SPAN;
//设置新的摄像机XZ坐标
cx=(float)(tx+Math.sin(direction)*DISTANCE_CAMERA_YACHT);//摄像机x坐标
cz=(float)(tz+Math.cos(direction)*DISTANCE_CAMERA_YACHT);//摄像机z坐标
}
if(dx<0)
{//left
direction=direction-DEGREE_SPAN;
//设置新的摄像机XZ坐标
cx=(float)(tx+Math.sin(direction)*DISTANCE_CAMERA_YACHT);//摄像机x坐标
cz=(float)(tz+Math.cos(direction)*DISTANCE_CAMERA_YACHT);//摄像机z坐标
}
}
}
mPreviousY = y;//记录触控笔位置
mPreviousX = x;//记录触控笔位置
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent e)
{
if(keyCode==4)
{
cueFlag=true;//重绘球杆的标志位
overFlag=false;//打球结束的标志位
hitFlag=false;//控制是否打球
hitSound=false;//打球声音标志位
score=0;//记录得分
scoreOne=0;//first player score
scoreTwo=0;//second player score
scoreNODFlag=1;//用来判断给那位玩家进球加分 1 表示玩家1 2 表示玩家2
scoreNOD=0;//用来标志是网络版还是单机版 0 表示单机版 1 表示网络版
scoreTip=1;//用来标志下一次谁有击球权
sendFlag=false;//控制客户端发送一次消息。
winLoseFlag=0;
bgt.flag=false;
Cue.angleZ=0;//初始化球杆角度
if(activity.netFlag)
{
try {
activity.ct.dout.writeUTF("<#EXIT_MAN#>");//发送退出消息
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
activity.toAnotherView(ENTER_MENU);//进入菜单界面
return true;
}
switch(keyCode)
{
case 19:
direction=direction+DEGREE_SPAN;
//设置新的摄像机XZ坐标
cx=(float)(tx+Math.sin(direction)*DISTANCE_CAMERA_YACHT);//摄像机x坐标
cz=(float)(tz+Math.cos(direction)*DISTANCE_CAMERA_YACHT);//摄像机z坐标
break;
case 20:
direction=direction-DEGREE_SPAN;
//设置新的摄像机XZ坐标
cx=(float)(tx+Math.sin(direction)*DISTANCE_CAMERA_YACHT);//摄像机x坐标
cz=(float)(tz+Math.cos(direction)*DISTANCE_CAMERA_YACHT);//摄像机z坐标
break;
case 21:
if(hitFlag&&cueFlag)
{
if(activity.netFlag)//网络
{
tempAngleZ=Cue.angleZ+CUE_ROTATE_DEGREE_SPAN;
try
{
activity.ct.dout.writeUTF("<#CUE_ANGLE#>"+tempAngleZ);//发送球杆转动角度
}catch(Exception ea)
{
ea.printStackTrace();
}
}
else//单机
{
Cue.angleZ=Cue.angleZ+CUE_ROTATE_DEGREE_SPAN;//设置球杆转动角度
}
}
break;
case 22:
if(hitFlag&&cueFlag)
{
if(activity.netFlag)//网络
{
tempAngleZ=Cue.angleZ-CUE_ROTATE_DEGREE_SPAN;
try
{
activity.ct.dout.writeUTF("<#CUE_ANGLE#>"+tempAngleZ);//发送球杆转动角度
}catch(Exception ea)
{
ea.printStackTrace();
}
}
else//单机
{
Cue.angleZ=Cue.angleZ-CUE_ROTATE_DEGREE_SPAN;//设置球杆转动角度
}
}
break;
case 62:
if(hitFlag&&cueFlag)
{
mRenderer.cue.yOffset+=4;//球杆初始位置
vBall=(float)(Math.random()+1.5)*5;
if(activity.netFlag)
{
try {
activity.ct.dout.writeUTF("<#BALL_HIT#>"+vBall+"|"+Cue.angleZ);//发送击球信息 速度+角度
activity.ct.dout.flush();//刷新消息
} catch (IOException e1) {
e1.printStackTrace();
}
hitFlag=false;//将球权设为false
}else
{
ballAl.get(0).vx=(float)(vBall*Math.sin(Math.toRadians(Cue.angleZ)));//分解母球速度
ballAl