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

📄 tilesengine.java

📁 初学者的佳音 初学者的佳音 初学者的佳音 初学者的佳音 初学者的佳音
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -