40988
Mappy中文地圖編輯器的使用說明
下載地址:
解壓后打開地圖編輯器 mapwin.exe.exe 創(chuàng)建一張新的地圖。
由于我用的Android模擬器寬高是320X480
地圖寬的塊數(shù) 就是 320 / 32 = 10
地圖高的塊數(shù) 就是 480 / 32 = 15
這里擴充一下 實際在工作開發(fā)中因為手機的分辨率各式各樣 所以是需要尺寸考慮自適應(yīng)的 有兩種方法可以拿到當(dāng)前手機屏幕的寬高 - Display display = getWindowManager().getDefaultDisplay();
Log.i("view" , "height:" +display.getHeight());
Log.i("view" , "width:" +display.getWidth());
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
Log.i("view" , "height" +displayMetrics.heightPixels);
Log.i("view" , "width" +displayMetrics.widthPixels);
復(fù)制代碼 彈出框后點擊確定
導(dǎo)入地圖圖塊 編輯器下載地址中包含了一張 地圖圖片 可以選擇使用
因為編輯器是須要美術(shù)圖片配合使用的 比如tile的尺寸 圖片的寬高尺寸必需能被整除。
導(dǎo)入地圖圖塊成功 右側(cè)為導(dǎo)入的地圖資源 接下來就是自己拖動右側(cè)地圖塊拼出自己想要的地圖了。
接下來我將填充3個圖層 最底層 實體層 物理層 我會一一介紹他們的作用
圖層0為最底層 繪制地圖先繪制這一層
圖層1為實物層 這一層主要繪制一些actor 繪制完第一層在繪制這一層
圖層2為物理層檢測物理碰撞這一層不用繪制但是玩家每移動一次就須要以玩家當(dāng)前點在地圖數(shù)組中的角標(biāo) 和物理層做判斷是否碰撞,它和Actor層的位置一樣。
拼地圖的使用技巧 編輯新圖層的時候可以把上一個涂層打開進(jìn)行對比編輯。
這樣子就可以根據(jù)0圖層的信息來編輯圖層1
地圖塊拼完后編輯完成后點擊保存文件 后在點擊保存文本數(shù)據(jù) 地圖數(shù)組文件就生成出來了 文件命為map.TXT 里面就存著我們編輯的3個地圖層的地圖信息。
使用Mappy中文地圖編輯器生成的地圖信息數(shù)組來繪制游戲地圖
效果圖如下
代碼實現(xiàn)
這里我先說一下游戲窗口的全屏實現(xiàn)方法
第一種 - // 全屏顯示窗口
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
復(fù)制代碼 第二種 AndroidManifest.xml 中加入 - <activity android:name=".activity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
復(fù)制代碼 這里我詳細(xì)說一下編輯器生成出來的數(shù)組怎么用?就拿生成出來的ID 137為例 假設(shè) tile的寬高為32 137表示從圖片的左上角從左到右從上到下 數(shù)到第137個tile 就是我們須要繪制的tile
繪制方面利用 clipRect方法來剪裁圖片 實現(xiàn)繪制 下一章我講游戲中的攝像頭機制 會詳細(xì)介紹這一點。 - public class mapAcitvity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 全屏顯示窗口
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//顯示自定義的游戲View
setContentView(new MapView(this));
}
public class MapView extends View{
//tile塊的寬高
public final static int TILE_WIDTH = 32;
public final static int TILE_HEIGHT = 32;
//tile塊的寬高的數(shù)量
public final static int TILE_WIDTH_COUNT = 10;
public final static int TILE_HEIGHT_COUNT = 15;
//數(shù)組元素為0則什么都不畫
public final static int TILE_NULL = 0;
//第一層游戲View地圖數(shù)組
public int [][]mMapView = {
{ 1, 1, 1, 1, 137, 137, 137, 1, 1, 1 },
{ 1, 1, 1, 1, 137, 137, 137, 1, 1, 1 },
{ 1, 1, 1, 1, 137, 137, 137, 1, 1, 1 },
{ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137 },
{ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137 },
{ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137 },
{ 1, 1, 1, 1, 1, 137, 137, 137, 1, 1 },
{ 1, 1, 1, 1, 1, 137, 137, 137, 1, 1 }
};
//第二層游戲?qū)嶓wactor數(shù)組
public int [][]mMapAcotor = {
{ 102, 103, 103, 104, 0, 0, 0, 165, 166, 167 },
{ 110, 111, 111, 112, 0, 0, 0, 173, 174, 175 },
{ 126, 127, 127, 128, 0, 0, 0, 181, 182, 183 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 41, 42, 43, 44, 0, 0, 0, 0, 0, 0 },
{ 49, 50, 51, 52, 0, 0, 0, 0, 0, 0 },
{ 57, 58, 59, 60, 229, 230, 231, 232, 0, 0 },
{ 65, 66, 67, 68, 237, 238, 239, 240, 0, 0 },
{ 0, 0, 0, 0, 245, 246, 247, 248, 0, 0 },
{ 0, 0, 0, 0, 0, 254, 255, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 102, 103, 103, 103, 104, 0, 0, 0, 143, 144 },
{ 110, 111, 111, 111, 112, 0, 0, 0, 143, 144 }
};
//第三層游戲碰撞物理層數(shù)組
//下一章介紹
//....................
//游戲地圖資源
Bitmap mBitmap = null;
//資源文件
Resources mResources = null;
//游戲畫筆
Paint mPaint = null;
//橫向縱向tile塊的數(shù)量
int mWidthTileCount = 0;
int mHeightTileCount = 0;
//橫向縱向tile塊的數(shù)量
int mBitMapWidth = 0;
int mBitMapHeight = 0;
/**
* 構(gòu)造方法
* @param context
*/
public MapView(Context context) {
super(context);
mPaint = new Paint();
mBitmap = ReadBitMap(context, R.drawable.map);
mBitMapWidth = mBitmap.getWidth();
mBitMapHeight = mBitmap.getHeight();
mWidthTileCount = mBitMapWidth / TILE_WIDTH;
mHeightTileCount = mBitMapHeight / TILE_HEIGHT;
}
@Override
protected void onDraw(Canvas canvas) {
DrawMap(canvas,mPaint,mBitmap);
super.onDraw(canvas);
}
private void DrawMap(Canvas canvas,Paint paint ,Bitmap bitmap) {
int i,j;
for(i = 0; i< TILE_HEIGHT_COUNT; i++) {
for(j = 0; j<TILE_WIDTH_COUNT;j++) {
int ViewID = mMapView[i][j];
int ActorID = mMapAcotor[i][j];
//繪制地圖第一層
if(ViewID > TILE_NULL) {
DrawMapTile(ViewID,canvas,paint,bitmap, j * TILE_WIDTH , i * TILE_HEIGHT);
}
//繪制地圖第二層
if(ActorID > TILE_NULL) {
DrawMapTile(ActorID,canvas,paint,bitmap, j * TILE_WIDTH , i * TILE_HEIGHT);
}
}
}
}
/**
* 根據(jù)ID繪制一個tile塊
* @param id
* @param canvas
* @param paint
* @param bitmap
*/
private void DrawMapTile(int id,Canvas canvas,Paint paint ,Bitmap bitmap,int x, int y) {
//根據(jù)數(shù)組中的ID算出在地圖資源中的XY 坐標(biāo)
//因為編輯器默認(rèn)0 所以第一張tile的ID不是0而是1 所以這里 -1
id--;
int count = id /mWidthTileCount;
int bitmapX = (id - (count * mWidthTileCount)) * TILE_WIDTH;
int bitmapY = count * TILE_HEIGHT;
DrawClipImage(canvas,paint,bitmap,x,y,bitmapX,bitmapY,TILE_WIDTH,TILE_HEIGHT);
}
/**
* 讀取本地資源的圖片
* @param context
* @param resId
* @return
*/
public Bitmap ReadBitMap(Context context, int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
//獲取資源圖片
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is,null,opt);
}
/**
* 繪制圖片中的一部分圖片
* @param canvas
* @param paint
* @param bitmap
* @param x
* @param y
* @param src_x
* @param src_y
* @param src_width
* @param src_Height
*/
private void DrawClipImage(Canvas canvas,Paint paint ,Bitmap bitmap, int x, int y, int src_x, int src_y, int src_xp, int src_yp) {
canvas.save();
canvas.clipRect(x, y, x + src_xp, y + src_yp);
canvas.drawBitmap(bitmap, x - src_x, y - src_y,paint);
canvas.restore();
}
}
}
復(fù)制代碼 最后如果你還是覺得我寫的不夠詳細(xì) 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學(xué)習(xí)
android游戲開發(fā)地圖編輯器的使用源碼.rar(191.43 KB, 下載次數(shù): 700)[/I]2011-9-2 22:13 上傳點擊文件名 下載積分: 下載豆 -2 |