📄 tilesengine.java
字号:
package lib;
import javax.microedition.lcdui.*;
import java.io.*;
import java.util.*;
//地砖块
class Tile{
public int x;
public int y;
public int kind;
public int attr;
}
//地砖引擎
public abstract class TilesEngine extends Frame{
//地砖类型
public final int TILE_BACK=0; //背景
public final int TILE_ROCK=1; //石头
public final int TILE_STEP=2; //台阶
public final int TILE_NAIL=3; //钉子
//卷屏模式
public final int REEL_BOTH=0; //双向
public final int REEL_SINGLE=1; //单向
//屏幕尺寸(象素)
private int screenWidth=XCanvas.WIDTH;
private int screenHeight=XCanvas.HEIGHT;
//地图尺寸(象素)
private int mapWidth;
private int mapHeight;
//地图尺寸(块)
private int width;
private int height;
//远景长度(象素)
private int distanceWidth;
//地砖尺寸(象素)
private int tileSize;
//当前地图的偏移量(象素)
private int offsetX;
private int offsetY;
//临时地砖
private Tile tile1=new Tile();
private Tile tile2=new Tile();
//重力加速度
private int gravity=1;
//卷屏模式
private int reel;
//地砖数组
private byte[][] tiles;
//地砖类型表
private byte[] tilesAttr;
//玩家
private Sprite player;
//玩家初始位置
private Point[] playerStartPoint;
//幽灵
public Vector sprites=new Vector();
//Boss
public Vector boss=new Vector();
//地砖图
private Image imgTiles;
//背景图
private Image imgBack;
//-------------------------------------------------------------------
int backImageWidth;
int backImageHeight;
public TilesEngine(){
}
//载入地图
public void loadMap(String name,Image imgTiles,Image imgBack){
sprites.removeAllElements();
boss.removeAllElements();
offsetX=0;
offsetY=0;
this.imgTiles=imgTiles;
this.imgBack=imgBack;
DataInputStream in=new DataInputStream(this.getClass().getResourceAsStream(name));
try{
tileSize=in.readByte();
tilesAttr=new byte[in.readByte()];
int i,j;
for(i=0;i<tilesAttr.length;i++) tilesAttr[i]=in.readByte();
tiles=new byte[in.readInt()][in.readInt()];
for(i=0;i<tiles.length;i++)
for(j=0;j<tiles[i].length;j++)
tiles[i][j]=in.readByte();
//设置主角数据
playerStartPoint=new Point[in.readInt()];
for(i=0;i<playerStartPoint.length;i++)
playerStartPoint[i]=new Point(in.readInt(),in.readInt());
for(i=0;i<playerStartPoint.length;i++){
if(playerStartPoint[i].x>player.x){
i--;
break;
}
}
if(i<0){
player.setPosition(playerStartPoint[0].x,playerStartPoint[0].y);
}
else if(i==playerStartPoint.length){
player.setPosition(playerStartPoint[i-1].x,playerStartPoint[i-1].y);
}
else{
player.setPosition(playerStartPoint[i].x,playerStartPoint[i].y);
}
// player.setPosition(in.readInt(),in.readInt());
player.setFaceTo(in.readInt());
player.setAct(in.readInt());
//载入幽灵
loadSprites(in);
width=tiles[0].length;
height=tiles.length;
mapWidth=tileToPixel(width);
mapHeight=tileToPixel(height);
distanceWidth=mapWidth/(2*imgBack.getWidth())*imgBack.getWidth();
//--------------------------------------------------------------
backImageWidth=imgBack.getWidth();
backImageHeight=imgBack.getHeight();
//双向卷动
if(reel==REEL_BOTH){
int playerScreenX=player.x+player.width/2+offsetX;
if(playerScreenX<=(screenWidth/2-0)){
offsetX=screenWidth/2-0-(player.x+player.width/2);
offsetX=offsetX<0?offsetX:0;//Math.min(offsetX,0);
offsetX=offsetX>screenWidth-mapWidth?offsetX:screenWidth-mapWidth;//Math.max(offsetX,screenWidth-mapWidth);
offsetY=screenHeight/2-(player.y+player.height/2);
offsetY=offsetY<0?offsetY:0;//Math.min(offsetY,0);
offsetY=offsetY>screenHeight-mapHeight?offsetY:screenHeight-mapHeight;//Math.max(offsetY,screenHeight-mapHeight);
}
else if(playerScreenX>=(screenWidth/2+0)){
offsetX=screenWidth/2+0-(player.x+player.width/2);
offsetX=offsetX<0?offsetX:0;//Math.min(offsetX,0);
offsetX=offsetX>screenWidth-mapWidth?offsetX:screenWidth-mapWidth;//Math.max(offsetX,screenWidth-mapWidth);
offsetY=screenHeight/2-(player.y+player.height/2);
offsetY=offsetY<0?offsetY:0;//Math.min(offsetY,0);
offsetY=offsetY>screenHeight-mapHeight?offsetY:screenHeight-mapHeight;//Math.max(offsetY,screenHeight-mapHeight);
}
}
//单向卷动
else if(reel==REEL_SINGLE){
int newOffsetX=screenWidth/2-(player.x+player.width/2);
newOffsetX=newOffsetX<0?newOffsetX:0;//Math.min(newOffsetX,0);
newOffsetX=newOffsetX>screenWidth-mapWidth?newOffsetX:screenWidth-mapWidth;//Math.max(newOffsetX,screenWidth-mapWidth);
if(newOffsetX<offsetX) offsetX=newOffsetX;
offsetY=screenHeight/2-(player.y+player.height/2);
offsetY=offsetY<0?offsetY:0;//Math.min(offsetY,0);
offsetY=offsetY>screenHeight-mapHeight?offsetY:screenHeight-mapHeight;//Math.max(offsetY,screenHeight-mapHeight);
}
}
catch(Exception e){
e.printStackTrace();
}
}
public void setTile(int row,int col,byte tile){
tiles[row][col]=tile;
}
//载入幽灵
protected void loadSprites(DataInputStream in) throws Exception{
}
//添加幽灵
public void addSprites(Sprite s){
s.setTilesEngine(this);
sprites.addElement(s);
}
//删除幽灵
public void removeSprites(Sprite s){
sprites.removeElement(s);
}
//删除所有幽灵
public void removeAllSprites(){
sprites.removeAllElements();
}
//添加Boss
public void addBoss(Sprite s){
s.setTilesEngine(this);
boss.addElement(s);
}
//删除Boss
public void removeBoss(Sprite s){
boss.removeElement(s);
}
//返回Boss
public Vector getBoss(){
return boss;
}
//删除所有Boss
public void removeAllBoss(){
boss.removeAllElements();
}
public int getBossCount(){
return boss.size();
}
//设置玩家
public void setPlayer(Sprite player){
player.setTilesEngine(this);
this.player=player;
}
//返回玩家
public Sprite getPlayer(){
return player;
}
//设置重力加速度
public void setGravity(int gravity){
this.gravity=gravity;
}
//返回重力加速度
public int getGravity(){
return gravity;
}
//设置卷屏模式
public void setReel(int reel){
this.reel=reel;
}
//返回卷屏模式
public int getReel(){
return reel;
}
//返回地砖尺寸
public int getTileSize(){
return tileSize;
}
//返回地图宽度(块)
public int getWidth(){
return width;
}
//返回地图高度(块)
public int getHeight(){
return height;
}
//返回地图宽度(像素)
public int getMapWidth(){
return mapWidth;
}
//返回地图宽度(象素)
public int getMapHeight(){
return mapHeight;
}
//填充指定位置的地砖
public void getTile(int x,int y,Tile tile){
tile.x=x;
tile.y=y;
if(x<0 || x>=width){
tile.kind=0;
tile.attr=TILE_ROCK;
}
else if(y<0 || y>=height){
tile.kind=0;
tile.attr=TILE_BACK;
}
else{
tile.kind=tiles[y][x];
tile.attr=tilesAttr[tiles[y][x]];
}
}
//绘制所有物体
public void paint(Graphics g){
//双向卷动
if(reel==REEL_BOTH){
int playerScreenX=player.x+player.width/2+offsetX;
if(playerScreenX<=(screenWidth/2-0) && player.vx<0){
offsetX=screenWidth/2-0-(player.x+player.width/2);
offsetX=offsetX<0?offsetX:0;//Math.min(offsetX,0);
offsetX=offsetX>screenWidth-mapWidth?offsetX:screenWidth-mapWidth;//Math.max(offsetX,screenWidth-mapWidth);
offsetY=screenHeight/2-(player.y+player.height/2);
offsetY=offsetY<0?offsetY:0;//Math.min(offsetY,0);
offsetY=offsetY>screenHeight-mapHeight?offsetY:screenHeight-mapHeight;//Math.max(offsetY,screenHeight-mapHeight);
}
else if(playerScreenX>=(screenWidth/2+0) && player.vx>0){
offsetX=screenWidth/2+0-(player.x+player.width/2);
offsetX=offsetX<0?offsetX:0;//Math.min(offsetX,0);
offsetX=offsetX>screenWidth-mapWidth?offsetX:screenWidth-mapWidth;//Math.max(offsetX,screenWidth-mapWidth);
offsetY=screenHeight/2-(player.y+player.height/2);
offsetY=offsetY<0?offsetY:0;//Math.min(offsetY,0);
offsetY=offsetY>screenHeight-mapHeight?offsetY:screenHeight-mapHeight;//Math.max(offsetY,screenHeight-mapHeight);
}
}
//单向卷动
else if(reel==REEL_SINGLE){
int newOffsetX=screenWidth/2-(player.x+player.width/2);
newOffsetX=newOffsetX<0?newOffsetX:0;//Math.min(newOffsetX,0);
newOffsetX=newOffsetX>screenWidth-mapWidth?newOffsetX:screenWidth-mapWidth;//Math.max(newOffsetX,screenWidth-mapWidth);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -