实例9,在j2me中是使用了图层管理和地图图层,在android并没有这些,所以我用android的只是写了用于 android的图层管理器和地图图层,不过有些东西还没有实现,只实现了一些这个例子会用到的,还有setViewWindow的实现并没有完整,算法上可能会有些问题,虽然我没有测试出,如果有谁测试出来了,请告诉我,我会改正。
下面给出这个例子的效果图和MainView的代码。
import com.wjh.midp_me.AndroidLayerManager; import com.wjh.midp_me.AndroidSprite; import com.wjh.midp_me.AndroidTiledLayer; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; 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; Thread gameThread = null; boolean isGame = true; SurfaceHolder holder = null; Paint backPaint = null; Paint forePaint = null; //具体游戏相关 public AndroidTiledLayer m_TLayer; //管理场景 public int m_aCells[][] = //存储m_TLayer中各cell的取值 {{ 2, 2, 3, 2, 2, 2, 2, 2 ,2, 2, 3, 2, 2, 2, 2, 2 }, { 2, 3, 2, 4, 3, 4, 3, 2 ,2, 2, 3, 2, 2, 2, 2, 2}, { 2, 3, 3, 3, 4, 2, 4, 2 ,2, 2, 3, 2, 2, 2, 2, 2 }, { 2, 3, 2, 3, 3, 4, 1, 2 ,2, 2, 3, 2, 2, 2, 2, 2}, { 2, 4, 3, 3, 3, 3, 4, 2 ,2, 2, 3, 2, 2, 2, 2, 2}, { 2, 3, 2, 3, 3, 4, 3, 2 ,2, 2, 3, 2, 2, 2, 2, 2}, { 2, 3, 3, 4, 1, 3, 3, 2 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}}; public AndroidLayerManager m_Manager; //图层管理器,管理各个图层 public int m_nX = 0; //显示区域左上角的横坐标 public int m_nY = 0; //显示区域左上角的纵坐标 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(); //具体游戏相关 Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.map); //创建TiledLayer场景 m_TLayer = new AndroidTiledLayer( 16, 16, image, 32, 32 ); //设置场景的位置 m_TLayer.setPosition( 0, 0 ); LoadMap(); //将各个图层添入m_Manager m_Manager = new AndroidLayerManager(); m_Manager.append(m_TLayer); //设置m_Manager的显示区域 m_Manager.setViewWindow( m_nX, m_nY, getWidth(), getHeight() ); } public void LoadMap(){ //设置m_TLayer中各cell的值 for( int row = 0; row < 16; row ++ ){ for( int col = 0; col < 16; col ++ ){ m_TLayer.setCell( row, col, m_aCells[row][col] ); } } } @Override public void run() { // TODO Auto-generated method stub long startTime = System.currentTimeMillis(); while(isGame) { input(); logic(); doDraw(); try { long endTime = System.currentTimeMillis(); long sleepTime = endTime - startTime; if(sleepTime<100) { Thread.sleep(sleepTime); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //开始游戏主线程 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() { switch(this.keyCode) { case KeyEvent.KEYCODE_DPAD_UP: m_nY -= 5; break; case KeyEvent.KEYCODE_DPAD_DOWN: m_nY += 5; break; case KeyEvent.KEYCODE_DPAD_LEFT: m_nX -= 5; break; case KeyEvent.KEYCODE_DPAD_RIGHT: m_nX += 5; break; } m_Manager.setViewWindow(m_nX, m_nY, getWidth(), getHeight()); this.keyCode = 0; } //逻辑判断 public void logic() { } 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(), forePaint); //从屏幕的(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_8.zip
源代码文件:Demon_8.rar