Android游戏框架理解与细节

来源:互联网 发布:千里驰援李天霞 知乎 编辑:程序博客网 时间:2024/05/22 08:00
 

一.程序入口 继承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;
      }

原创粉丝点击