📄 map.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 + -