⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 map.java

📁 在学校时写的一个游戏DEMO
💻 JAVA
字号:
import java.io.IOException;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

public class Map {   //用来绘制地图
	Image m_imgSrc;
	Image map1img;
	Image map1png;
	Tools tools;
	Deck deck;
	short mapItem[];
	short objItem[][][];
	public Map(){
		//分为N张地图
		//按情况分别载入不同的地图资源和地图信息
		initMap();
		try {
			map1png=Image.createImage("/map1p.png");
		} catch (IOException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}
		deck=new Deck();
	}
	short mapWNum=0;
	short mapHNum=0;
	static int[][] MapData;
	public static int leftTopX;//屏幕视窗在地图中的位置
    public static int leftTopY;
    //以下4项,可以根据具体的大小获得具体的数值。这里的例子中为固定大小。
    public static final int cellWidth = 16; //地图元素组成的单元格大小
    public static final int cellHeight = 16; //地图元素组成的单元格大小
//    public static final int mapWNum = 40; //地图中x方向单元格的个数
//    public static final int mapHNum = 13; //地图中y方向单元格的个数
	 public int mapState=0;
	 public void initMap(){//初始化地图
		 Data.loadRes();
		 leftTopX=0;
		 leftTopY=0;
		 setMapstate(0);
		}
	 public int getMapState(){
		 return this.mapState;
	 }
	 public void setMapstate(int mapstate){
		 switch(mapstate){
		 case 0:
			 	MapData=null;
			    mapWNum=48;
			    mapHNum=10;
			    MapData =Data.nMapData0;
			    mapItem=Data.mapItem0;
			    objItem=Data.objItem0;
			 break;
		 case 1:
			 MapData=null;
			 mapWNum=54;
			    mapHNum=10;
			    MapData =Data.nMapData1;
			    mapItem=Data.mapItem1;
			    objItem=Data.objItem1;
			 break;
		 case 2:
			 MapData=null;
			 mapWNum=50;
			 mapHNum=10;
		    MapData =Data.nMapData2;
		    mapItem=Data.mapItem2;
		    objItem=Data.objItem2;
		 }
		 mapState=mapstate;
	 }
	 public void MapLogic(){
		 switch(mapState){
		 case 0:  
			 break;
		 case 1:
			 deck.DeckLogic();
			 break;
		 }
	 }
	 static int iStart;
	 static int jStart;
	 static int iNum;
	 static int jNum;
	public final void drawMap(Graphics g){
//		System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+leftTopX);
		/*
		 * 画背景图片
		 */
		if(mapState==0){
			int tempX = - (leftTopX%map1png.getWidth());
            for(int i = 0;i < 3;i ++){//背景用两张图片滚动填充
                   g.drawImage(map1png, i*map1png.getWidth()+ tempX, 0, 0);
            }
		}
		//**************计算开始位置和结束位置*********************************************/
		 /*计算y方向(纵向)的起始地图单元格*/
        iStart = leftTopY / cellHeight;
        /*计算x方向(横向)的起始地图单元格*/
        jStart = leftTopX / cellWidth;
        /*纵向(y方向)可以显示的地图单元格数目*/
//        int iNum = Tools.SCREEN_HEIGHT / cellHeight + 1;
        iNum = Tools.SCREEN_HEIGHT / cellHeight +1;
        /*横向(x方向)可以显示的地图单元格数目*/
        jNum = Tools.SCREEN_WIDTH / cellWidth + 1;
        /*限制地图块的显示部分超过地图纵向的总数量的部分*/
        if (iStart + iNum >= MapData.length) {
               iNum = MapData.length - 1 - iStart; //超出了地图纵向边界则Y轴可以显示的格子数则设置成为地图的高减去起始绘制位置的格
        }
        /*限制地图块的显示部分超过地图横向的总数量的部分*/
        if (jStart + jNum >= MapData[0].length) {
               jNum = MapData[0].length - 1 - jStart; //超出了地图横向边界则X轴可以显示的格子数则设置成为地图的宽减去起始绘制位置的格
        }
//        System.out.println(iStart+"      "+jStart+"         "+iNum+"          "+jNum);
        //*******************************************************************************//
		/*
		 * 画地表层,不进行碰撞的
		 */
        for (int i = iStart; i <= iStart + iNum; i++){
        	for (int j = jStart; j <= jStart + jNum; j++) {
        		int ID=(MapData[i][j]& 255)-1;
				if(ID>=0)			
				g.drawImage(Data.allImage[mapItem[ID*2]],j*16-leftTopX,i*16-leftTopY,0);
			}
        	
		}
		/*
		 * 画建筑层,用来碰撞的
		 */
        for (int i = iStart; i <= iStart + iNum; i++){
            for (int j = jStart; j <= jStart + jNum; j++) { 
				int ID=((MapData[i][j]>>8)& 255)-1;
				if(ID>=0)
				g.drawImage(Data.allImage[objItem[ID][0][0]],j*16-leftTopX,i*16-leftTopY,0);
			}
		}
		/*
		 * 装饰物层(蜡烛动画。。。)
		 */
        for (int i = iStart; i <= iStart + iNum; i++){
            for (int j = jStart; j <= jStart + jNum; j++) { 
				int ID=((MapData[i][j]>>16)& 255)-1;
				if(ID>=0){
					deck.drawDeck(g,j*16+31,i*16+15);
				}
			}
		}
		/*
		 * 楼梯层,参与碰撞(特殊处理)
		 */
    
	}
	/*
	 * 根据主角的位置,方向,等信息来决定屏幕的坐标
	 */
	protected final void setScreenMode(int x, int y, boolean isRight) {
        final int postionX = 88;
        final int postionY = 60;
        if (isRight) {
               if (leftTopX + postionX - x > 10) { // 当目标显示位置相对于地图的位置与主角的位置相差10像素以上
                      leftTopX -= 10; //调整手机屏幕相对于地图的坐标,则目标显示位置也改变为leftTopX+postionX。(注意此时leftTopX发生改变,leftTopX+postionX也发生改变),后面部分同理。
               }
               else if (leftTopX + postionX - x < -10) { // 当目标显示位置相对于地图的位置与主角的位置相差10像素以上
                      leftTopX += 10;
               }
               else leftTopX = (short) (x - postionX); // 当目标显示位置相对于地图的位置与主角的位置相差小于10像素
        }
        else {
               if (leftTopX + tools.SCREEN_WIDTH - postionX - x > 10) { //此处以屏幕的右测边缘计算
                      leftTopX -= 10;
               }
               else if (leftTopX + (tools.SCREEN_WIDTH) - postionX - x < -10) {
                      leftTopX += 10;
               }
               else leftTopX = (short) (x - (tools.SCREEN_WIDTH) + postionX);
        }
        /**y方向的计算*/
        if (leftTopY + (tools.SCREEN_HEIGHT >>> 1) + postionY - y > 10) {
               leftTopY -= 10;
        }
        else if (leftTopY + (tools.SCREEN_HEIGHT >>> 1) + postionY - y < -10) {
               leftTopY += 10;
        }
        else leftTopY = (short) (y - (tools.SCREEN_HEIGHT >>> 1) - postionY);
        //当屏幕的左边小于地图时,取地图最左边即0
        leftTopX = (short) Math.max(0, leftTopX);
        //当屏幕的右侧大于地图的总宽度时,取地图的最右变的坐标为屏幕的最右变
        leftTopX = (short) (Math.min(mapWNum * cellWidth,
                                     leftTopX + tools.SCREEN_WIDTH) - tools.SCREEN_WIDTH);
        //当屏幕的顶部小于地图顶部时,取地图最顶边即0
        leftTopY = (short) Math.max(0, leftTopY);
        /*当屏幕的底部大于地图的最底部时(即屏幕超出了整个地图),
         取屏幕的最低端为地图的最低端,可以计算屏幕的顶端
         leftTopY = 地图的最底部 - 屏幕的高度*/
        leftTopY = (short) (Math.min(mapHNum * cellHeight,
                                     leftTopY + tools.SCREEN_HEIGHT) - tools.SCREEN_HEIGHT);
        
 }
	public static boolean isFoot(int x,int y){                 //脚部碰撞
		int x1=x-7+4;
		int y1=y-2;
		int w1=6;
		int h1=2;
        for (int i = iStart; i <= iStart + iNum; i++){
        	for (int j = jStart; j <= jStart + jNum; j++) {
				if(((MapData[i][j]>>8)& 255)>0){
					if(Tools.isInRect(x1,y1,w1,h1,j*cellWidth,i*cellHeight,cellWidth,cellHeight))
						return true;
				}				
			}
		}
		return false;
	}
	public static boolean isBody(int x,int y){               //身体碰撞
		int x1=x-7;
		int y1=y-37+8;
		int w1=14;
		int h1=20;
        for (int i = iStart; i <= iStart + iNum; i++){
        	for (int j = jStart; j <= jStart + jNum; j++) {
				if(((MapData[i][j]>>8)& 255)>0){
					if((Tools.isInRect(x1,y1,w1,h1,j*cellWidth,i*cellHeight,cellWidth,cellHeight)&&(y1+h1>i*cellHeight||i*cellHeight+16>y1)))
						return true;
				}				
			}
		}
		return false;
	}
	public static boolean isHead(int x,int y){               //头部碰撞
		int x1=x-14/2+5;
		int y1=y-37;
		int w1=4;
		int h1=4;
        for (int i = iStart; i <= iStart + iNum; i++){
        	for (int j = jStart; j <= jStart + jNum; j++) {
				if(((MapData[i][j]>>8)& 255)>0){
					if(Tools.isInRect(x1,y1,w1,h1,j*cellWidth,i*cellHeight,cellWidth,cellHeight))
						return true;
				}				
			}
		}
		return false;
	}
	
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -