实例12--会动的地图
前面已经出了一个展示地图的例子,这个例子主要运用了将地图的放在txt上面,然后读取尽力啊,在j2me中是直接获取,而在android中text放在assets文件夹中,通过AssetManager来获取。应为我已经写出了android版的java me的游戏包,那么转化这些东西就很简单了。下面给出效果图和代码:
http://dl.iteye.com/upload/attachment/499952/7226f480-b0ee-3989-8f64-bd1e9cb6a9b0.png
http://dl.iteye.com/upload/attachment/499954/92e536d5-04bb-3522-92ed-37b524e49def.png
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 stubsetFocusable(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*36Bitmap image2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.man);m_ManSprite = new AndroidSprite( image2, 27, 36 );//设置精灵左上角的位置m_ManSprite.setPosition( 80 , 80 );//将各个图层添入m_Managerm_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 ){//当读到文件末尾时,返回-1if( 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();//显示错误信息}}@Overridepublic 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 blocke.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*32if( 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);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubstart();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubstop();}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubthis.keyCode = keyCode;return true;}} apk文件(将后缀改为apk):Demon_12.zip
源代码:Demon_12.rar
页:
[1]