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

📄 tilesengine.java

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

    int firstTileX=-offsetX/tileSize;
    int lastTileX=firstTileX+screenWidth/tileSize+1;
    int firstTileY=-offsetY/tileSize;
    int lastTileY=firstTileY+screenHeight/tileSize+1;
    firstTileX=0>firstTileX?0:firstTileX;//Math.max(0,firstTileX);
    lastTileX=width-1<lastTileX?width-1:lastTileX;//Math.min(width-1,lastTileX);
    firstTileY=0>firstTileY?0:firstTileY;//Math.max(0,firstTileY);
    lastTileY=height-1<lastTileY?height-1:lastTileY;//Math.min(height-1,lastTileY);

    //画远景
    int screenX=0;
    int distanceX=(-offsetX*(distanceWidth-screenWidth)/(mapWidth-screenWidth))%backImageWidth;

    while(screenX<screenWidth){
      Toolkit.drawRegion(g,imgBack,distanceX,0,backImageWidth-distanceX,backImageHeight,screenX,0);
      screenX+=backImageWidth-distanceX;
      distanceX=0;
    }
    //画地砖
    int tile;
    int x,y;
    int countX=imgTiles.getWidth()/tileSize;
    for(y=firstTileY;y<=lastTileY;y++){
      for(x=firstTileX;x<=lastTileX;x++){
        tile=tiles[y][x];
        if(tile!=0)
          Toolkit.drawRegion(g,imgTiles,(tile-1)%countX*tileSize,(tile-1)/countX*tileSize,
                             tileSize,tileSize,offsetX+x*tileSize,offsetY+y*tileSize);

      }
    }
    //画敌人
    Enumeration e=sprites.elements();
    Sprite sprite;
    while(e.hasMoreElements()){
      sprite=(Sprite)e.nextElement();
      if(-offsetX<sprite.x+sprite.width && sprite.x<-offsetX+screenWidth &&
         -offsetY<sprite.y+sprite.height && sprite.y<-offsetY+screenHeight)
        sprite.paint(g,offsetX,offsetY);
    }
    //画Boss
    e=boss.elements();
    while(e.hasMoreElements()){
      sprite=(Sprite)e.nextElement();
      if(-offsetX<sprite.x+sprite.width && sprite.x<-offsetX+screenWidth &&
         -offsetY<sprite.y+sprite.height && sprite.y<-offsetY+screenHeight)
        sprite.paint(g,offsetX,offsetY);
    }
    //画主角
    player.paint(g,offsetX,offsetY);
  }
  //更新
  public void update(int elapsedTime){
    player.update(elapsedTime);
    updateSprite(player,elapsedTime);
    //检查player与幽灵的碰撞
    Enumeration e=sprites.elements();
    while(e.hasMoreElements()){
      Sprite sprite=(Sprite)e.nextElement();
      if(-offsetX-screenWidth/2<sprite.x+sprite.width && sprite.x<-offsetX+screenWidth*3/2){
        if (sprite.isNeedRemove()){
          removeSprites(sprite);
          continue;
        }
        sprite.update(elapsedTime);
        if (!sprite.isFixed())
        updateSprite(sprite,elapsedTime);
      }
    }
    //检查player与Boss的碰撞
    e=boss.elements();
    while(e.hasMoreElements()){
      Sprite sprite=(Sprite)e.nextElement();
      if(-offsetX-screenWidth/2<sprite.x+sprite.width && sprite.x<-offsetX+screenWidth*3/2){
        if (sprite.isNeedRemove()) {
          removeBoss(sprite);
          continue;
        }
        sprite.update(elapsedTime);
        if (!sprite.isFixed())
        updateSprite(sprite,elapsedTime);
      }
    }

    //检测碰撞
    checkPlayerCollision(player);
  }
  //更新幽灵位置状态
  private void updateSprite(Sprite sprite,int elapsedTime){
    Tile tile=null;
    Tile finalTile=null;

    //改变x
    int vx=sprite.vx;
    int newX=sprite.x+vx;
    if(vx>0){
      //检测碰撞
      for(int i=sprite.y;i<=sprite.y+sprite.height-1;i+=tileSize){
        tile=getTileCollision(sprite.x+sprite.width-1,i,newX+sprite.width-1,i);
        if(tile!=null && (finalTile==null || tile.kind==TILE_NAIL)) finalTile=tile;
      }
      tile=getTileCollision(sprite.x+sprite.width-1,sprite.y+sprite.height-1,
                            newX+sprite.width-1,sprite.y+sprite.height-1);
      if(tile!=null && (finalTile==null || tile.kind==TILE_NAIL)) finalTile=tile;
      if(finalTile==null){
        sprite.x=newX;
        sprite.faceTo=Sprite.FACETO_RIGHT;
        if(sprite.act!=Sprite.ACT_DEAD){
          if(sprite.onGround) sprite.setAct(Sprite.ACT_RUN);
        }
      }
      else{
        sprite.x=finalTile.x*tileSize-sprite.width;
        sprite.collideHorizontal();
        sprite.faceTo=Sprite.FACETO_RIGHT;
        if(sprite.act!=Sprite.ACT_DEAD){
          if(finalTile.attr==TILE_NAIL) sprite.setAct(Sprite.ACT_DEAD);
          else if(sprite.onGround) sprite.setAct(Sprite.ACT_STAND);
        }

      }
    }
    else if(vx<0){
      //检测碰撞
      for(int i=sprite.y;i<=sprite.y+sprite.height-1;i+=tileSize){
        tile=getTileCollision(sprite.x,i,newX,i);
        if(tile!=null && (finalTile==null || tile.kind==TILE_NAIL)) finalTile=tile;
      }
      tile=getTileCollision(sprite.x,sprite.y+sprite.height-1,
                            newX,sprite.y+sprite.height-1);
      if(tile!=null && (finalTile==null || tile.kind==TILE_NAIL)) finalTile=tile;
      if(finalTile==null){
        sprite.x=newX;
        sprite.faceTo=Sprite.FACETO_LEFT;
        if(sprite.act!=Sprite.ACT_DEAD){
          if(sprite.onGround) sprite.setAct(Sprite.ACT_RUN);
        }
      }
      else{
        sprite.x=(finalTile.x+1)*tileSize;
        sprite.collideHorizontal();
        sprite.faceTo=Sprite.FACETO_LEFT;
        if(sprite.act!=Sprite.ACT_DEAD){
          if(finalTile.attr==TILE_NAIL) sprite.setAct(Sprite.ACT_DEAD);
          else if(sprite.onGround) sprite.setAct(Sprite.ACT_STAND);
        }

      }
    }
    else{
      if(sprite.act!=Sprite.ACT_DEAD){
        if(sprite.onGround) sprite.setAct(Sprite.ACT_STAND);
      }

    }

    //增加重力
    if(!sprite.isFlying()) sprite.vy=sprite.vy+gravity;
    //改变y
    tile=null;
    finalTile=null;
    int vy=sprite.vy;
    int newY=sprite.y+vy;
    if(vy>0){
      //检测碰撞
      for(int i=sprite.x;i<=sprite.x+sprite.width-1;i+=tileSize){
        tile=getTileCollision(i,sprite.y+sprite.height-1,i,newY+sprite.height-1);
        if(tile!=null && (finalTile==null || tile.kind==TILE_NAIL)) finalTile=tile;
      }
      tile=getTileCollision(sprite.x+sprite.width-1,sprite.y+sprite.height-1,
                            sprite.x+sprite.width-1,newY+sprite.height-1);
      if(tile!=null && (finalTile==null || tile.kind==TILE_NAIL)) finalTile=tile;
      if(finalTile==null){
        sprite.y=newY;
        sprite.onGround=false;
        if(sprite.act!=Sprite.ACT_DEAD){
          if(sprite.y>screenHeight) sprite.setAct(Sprite.ACT_DEAD);
          else sprite.setAct(Sprite.ACT_JUMP);
        }
      }
      else{
        sprite.y=finalTile.y*tileSize-sprite.getHeight();
        sprite.collideVertical();
        sprite.onGround=true;
        if(sprite.act!=Sprite.ACT_DEAD){
          if(finalTile.attr==TILE_NAIL) sprite.setAct(Sprite.ACT_DEAD);
        }

      }
    }
    else if(vy<0){
      //检测碰撞
      for(int i=sprite.x;i<=sprite.x+sprite.width-1;i+=tileSize){
        tile=getTileCollision(i,sprite.y,i,newY);
        if(tile!=null && (finalTile==null || tile.kind==TILE_NAIL)) finalTile=tile;
      }
      tile=getTileCollision(sprite.x+sprite.width-1,sprite.y,
                            sprite.x+sprite.width-1,newY);
      if(tile!=null && (finalTile==null || tile.kind==TILE_NAIL)) finalTile=tile;
      if(finalTile==null){
        sprite.y=newY;
        sprite.onGround=false;
        if(sprite.act!=Sprite.ACT_DEAD){
          sprite.setAct(Sprite.ACT_JUMP);
        }
      }
      else{
        sprite.y=(finalTile.y+1)*tileSize;
        sprite.collideVertical();
        sprite.onGround=false;
        if(sprite.act!=Sprite.ACT_DEAD){
          if(finalTile.attr==TILE_NAIL) sprite.setAct(Sprite.ACT_DEAD);
          else sprite.setAct(Sprite.ACT_JUMP);
        }
      }
    }

    //当卷屏模式为单向时检测player的位置不让player超出屏幕左端
    if(reel==REEL_SINGLE && sprite==player && (player.x+offsetX)<0){
      player.x=-offsetX;
      player.collideHorizontal();
      if(sprite.act!=Sprite.ACT_DEAD){
        if(sprite.onGround) sprite.setAct(Sprite.ACT_STAND);
      }
    }
  }
  //检测是否与地砖相撞
  private Tile getTileCollision(int fromX,int fromY,int toX,int toY){
    int increase=1;
    if(fromX>toX || fromY>toY) increase=-1;
    int fromTileX=pixelToTile(fromX);
    int fromTileY=pixelToTile(fromY);
    int toTileX=pixelToTile(toX);
    int toTileY=pixelToTile(toY);

    getTile(fromTileX,fromTileY,tile1);
    for(int x=fromTileX;increase==1?x<=toTileX:x>=toTileX;x+=increase)
      for(int y=fromTileY;increase==1?y<=toTileY:y>=toTileY;y+=increase){
        getTile(x,y,tile2);
        if(fromTileY<toTileY && tile2.attr==TILE_STEP && tile1.y!=tile2.y){
            return tile2;
        }
        else if(tile2.attr==TILE_ROCK || tile2.attr==TILE_NAIL){
          return tile2;
        }
      }

    return null;
  }
  private int tileToPixel(int tile){
    return tile*tileSize;
  }
  private int pixelToTile(int pixel){
    if(pixel>=0 || pixel%tileSize==0)
      return pixel/tileSize;
    else
      return pixel/tileSize-1;
  }
  //检测幽灵碰撞
  public void checkPlayerCollision(Sprite sprite){
    if(!sprite.isAlive()) return;
    //检查与幽灵的碰撞
    Enumeration e=sprites.elements();
    Sprite s;
    while(e.hasMoreElements()){
      s=(Sprite)e.nextElement();
      if(s.isAlive() && sprite.isCollision(s)) playerCollision(s);
    }
    //检查与Boss的碰撞
    e=boss.elements();
    while(e.hasMoreElements()){
      s=(Sprite)e.nextElement();
      if(s.isAlive() && sprite.isCollision(s)) playerCollision(s);
    }
  }
  public void playerCollision(Sprite sprite){
  }
}

⌨️ 快捷键说明

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