`
一口三个汉堡
  • 浏览: 115309 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

实例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

  • 大小: 8.1 KB
  • 大小: 7.6 KB
0
1
分享到:
评论
1 楼 让安卓飞一会 2011-06-17  
加油

相关推荐

    topmap实例---清华网上游

    在本实例中,我们将探讨如何利用TopMap与C#编程语言相结合,构建一个针对清华大学的网上导航地图应用——“清华网上游”。 【TopMap与C#集成开发】 1. **接口开发**:TopMap提供了丰富的API接口,允许开发者通过C#...

    HTML+CSS+JS数据可视化大屏平台模板实例10-大数据地图

    在这个"HTML+CSS+JS数据可视化大屏平台模板实例10-大数据地图"中,我们将探讨如何利用这些技术将大量复杂的数据转化为直观且具有吸引力的地图展示。 首先,HTML(HyperText Markup Language)作为网页内容的结构...

    实例9---我的地图

    【标题】"实例9---我的地图"涉及到的知识点主要集中在Android应用开发领域,尤其是与地图相关的功能实现。在这个实例中,开发者可能创建了一个自定义的地图应用程序,让用户能够查看和交互地图信息。 【描述】虽然...

    计算机软件-编程源码-实例十--电子地图开发之GIS组件--Mapobject深入开发.zip

    计算机软件-编程源码-实例十--电子地图开发之GIS组件--Mapobject深入开发.zip

    HTML+CSS+JS数据可视化大屏平台模板实例30-智慧物联网+GIS地图通用模板

    本实例“HTML+CSS+JS数据可视化大屏平台模板实例30-智慧物联网+GIS地图通用模板”是专门为展示智慧物联网数据与GIS地图结合而设计的一个模板,适用于各种监控、分析和决策支持场景。 首先,HTML(超文本标记语言)...

    计算机软件-商业源码-实例十--电子地图开发之GIS组件--Mapobject深入开发.zip

    这个压缩包包含了一个实例,通过这个实例,我们可以学习如何深入地使用MapObject进行地图开发。 MapObject是一个强大的GIS开发工具,它可以被嵌入到各种Windows应用程序中,如Visual Basic、VC++或Delphi等,使得...

    arcMAP实用操作手册之实例1-6

    此外,还会涉及图层符号化和标签设置,以提高地图的可读性。 2. **实例2:数据编辑** 实例2将介绍如何在ArcMap中进行数据编辑,包括创建新特征、修改现有特征、删除特征以及进行拓扑规则检查。这对于维护和更新...

    HTML+CSS+JS数据可视化大屏平台模板实例12-产品销售

    在构建“HTML+CSS+JS数据可视化大屏平台模板实例12-产品销售”时,我们需要深入了解HTML、CSS和JavaScript这三种技术,并结合数据可视化工具,以创建一个展示产品销售情况的动态大屏幕界面。以下是对这个项目所涉及...

    echarts右键菜单实例 --- 不修改源码

    标题“echarts右键菜单实例 --- 不修改源码”表明我们将探讨如何在ECharts图表上添加右键菜单,而无需直接修改ECharts的源代码。这意味着我们将通过ECharts的API和事件监听来实现这一功能,这是一个常见的最佳实践,...

    天地图开发实例

    "天地图开发实例"是一个基于Web的项目,它利用了天地图这一强大的地理信息系统平台,为开发者提供了一套具体的实践示例。这个实例主要展示了如何在天地图上进行各种自定义操作,以增强地图的交互性和功能。接下来,...

    基于Java的实例源码-Google地图JSP标签库.zip

    在本资源"基于Java的实例源码-Google地图JSP标签库.zip"中,我们可以深入探讨几个关键的IT知识点,主要集中在Java编程、JSP(JavaServer Pages)技术和Google地图API的应用。 首先,Java是一种广泛使用的面向对象的...

    Flex开发实例--学习必备

    - 这段代码展示了如何导入 `Alert` 类并定义一个函数 `showData()`,该函数会在用户触发某个事件时弹出消息框。 #### 4. 程序组件布局 - Flex提供了多种布局管理器,如 `HorizontalLayout`, `VerticalLayout`, `...

    HTML+CSS+JS数据可视化大屏平台模板实例demo-安徽省地图大屏

    HTML+CSS+JS数据可视化大屏平台模板实例demo-安徽省地图大屏

    基于Java的实例源码-用的在线地图浏览模块.zip

    在本压缩包“基于Java的实例源码-用的在线地图浏览模块.zip”中,包含的是一个使用Java语言实现的在线地图浏览模块。这个模块可能是为了帮助开发者集成地图功能到他们的应用程序中,使得用户能够方便地查看、导航或...

    串口编程实例5-8 项目源码

    - **GPS坐标处理**:将接收到的经纬度转换为可读格式,进行地图匹配或其他地理计算。 - **时间同步**:通过GPS获取准确的时间信息,可用于系统时间同步。 4. **第7章:智能安防报警系统** 串口可能用于连接...

    JavaScript应用实例-高德地图经纬度求实际距离.js

    JavaScript应用实例-高德地图经纬度求实际距离.js

    LBS之百度地图实例

    2. **导入SDK**:将下载的百度地图SDK库导入Android Studio项目中,通常会有一个aar文件或对应的依赖配置。 3. **初始化地图**:在Activity的onCreate方法中,初始化地图控件并设置API密钥。 4. **设置权限**:...

Global site tag (gtag.js) - Google Analytics