前面已經出了一個展示地圖的例子,這個例子主要運用了將地圖的放在txt上面,然後讀取盡力啊,在j2me中是直接獲取,而在android中text放在assets文件夾中,通過AssetManager來獲取。應爲我已經寫出了android版的java me的遊戲包,那麼轉化這些東西就很簡單了。
下面給出效果圖和代碼:
MainView.java
package com.wjh.demon_12; import java.io.InputStream; import com.wjh.midp_me.AndroidLayerManager; import com.wjh.midp_me.AndroidSprite; import com.wjh.midp_me.AndroidTiledLayer; import android.content.Context; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.KeyEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.SurfaceHolder.Callback; public class MainView extends SurfaceView implements Callback,Runnable{ int keyCode = 0; String keyAction = ""; Thread gameThread = null; boolean isGame = true; SurfaceHolder holder = null; Paint backPaint = null; Paint forePaint = null; //具體遊戲相關 public AndroidTiledLayer m_TLayer; //管理場景 public AndroidSprite m_ManSprite; //用於顯示精靈動畫 public AndroidLayerManager m_Manager; //圖層管理器,管理各個圖層 public int m_nX = 0; //顯示區域左上角的橫座標 public int m_nY = 0; //資源管理 AssetManager assetManager = null; public MainView(Context context) { super(context); // TODO Auto-generated constructor stub setFocusable(true); getHolder().addCallback(this); holder = this.getHolder(); backPaint = new Paint(); backPaint.setColor(Color.BLACK); forePaint = new Paint(); assetManager = context.getAssets(); //讀取tile圖片 Bitmap image = BitmapFactory.decodeResource(context.getResources(), R.drawable.map); //創建TiledLayer場景 m_TLayer = new AndroidTiledLayer( 8, 8, image, 32, 32 ); //設置場景的位置 m_TLayer.setPosition( 0, 0 ); LoadMap(); //讀取精靈圖片,創建精靈,精靈的像素大小爲27*36 Bitmap image2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.man); m_ManSprite = new AndroidSprite( image2, 27, 36 ); //設置精靈左上角的位置 m_ManSprite.setPosition( 80 , 80 ); //將各個圖層添入m_Manager m_Manager = new AndroidLayerManager(); m_Manager.append(m_ManSprite); m_Manager.append(m_TLayer); //設置m_Manager的顯示區域 m_Manager.setViewWindow( m_nX, m_nY, getWidth(), getHeight() ); } public void LoadMap(){ try{ InputStream is = assetManager.open("map.txt"); int row = 0; //行號 int col = 0; //列號 int ch = is.read(); //讀取一個字節的數據 while( ch != -1 ){ //當讀到文件末尾時,返回-1 if( ch == '\n' && row < 7 ){ //修正行列號 row ++; col = 0; } else if( ch > '0' && ch < '5' ) {//如果是符合需要的數據 m_TLayer.setCell( row, col, ch - '0' ); if( col < 7 ) col ++; } ch = is.read(); //讀取下一數據 } is.close(); //釋放資源 } catch (Exception e){ e.printStackTrace(); //顯示錯誤信息 } } @Override public void run() { //獲取系統當前時間,並將時間換算成以毫秒爲單位的數 long T1 = System.currentTimeMillis(); long T2 = T1; while(isGame){ T2 = System.currentTimeMillis(); if( T2 - T1 > 100 ){ //間隔100毫秒 T1 = T2; input(); logic(); doDraw(); } } } //開始遊戲主線程 public void start() { if(gameThread == null) { gameThread = new Thread(this); gameThread.start(); } } //停止遊戲主線程 public void stop() { isGame = false; if(gameThread != null) { try { gameThread.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //輸入判斷 public void input() { boolean m_bKeyDown = false; //有無按鍵的標誌 //如果按下方向鍵的上鍵,則顯示區域向上移動 if( keyCode == KeyEvent.KEYCODE_DPAD_UP ){ m_nY -= 2; m_bKeyDown = true; } //如果按下方向鍵的下鍵,則顯示區域向下移動 if( keyCode == KeyEvent.KEYCODE_DPAD_DOWN ){ m_nY += 2; m_bKeyDown = true; } //如果按下方向鍵的左鍵,則顯示區域向左移動 if( keyCode == KeyEvent.KEYCODE_DPAD_LEFT ){ m_nX -= 2; m_bKeyDown = true; } //如果按下方向鍵的右鍵,則顯示區域向右移動 if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT ){ m_nX += 2; m_bKeyDown = true; } if( m_bKeyDown ){ //調整顯示區域,使顯示區域不超出場景 if( m_nX < 0 ) m_nX = 0; //m_TLayer中存儲的場景圖像的寬度爲8*32,高度也爲8*32 if( m_nX > getWidth()-8*32 ) m_nX = getWidth()-8*32; if( m_nY < 0 ) m_nY = 0; if( m_nY > getHeight()-8*32 ) m_nY = getHeight()-8*32; //重新設置顯示區域 m_Manager.setViewWindow( m_nX, m_nY, getWidth(), getHeight() ); } keyCode = -1; } public long m_LogicT1 = System.currentTimeMillis(); //邏輯判斷 public void logic() { //更換精靈當前顯示的「幀」編號,「幀」編號不能大於上限 int n = m_ManSprite.getFrame(); n ++; //getFrameSequenceLength可獲取精靈圖像中「幀」的個數 if( n >= m_ManSprite.getFrameSequenceLength() ) n = 0; m_ManSprite.setFrame(n); } public void doDraw() { Canvas c = null; try { c = holder.lockCanvas(); synchronized (holder) { paint(c); } }finally{ if(c != null) { holder.unlockCanvasAndPost(c); } } } //畫圖 public void paint(Canvas canvas) { //用黑色清屏 canvas.drawRect(0, 0, getWidth(), getHeight(), backPaint); //從屏幕的(0,0)點開始顯示圖像 m_Manager.paint(canvas, forePaint); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub stop(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub this.keyCode = keyCode; return true; } }
apk文件(將後綴改爲apk):Demon_12.zip
源代碼:Demon_12.rar