一.程序入口 继承Activity;
包括各个界面类的声明,声音,资源的加载;
有个消息处理器Handler类;
在public void onCreate(Bundle savedInstanceState)里初始化资源,设置屏幕显示方式,初始化声音,消息处理;
在protected void onResume()里注册监听器,声音控制,键盘;
可定义 public void toAnotherView(int flag) 用sendEmptyMessage()函数发送消息,传递的是界面的状态;
1.创建新线程可以用来延迟;
2.setContentView(view )用来设置当前界面,传递的是界面类;
3.setFocusableInTouchMode(true)设置为可触控;
4.requestFocus()获取焦点;
5.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)设置为横屏;
6.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,
WindowManager.LayoutParams.FLAG_FULLSCREEN); 设置为全屏;
7.DisplayMetrics dm=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm); 获取屏幕分辨率
8. hd=new Handler()
{
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
switch(msg.what)
如上定义消息处理;
二.
1.主游戏的界面,继承GLSurfaceView。
2.须有程序入口的activity类。
3.场景渲染器 SceneRenderer类;
4.public MyGLSurfaceView(Activity)函数里需要
MyGLSurfaceView.activity=activity;
mRenderer = new SceneRenderer(); //创建场景渲染器
setRenderer(mRenderer); //设置渲染器
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染
并启动各线程!
5.SceneRenderer类里
public void onDrawFrame(GL10 gl) 渲染场景,一般需要
//清除颜色缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
//设置当前矩阵为模式矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
//设置当前矩阵为单位矩阵
gl.glLoadIdentity();
6. public void onSurfaceChanged(GL10 gl, int width, int height) {
//设置视窗大小及位置
gl.glViewport(0, 0, width, height);
//设置当前矩阵为投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//设置当前矩阵为单位矩阵
gl.glLoadIdentity();
//计算透视投影的比例
float ratio = (float) width / height;
//调用此方法计算产生透视投影矩阵
gl.glFrustumf(-ratio, ratio, -0.8f*0.8f, 1.2f*0.8f, 1.0f, 4000);
}
7. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//关闭抗抖动
gl.glDisable(GL10.GL_DITHER);
//设置特定Hint项目的模式,这里为设置为使用快速模式
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
//设置屏幕背景色黑色RGBA
gl.glClearColor(0,0,0,0);
//设置着色模型为平滑着色
//设置为打开背面剪裁
gl.glEnable(GL10.GL_CULL_FACE);
gl.glShadeModel(GL10.GL_SMOOTH);
//启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
并且需要初始化纹理!
8.//加载纹理位图资源方法
public static Bitmap loadBitmap(int drawableId)
{
InputStream is = rs.openRawResource(drawableId);
Bitmap bitmapTmp=null;
try
{
bitmapTmp = BitmapFactory.decodeStream(is);
}
finally
{
try
{
is.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
return bitmapTmp;
}
9.//初始化纹理,生成纹理id
public int initTexture(GL10 gl,Bitmap bitmapTmp)//textureId
{
//生成纹理ID
int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
int currTextureId=textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, currTextureId);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR_MIPMAP_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR_MIPMAP_LINEAR);
((GL11)gl).glTexParameterf(GL10.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL10.GL_TRUE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmapTmp, 0);
bitmapTmp.recycle();
return currTextureId;
}
//初始化普通纹理,生成纹理id
public int initNormalTexture(GL10 gl,Bitmap bitmapTmp)//textureId
{
//生成纹理ID
int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
int currTextureId=textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, currTextureId);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_CLAMP_TO_EDGE);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmapTmp, 0);
bitmapTmp.recycle();
return currTextureId;
}
10.须有个重置函数 //返回键初始化方法
public void initState() 放在返回键的响应里
三.界面进度条与渐变效果
进度条~
1.显示数字
String pStr=process+"";
for(int i=0;i<pStr.length();i++)
{
char c=pStr.charAt(i);
canvas.drawBitmap(shu[c-'0'],Activity_GL_Racing.screenWidth/2-screenWidth/2+215+i*20,194.88f,paint);
}
2.重绘
public void repaint()
{
Canvas canvas=this.getHolder().lockCanvas();
try
{
synchronized(canvas)
{
onDraw(canvas);
}
}catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(canvas!=null)
{
this.getHolder().unlockCanvasAndPost(canvas);
}
}
}
3.线程控制
private class PointGoThread extends Thread
{
SurfaceHolder holder;
ViewLoading load;
public PointGoThread(ViewLoading load)
{
this.load=load;
this.holder=load.getHolder();
}
public void run()
{
Canvas canvas;
while(loadFlag)
{
if(process>=99)
{
loadFlag=false;
}
pointNum=(pointNum+1)%3;
canvas=null;
if(true)
{
try{
canvas=this.holder.lockCanvas();
synchronized(this.holder)
{
load.onDraw(canvas);
}
}catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(canvas!=null)
{
this.holder.unlockCanvasAndPost(canvas);
}
}
}
try{
sleep(800);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
4.在游戏界面加载资源的时候调用
public static void loadProcessGo(int k)
{
Activity_GL_Racing.loading.process+=k;
Activity_GL_Racing.loading.repaint();
}
5.渐变效果
第一步.//绘制黑色填充矩形清背景
paint.setColor(Color.BLACK);
paint.setAlpha(255);
canvas.drawRect(0, 0,screenWidth, screenHeight ,paint);
第二步.画图
paint.setAlpha(currentAloha);
// float k=Activity_GL_Racing.screenWidth/2-screenWidth/2;
canvas.drawBitmap(currentLogo, Activity_GL_Racing.screen_xoffset,0,paint);
第三步.
在surfaceCreated函数里创建线程
for(int i=255;i>-10;i=i-10) //动态更改图片的透明度值并不断重绘
{
currentAloha=i;
if(currentAloha<0)
{
currentAloha=0;
}