您的位置:首页 > 移动开发 > Android开发

Android游戏框架理解与细节

2011-08-16 15:02 281 查看
 
一.程序入口 继承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)

 
9a66
  {

    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;

      }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息