前面已经出了一个展示地图的例子,这个例子主要运用了将地图的放在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