文章摘自於linux培訓機構-亞嵌教育。
工作原理
更新攝像頭的位置可以決定屏幕顯示的內容,尤其是RPG類遊戲攝像頭.例如我們在玩RPG遊戲的時候進入一個新的場景 觸發一段腳本後 發現鏡頭開始向上移動 根據鏡頭移動玩家可以大概瀏覽一下這個場景有什麼東西 ,觸發什麼樣的劇情。這個實現的方式就是遊戲攝像頭原理。
如圖所示:首先攝像頭顯示的區域也是手機屏幕顯示的區域 如果需要更改攝像頭的位置 其實是更改背景地圖的位置 利用程序拖動背景地圖 給玩家一種假象讓玩家感覺像是攝像頭在移動而不是背景地圖在移動。
地圖的繪製原理
根據地圖編輯器生成的出來的數組的每一個tile 的 ID 找到每一個tile的地圖資源原始文件的XY座標 算出來圖片的顯示位置利用程序的切割的方法把每一個tile切割出來顯示在手機屏幕中。
切割圖片的代碼:
1 /**
2 * 繪製圖片中的一部分圖片
3 *
4 * @param canvas
5 * @param paint
6 * @param bitmap
7 * @param x
8 * @param y
9 * @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。
1 package cn.m15.xys;
2
3 import java.io.InputStream;
4 import java.util.Random;
5
6
7 import android.app.Activity;
8 import android.content.Context;
9 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