package wyf.tzz.lta;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import android.opengl.GLUtils;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import static wyf.tzz.lta.Constant.*;
class MySurfaceView extends GLSurfaceView {
GL_Demo activity; //Activity的引用
boolean overFlag=false; //是否结束的标志
boolean isWin=false; //是否胜利的标志
boolean isFail=false; //是否失败的标志
SceneRenderer mRenderer; //场景渲染器
Plane plane; //hero机引用
EnemyPlane ep ; //单架敌机
EnemyPlaneGroup epg; //敌机组
Column heroMissile; //hero机炮弹
Column enemyMissile; //敌机炮弹
List<Missile> heroMissileGroup = new LinkedList<Missile>(); //hero机炮弹列表
List<Missile> enemyMissileGroup = new LinkedList<Missile>(); //敌机炮弹列表
TextureRect lifeIcon; //图标矩形
float cz=0f; //摄像机z坐标
float cy=2.2f; //摄像机y坐标
float cx=0f; //摄像机x坐标
int keyState=0; //按键状态
int life=LIVE_COUNT; //生命值
int delayCount=2; //爆炸动画延迟倍数
Score score; //得分纹理矩形
KeyThread keyThread; //按键监听线程
HeroPlaneMoveThread hpmt; //hero机移动线程
HeroMissileGoThread hmgt; //hero机炮弹移动线程
EnemyMissileGoThread emgt; //敌机炮弹移动线程
EnemyPlaneMoveThread epmt; //敌机移动线程
Handler hd; //消息处理器
public MySurfaceView(GL_Demo demo) {
super(demo);
this.activity=demo;
mRenderer = new SceneRenderer(); //创建场景渲染器
setRenderer(mRenderer); //设置渲染器
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); //设置渲染模式为主动渲染
Constant.initConstant(this.getResources()); //初始化地面高度数组
hd=new Handler(){ //初始化消息处理器
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
switch(msg.what){
case 0: //成功躲避所有障碍物
activity.setWinView(); //切换到胜利的画面
break;
case 1: //成功完成任务
activity.setFailView(); //切换到失败的画面
break;
}
}
};
new Thread(){ //创建一个新的线程,检验是否胜利
@Override
public void run()
{
try {Thread.sleep(2000); //睡眠2000ms
} catch (InterruptedException e) { e.printStackTrace();}
while(true) {
if(isWin){ //如果胜利
over(); //结束掉所有线程
try {Thread.sleep(400);}
catch (InterruptedException e) {e.printStackTrace();}
hd.sendEmptyMessage(0);//发消息
break;
}
else if(isFail){ //如果游戏失败
over(); //结束掉所有线程
try {Thread.sleep(400); }
catch (InterruptedException e) {e.printStackTrace();}
hd.sendEmptyMessage(1);//发消息
break;
}
try {Thread.sleep(500); } //睡眠
catch (InterruptedException e) {e.printStackTrace();}
}
}
}.start(); //启动线程
}
@Override
public boolean onKeyDown(int keyCode,KeyEvent event){ //为按键按下添加监听
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_UP: //如果按下上键
keyState=keyState|0x1;
return true;
case KeyEvent.KEYCODE_DPAD_DOWN: //如果按下下键
keyState=keyState|0x2;
return true;
case KeyEvent.KEYCODE_DPAD_LEFT: //如果按下左键
keyState=keyState|0x4;
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT: //如果按下右键
keyState=keyState|0x8;
return true;
case KeyEvent.KEYCODE_DPAD_CENTER: //如果按下中键
case KeyEvent.KEYCODE_SPACE: //如果按下空格键
keyState=keyState|0x10;
return true;
case KeyEvent.KEYCODE_BACK: //如果按下返回键
over();
activity.setMenuView(); //切换到主菜单界面
return true;
}
return false; //返回,其他按键交给系统处理
}
@Override
public boolean onKeyUp(int keyCode,KeyEvent event){ //为按键弹起添加监听
switch(keyCode)
{
case KeyEvent.KEYCODE_DPAD_UP: //如果上键弹起
keyState=keyState&0x1E;
return true;
case KeyEvent.KEYCODE_DPAD_DOWN: //如果下键弹起
keyState=keyState&0x1D;
return true;
case KeyEvent.KEYCODE_DPAD_LEFT: //如果左键弹起
keyState=keyState&0x1B;
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT: //如果右键弹起
keyState=keyState&0x17;
return true;
case KeyEvent.KEYCODE_SPACE: //如果空格键弹起
case KeyEvent.KEYCODE_DPAD_CENTER: //如果中建弹起
keyState=keyState&0xF;
keyThread.fireCount=0; //将飞机每次发射炮弹的数量置为0
return true;
}
return false; //false,其他按键交给系统处理
}
class SceneRenderer implements GLSurfaceView.Renderer { //创建场景渲染器类
TextureRect trExplo[]=new TextureRect[6]; //爆炸动画纹理矩形
int anmiIndex=0; //爆炸动画索引
DrawCylinder land; //陆地圆柱引用
DrawCylinderSky sky; //天空圆柱引用
public int planeHeadId; //机头
public int frontWingId; //前机翼纹里
public int frontWing2Id; //前机翼纹里2
public int bacckWingId; //后机翼纹理
public int topWingId; //上机翼纹理
public int planeBodyId; //机身纹理
public int planeCabinId; //机舱纹理
public int cylinder1Id; //圆柱纹理1
public int cylinder2Id; //圆柱纹理2
public int screw1Id; //螺旋桨纹理
public int enemyPlaneFrontWingId; //敌机标志
public int enemyPlaneFrontWing2Id; //敌机标志
public int enemyPlaneBodyId; //敌机机身纹理
public int enemyPlaneTopWingId; //敌机上翼纹理id
public int enemyPlaneHeadId; //前敌机机头纹理id
public int screw2Id;//螺旋桨
public int landTextureId; //地面纹理名称ID
public int skyTextureId; //天空纹理名称ID
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);//清除颜色缓存于深度缓存
gl.glMatrixMode(GL10.GL_MODELVIEW); //设置当前矩阵为模式矩阵
gl.glLoadIdentity(); //设置当前矩阵为单位矩阵
GLU.gluLookAt(
gl,
cx, //摄像机坐标x
cy, //摄像机坐标Y
cz, //摄像机坐标Z
0, //观察目标点坐标 X
0, //观察目标点坐标 Y
-5, //观察目标点坐标 Z
0,
1, //摄像机朝向
0
);
gl.glPushMatrix(); //保护变换矩阵现场
gl.glTranslatef(0, Y_TRASLATE, -30); //平移
land.drawSelf(gl); //绘制地面
gl.glTranslatef(0, 0, 28); //平移
sky.drawSelf(gl); //绘制天空
gl.glPopMatrix(); //恢复变换矩阵现场
epg.drawSelf(gl); //绘制敌机
if(overFlag==false) { //如果hero机被击中
plane.drawSelf(gl); //绘制hero机
}
else if(overFlag){
if(anmiIndex/delayCount<trExplo.length) //动画没有播放完动画换帧
{
gl.glDisable(GL10.GL_DEPTH_TEST); //关闭深度测试
gl.glPushMatrix(); //保存当前矩阵
gl.
评论3
最新资源