手机游戏开发不同于其实客户端开发,因为手机中有太多的分辨率了,VGA = 640 * 480;WVGA = 800 * 480;FWVGA = 854 * 480;像平板的分辨率达到WSVGA的1024x576以及WXGA的1280x768等等,而且现在是屏幕日益增大化的趋向年代,手机的分辨率已经快赶超平板了。这对于手机端软件游戏开发也是一个考验,其中重要的一个问题就是图片的适配了。

Android提供几个文件夹drawable-hdpi、drawable-ldpi. drawable-xhdpi .drawable-mdpi 来各种分辨率图片,但显然已经无法满足现在的要求。你总不能为每一个分辨率都准备一套图片吧,游戏容量暂不考虑,就是在图片数量上也是天文数字了,因为手机都是日益更新换代的,以后无数的分辨率都会被手机厂商研发出来,那纠结如何做才能适配各种分辨率呢?其中一个图片自适应屏幕实现自动根据手机分别率来放大图与缩小图就是一个很实用的解决方法。

原理:

假如你做的游戏是适配在屏幕800*480分辨率的手机,你有一张背景图,放置在手机中,大小也是800*480,正好背景是填充整个屏幕。但当放在分辨率为960*540的分辨率手机上,则会显示黑边。如何适配在960*540的分辨率手机上呢?我们可以通过Bitmap对象图片的自动放大缩小图片来实现,而图片放大缩小的相对倍数即为:

x方向:960÷800= 1.2

y方向:540÷480=1.125

放置的图片放大缩小后,同时放置的坐标位置也要改变。假如在800*480的分辨率上,图片放置的坐标位置是80*48,而放在960*540的分辨率上的坐标相对位置是:

x轴:960÷(800÷80)= 96

y轴:540÷(480÷48)= 54

其他相对买游戏平台分辨率也是如此,即可得出不同分辨率的图片缩放与坐标位置的方法:


1. /**
2.          * 适配各个分辨率的图片处理方法,游戏内图以800*480为基准。
3.          * @param adr 传入图片在assets文件夹里的地址,图片是放入Android的assets文件夹内为准的,如传入"a.png"即为assets里的a.png图片文件。
4.          * @param context 传入的context。
5.          * @return 缩放完毕后返回的Bitmap图片变量。
6.          */
7.         public static Bitmap getNewBitmap(String adr,Context context){

8.                 Bitmap bmp = null;
9.                 try {

10.                         InputStream is0 = context.getAssets().open(adr);
11.                         bmp = BitmapFactory.decodeStream(is0);
12.                         Matrix matrix = new Matrix();
13.                         float sx = (float)(GameSurfaceView.screenW/800.0);
14.                         float sy = (float)(GameSurfaceView.screenH/480.0);
15.                         matrix.postScale(sx, sy);
16.                         bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
17.                        
18.                 } catch (IOException e) {

19.                         // TODO Auto-generated catch block
20.                         e.printStackTrace();
21.                 } catch (OutOfMemoryError e) {

22.                         //当内存溢出发生OOM的时候,捕捉并处理
23.                            e.printStackTrace();
24. 
25.                 }
26.                 return bmp;
27.         }

复制代码


1. /**
2.          * 计算图片X轴坐标的相对位置,以800为基准的
3.          * @param a 放入的X轴坐标
4.          * @return 返回相对位置的X轴坐标
5.          */
6.         public static float jisuanX(float a){

7.                 float b;
8.                 if(a != 0 )
9.                         b = (float) (GameSurfaceView.screenW/(800.0/a));
10.                 else
11.                         b = 0;
12.                 return b;
13.         }
14.        
15.         /**
16.          * 计算图片Y轴坐标的相对位置
17.          * @param a 放入的Y轴坐标,以480为基准的
18.          * @return 返回相对位置的Y轴坐标
19.          */
20.         public static float jisuanY(float a){

21.                 float b;
22.                 if(a != 0 )
23.                         b = (float)(GameSurfaceView.screenH/(480.0/a));
24.                 else
25.                         b = 0;
26.                 return b;
27.         }