📄 tilesengine.java
字号:
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 + -