Android培训三十二课第五讲

来源:互联网 发布:dnf for mac 编辑:程序博客网 时间:2024/04/30 05:06
 

                                                                                                                                                                                                                                                  文章摘自于linux培训机构-亚嵌教育。

     Android培训三十二课第五讲-摄像头

 

工作原理

    更新摄像头的位置可以决定屏幕显示的内容,尤其是RPG类游戏摄像头.例如我们在玩RPG游戏的时候进入一个新的场景 触发一段脚本后 发现镜头开始向上移动 根据镜头移动玩家可以大概浏览一下这个场景有什么东西 ,触发什么样的剧情。这个实现的方式就是游戏摄像头原理。

    如图所示:首先摄像头显示的区域也是手机屏幕显示的区域 如果需要更改摄像头的位置  其实是更改背景地图的位置 利用程序拖动背景地图  给玩家一种假象让玩家感觉像是摄像头在移动而不是背景地图在移动。

 

 

   地图的绘制原理

   根据地图编辑器生成的出来的数组的每一个tile 的 ID 找到每一个tile的地图资源原始文件的XY坐标 算出来图片的显示位置利用程序的切割的方法把每一个tile切割出来显示在手机屏幕中。

 

 

切割图片的代码:

        /**

         * 绘制图片中的一部分图片

         *

         * @param canvas

         * @param paint

         * @param bitmap

         * @param x

         * @param y

         * @param src_x

10          * @param src_y

11          * @param src_width

12          * @param src_Height

13          */

14         private void DrawClipImage(Canvas canvas, Paint paint, Bitmap bitmap,

15                 int x, int y, int src_x, int src_y, int src_xp, int src_yp) {

16             canvas.save();

17             canvas.clipRect(x, y, x + src_xp, y + src_yp);

18             canvas.drawBitmap(bitmap, x - src_x, y - src_y, paint);

19             canvas.restore();

20         }

canvas.save();

    切割图片之前先把Canvas保存起来 然后在切割  绘制结束后

canvas.restore();

   目前以每10000毫秒更新一下摄像头的位置 (随机数) 有了摄像头的位置以后 就可以在算出背景图片的相对显示位置 移动背景图片的位置后就可以给玩家制造出一种摄像头在移动的假象了。

    地图块  长宽的tile块数是20X20。



 

package cn.m15.xys;

import java.io.InputStream;

import java.util.Random;

import android.app.Activity;

import android.content.Context;

import android.content.res.Resources;

10 import android.graphics.Bitmap;

11 import android.graphics.BitmapFactory;

12 import android.graphics.Canvas;

13 import android.graphics.Color;

14 import android.graphics.Paint;

15 import android.os.Bundle;

16 import android.view.Display;

17 import android.view.View;

18 import android.view.Window;

19 import android.view.WindowManager;

20 

21 public class CameraAcitvity extends Activity {

22 

23     MapView mMapView = null;

24     @Override

25     public void onCreate(Bundle savedInstanceState) {

26         super.onCreate(savedInstanceState);

27         // 全屏显示窗口

28         requestWindowFeature(Window.FEATURE_NO_TITLE);

29         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

30                 WindowManager.LayoutParams.FLAG_FULLSCREEN);

31         // 获取屏幕宽高

32         Display display = getWindowManager().getDefaultDisplay();

33         // 显示自定义的游戏View

34         mMapView = new MapView(this,display.getWidth(), display.getHeight());

35         setContentView(mMapView);

36     }

37 

38     public class MapView extends View {

39 

40         // tile块的宽高

41         public final static int TILE_WIDTH = 32;

42         public final static int TILE_HEIGHT = 32;

43 

44         // tile块的宽高的数量

45         public final static int TILE_WIDTH_COUNT = 20;

46         public final static int TILE_HEIGHT_COUNT = 20;

47 

48         // 地图的宽高的

49         public final static int MAP_WIDTH = 640;

50         public final static int MAP_HEIGHT = 640;

51        

52         //镜头移动范围

53         public final static int CAMERA_MOVE = 10;

54        

55         // 屏幕的宽高

56         public int mScreenWidth = 0;

57         public int mScreenHeight = 0;

58        

59         // 数组元素为0则什么都不画

60         public final static int TILE_NULL = 0;

61         // 第一层游戏View地图数组

62         public int[][] mMapView = {

63                 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 137, 137, 137, 137, 137, 1, 1, 1,

64                         1, 1, 1 },

65                 { 1, 1, 1, 1, 1, 1, 1, 137, 137, 137, 137, 137, 137, 1, 1, 1,

66                         1, 1, 1, 1 },

67                 { 1, 1, 1, 1, 1, 1, 1, 1, 137, 137, 137, 137, 137, 1, 1, 1, 1,

未完待续——》http://www.akaedu.org/page/newsdetail-2013.html

原创粉丝点击