實例12--會動的地圖

  前面已經出了一個展示地圖的例子,這個例子主要運用了將地圖的放在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