大家好,很高兴可以在这里给大家介绍一些android游戏开发的基础知识。首先我想说的是,本人也只是一个刚出道的手机开发程序员,接触android 还没到两个月的时间。在此期间做了一个类似俄罗斯方块的android游戏,游戏完全又触屏来实现还有音乐播放等等一些基本的功能,游戏是基于 android sdk1.6完成。由于初识android,这个游戏也是本人开发的第一个andriod游戏,所以还有很多不足,这里只是想分享一下在开发过程中一些自己总结的经验和小技巧,希望对新手有所帮助,高手也请不吝赐教。

        一、首先我们应该知道android游戏开发的一些基本框架。
       首先是View类开发框架。在Andriod中,任何一个View类都只需要重写onDraw方法来实现界面显示。游戏的核心是不断的绘图和刷新界面,在Android中最常用的方法是利用Handler来实现UI线程的更新,也可以直接在run方法中使用postInvalidate()方法在线程中更新界面。其次,是SurfaceView类开发框架。当需要开发复杂的游戏,而且对程序的执行效率很高时,View类就不能满足需求了,这是必须用SurfaceView类进行开发,这也是主流开发框架。在使用时需要对其进行创建、销毁,情况改变时进行监视,这就要实现SurfaceHOlder.Callback接口,如果要对被绘制的花布进行裁减,控制其大小时都需要使用SurfaceHOlder来完成处理。在程序中,SurfaceHOlder对象需要通过getHolder方法来获得,同时还需要addCallback方法来添加“回调函数”。
例如下面一个简单的SurfaceView类框架:

public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable {
     SurfaceHolder mSurfaceHolder = null;
     public GameSurfaceView(Context context) {
         super(context);
         mSurfaceHolder = this.getHolder();
         mSurfaceHolder.addCallback(this);
         this.setFocusable(true);
     }
     public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){
     }
     public void surfaceCreated(SurfaceHolder holder ){
         new Thread(this).start();
     }
     public void surfaceDestroyed(SurfaceHolder holder){
     }
     public void run(){
         while (true){
             try{
                 Thread.sleep(1000);
             }
             catch(Exception e){
             }
             synchronized(mSurfaceHolder){
                 Draw();
             }
         }
     }
     private void Draw() {
         Canvas canvas= mSurfaceHolder.lockCanvas();
         ......
         mSurfaceHolder.unlockCanvasAndPost(canvas);
     }
 }


然后在activity类中 :setContentView(GameSurfaceView的对象)。

二、游戏开发中常用到的基本类
    Android中通过graphics类来显示2D图形,graphics中包括了Canvas(画布)、Paint(画笔)、Color(颜色)、Bitmap(图片)等常用类。
例如绘制字符串用canvas类的drawText方法来实现,drawRect用来绘制矩形,设置透明度可以用paint类的setAlpha,同时Color.rgb方法可以直接获得整形数值代表的颜色。此外在绘制图片时应该首先从资源文件中装载图片,然后才能绘制到屏幕上去。具体代码如下:

Bitmap mypic = null; mypic=((BitmapDrawable)getResources().getDrawable(R.drawable.pic)).getBitmap(); Canvas canvas = new Canvas(); canvas.drawBitmap(mypic,x,y,null);



三、关于自适应屏幕分辨率的问题
每款手机分辨率的不同注定是程序员开发游戏必须考虑的问题,怎样才能写一个程序而达到可以在不同分辨率的机子上运行良好,这将是决定一个游戏好坏的重要因素之一。在游戏资源res下有三个和图片存储有关的文件夹:drawable-hdpi、drawable-mdpi、drawable-ldpi。drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854),drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480),drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320),系统会自动根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。当然,除了准备好几组不同分辨率的图片以外,在代码中图片坐标和触屏事件的坐标都要灵活的处理,这样才能实现一个程序多机型运行的目标。

DisplayMetrics dm = new DisplayMetrics();
         getWindowManager().getDefaultDisplay().getMetrics(dm);
         int screenWidth = dm.widthPixels;
         int screenHeight = dm.heightPixels;


通过以上代码可以获得当前机型的屏幕像素,然过比列换算可以实现代码中坐标的灵活应用。

四、如何锁定屏幕是横屏还是竖屏
一款游戏通常不会设计成横屏竖屏都可玩,会固定成横屏或竖屏。只需在AndroidManifest.xml里面配置一下就可以了,加入这一行android:screenOrientation="landscape"。
例如(landscape是横向,portrait是纵向)。

五、view与view之间的跳转
    一个游戏不会只有一个view,比如欢迎动画,游戏画面,菜单页面等等,如何实现它们之间的跳转,这里有一个方法,就是用Handler类实现。直接看代码:

Handler myHandler = new Handler(){          
         public void handleMessage(Message msg){
             if(msg.what == 1){
                 //控制页面的显示...
             }
         if(msg.what == 2){
                 //控制页面的显示...
             }
     }
     };

然后用:myHandler.sendEmptyMessage(1)来实现切换。