📄 tanksprite.java
字号:
bgdx = 0; //每个背景的偏移值为0
bgdy = 0; //每个背景的偏移值为0
if (y + Maps.y < 0) { //地图边界修正
y=0;
dy = 0;
}
//纵向滚屏判断
if (y <= TankGameCanvas.height / 2 - 16 //这里滚屏的范围限定在离屏幕上端屏幕高度的1/2,如果超过屏幕1/2,
|| ((Maps.y != Maps.tileSize //而且屏幕显示的地图已经到达最上面就不滚屏了
* Maps.h - TankGameCanvas.height) && y >= TankGameCanvas.height / 2- 16)) {
//这里右移2位相当于除以4,这样可以减缓屏幕滚动的速度,可以根据右移的倍数调节滚动的速度
bgdy = (TankGameCanvas.height / 2 - y - 16) >> 2;
//保证屏幕不会上下循环滚动,修正偏移量
if (bgdy - Maps.y < TankGameCanvas.height - Maps.tileSize * Maps.h) {
bgdy = TankGameCanvas.height - Maps.tileSize * Maps.h+ Maps.y;
}
//如果超出屏幕或者人物当前的高度,但没有达到离屏幕上端屏幕的1/4,不滚动
if ((Maps.y <= 0)&& y < TankGameCanvas.height / 2 - 16) {
Maps.y = 0;
bgdy = 0;
}
} else {
bgdy = 0; //不滚屏
}
//横向滚屏,以屏幕的1/2为界限,超过1/2就滚动
if (this.x != TankGameCanvas.width / 2 - 16) {
bgdx = (TankGameCanvas.width / 2 - 16 - x );
} else {
bgdx = 0;
}
if (Maps.x - bgdx < 0 //超出屏幕,或者在地图的两端,不再滚动
|| Maps.x - bgdx > Maps.tileSize * Maps.w
- TankGameCanvas.width) {
bgdx = 0;
}
y += dy; //精灵上下移动
x += dx; //精灵左右移动
//修正人物的坐标,相当于人物不动
x += bgdx;
y += bgdy;
//修正地图的坐标,相当于地图滚动
Maps.x -= bgdx;
Maps.y -= bgdy;
int tmpDy = bgdy;
if (Maps.y < 0) {
tmpDy = bgdy + Maps.y;
bgdy = - Maps.y;
Maps.y = 0;
y += bgdy;
}
//当向上超出屏幕时,修正滚动的幅度
bgdy = tmpDy;
//阻挡人物始终在屏幕内,左边
if (x < 0) {
x = 0;
}
//阻挡人物始终在屏幕内,右边
if (this.x >= TankGameCanvas.width - 32) {
this.x = TankGameCanvas.width - 32;
}
if(this.y>=TankGameCanvas.height-32){
this.y=TankGameCanvas.height-32;
}
}
//-生命
private void loseLife(int n){
if(spriteState==TANK){
tankPow-=n;
if(tankPow<=0){
tankPow=0;
gm.creatTankBomb(x-16, y-32, spriteState);
isHidden=true;
isDead=true;
}
}else if(spriteState==TANE){
tanePow-=n;
if(tanePow<=0){
gm.creatTankBomb(x, y, spriteState);
isHidden=true;
isDead=true;
System.out.println("Tank is dead...");
}
}else{
tanePow-=n;
kaneGun-=1;
if(tanePow<=0){
gm.creatTankBomb(x, y, spriteState);
isHidden=true;
isDead=true;
System.out.println("Kane is dead...");
}
if(kaneGun<0){
kaneGun=0;
}
}
}
//跳
private void jump(){
if(dy==0&&spriteState==TANK){
if(isWater)
dy-=13;
else
dy-=18;
}else if(dy==0&&spriteState==TANE){
if(!isDown&&!isWater){
dy-=13;
frameCnt=7;
if(isLeft)
frameCnt=3;
}
if(value==0x08){
isLadder=!isLadder;
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
}
}
}
//TODO 发射子弹
private void fire(){
switch(bulletType){
//TANK
case BULLET_DEFANUL:
case BULLET_HYPER:
if(isUp){
if(isLeft)
gm.creatBullet(x+8, y, 0, -MOVE_SPEED*2,bulletType);
else
gm.creatBullet(x, y, 0, -MOVE_SPEED*2,bulletType);
}else if(isLeft){
gm.creatBullet(x+4, y+6,-MOVE_SPEED*2,0,bulletType);
}else{
gm.creatBullet(x+4, y+6,MOVE_SPEED*2,0,bulletType);
}
break;
case BULLET_CRUCHER:
if(isUp){
if(isLeft)
gm.creatBullet(x+8, y, 0, -MOVE_SPEED*3,bulletType);
else
gm.creatBullet(x, y, 0, -MOVE_SPEED*3,bulletType);
}else if(isLeft){
gm.creatBullet(x+4, y+6,-MOVE_SPEED*3,0,bulletType);
}else{
gm.creatBullet(x+4, y+6,MOVE_SPEED*3,0,bulletType);
}
break;
//TANE
case BULLET_TANE:
if(isLeft){
if(isDown){
gm.creatBullet(x+4, y+9, -MOVE_SPEED*2, 0, bulletType);
}else{
gm.creatBullet(x+4, y+2, -MOVE_SPEED*2, 0, bulletType);
}
}else{
if(isDown){
gm.creatBullet(x, y+9, MOVE_SPEED*2, 0, bulletType);
}else{
gm.creatBullet(x, y+2, MOVE_SPEED*2, 0, bulletType);
}
}
break;
//KANE
case BULLET_BOMB:
switch(direction){
case left:
gm.creatBullet(x+12, y+12, -MOVE_SPEED*3, 0, bulletType);
break;
case right:
gm.creatBullet(x+12, y+12, MOVE_SPEED*3, 0, bulletType);
break;
case up:
gm.creatBullet(x+12, y+12, 0, -MOVE_SPEED*3, bulletType);
break;
case down:
gm.creatBullet(x+12, y+12, 0, MOVE_SPEED*3, bulletType);
break;
}
break;;
case BULLET_GUN00:
case BULLET_GUN01:
case BULLET_GUN02:
case BULLET_GUN03:
case BULLET_GUN04:
switch(direction){
case left:
gm.creatBullet(x+12, y+14, -MOVE_SPEED*2, 0, bulletType);
break;
case right:
gm.creatBullet(x+14, y+14, MOVE_SPEED*2, 0, bulletType);
break;
case up:
gm.creatBullet(x+18, y+14, 0, -MOVE_SPEED*2, bulletType);
break;
case down:
gm.creatBullet(x+8, y+14, 0, MOVE_SPEED*2, bulletType);
break;
}
break;
case BULLET_GUN05:
case BULLET_GUN06:
if(direction==left){
if(gunType==0){
gm.creatBullet(x+8, y+14, 180, 0, bulletType);
gunType=1;
}else if(gunType==1){
gm.creatBullet(x+8, y+14, 180, 30, bulletType);
gunType=2;
}else if(gunType==2){
gm.creatBullet(x+8, y+14, 180, -30, bulletType);
gunType=0;
}
}else if(direction==right){
if(gunType==0){
gm.creatBullet(x+8, y+14, 0, 0, bulletType);
gunType=1;
}else if(gunType==1){
gm.creatBullet(x+8, y+14, 0, 30, bulletType);
gunType=2;
}else if(gunType==2){
gm.creatBullet(x+8, y+14, 0, -30, bulletType);
gunType=0;
}
}else if(direction==up){
if(gunType==0){
gm.creatBullet(x+8, y+14, 270, 0, bulletType);
gunType=1;
}else if(gunType==1){
gm.creatBullet(x+8, y+14, 270, 30, bulletType);
gunType=2;
}else if(gunType==2){
gm.creatBullet(x+8, y+14, 270, -30, bulletType);
gunType=0;
}
}else{
if(gunType==0){
gm.creatBullet(x+8, y+14, 90, 0, bulletType);
gunType=1;
}else if(gunType==1){
gm.creatBullet(x+8, y+14, 90, 30, bulletType);
gunType=2;
}else if(gunType==2){
gm.creatBullet(x+8, y+14, 90, -30, bulletType);
gunType=0;
}
}
break;
case BULLET_GUN07:
switch(direction){
case left:
gm.creatBullet(x+4, y+14, -MOVE_SPEED, 0, bulletType);
break;
case right:
gm.creatBullet(x+22, y+14, MOVE_SPEED, 0, bulletType);
break;
case up:
gm.creatBullet(x+18, y+4, 0, -MOVE_SPEED, bulletType);
break;
case down:
gm.creatBullet(x+8, y+22, 0, MOVE_SPEED, bulletType);
break;
}
break;
case BULLET_GUN08:
switch(direction){
case left:
gm.creatBullet(x+12, y+14, -MOVE_SPEED*2, 0, bulletType);
break;
case right:
gm.creatBullet(x+14, y+14, MOVE_SPEED*2, 0, bulletType);
break;
case up:
gm.creatBullet(x+18, y+14, 0, -MOVE_SPEED*2, bulletType);
break;
case down:
gm.creatBullet(x+8, y+14, 0, MOVE_SPEED*2, bulletType);
break;
}
break;
}
}
private void nextFrame(int frameNum,int frameIndex){
if(index>frameNum||index<0)
index=0;
frameCnt=frame[index]+frameIndex;
if(++timeCnt%3==0)
index++;
}
//检测与地图水平方向的碰撞检测
private boolean checkTileCollisionHorizon() {
int i;
//根据人物的大小不同,碰撞判断的区域也不同,总体来说是根据矩形判断
if (spriteState == TANE||spriteState==KANE) { //精灵在16X16 区域下
rect1.y = this.y + Maps.y;
rect1.x = x + Maps.x + dx;
rect1.dx = 16;
rect1.dy = 16;
rect2.dx = 16;
rect2.dy = 16;
if (dx < 0) { //负数人物向左走,正数向右走
if(spriteState==KANE){
rect1.y = this.y + Maps.y+20;
rect1.dx=20;
}
i = rect1.x / Maps.tileSize;
} else { //人物向右走
if(spriteState==KANE){
rect1.y = this.y + Maps.y+16;
rect1.x+=14;
}
i = rect1.x / Maps.tileSize+1;
}
if (i < 0 || i > Maps.w - 1)
return false; //超出地图,不作判断
int yTile1 = rect1.y / Maps.tileSize; //地图为16X16,人物为32X32,需要判断两块地图块
int yTile2 = rect1.y / Maps.tileSize + 1;
if (yTile1 < 0 || yTile2 > Maps.h - 1)
return false; //超出地图,不作判断
if (((Maps.mapArray[yTile1][i] >> 8) & 0x0f) == 0x0f) {
rect2.x = i * 16;
rect2.y = yTile1 * 16;
if (Rect.IntersectRect(rect1, rect2)) {
return true;
}
}
if (((Maps.mapArray[yTile2][i] >> 8) & 0x0f) == 0x0f) {
rect2.x = i * 16;
rect2.y = yTile2 * 16;
if (Rect.IntersectRect(rect1, rect2)) {
return true;
}
}
} else { //精灵在32X32 区域下
rect1.y = this.y + Maps.y + 15; //坦克Y起点
rect1.dx = 24; //
rect1.dy = 16;
rect2.dx = 16;
rect2.dy = 16;
if (dx < 0) {
rect1.x = x + Maps.x + dx + 2 ;
i = rect1.x / Maps.tileSize;
} else {
rect1.x=x + Maps.x + dx +30;
i = rect1.x / Maps.tileSize;
}
if (i < 0 || i > Maps.w - 1)
return false;
int yTile1 = (y + Maps.y) / Maps.tileSize + 1;
int yTile2 = (y + Maps.y) / Maps.tileSize + 2;
if (yTile1 < 0 || yTile2 > Maps.h - 1)
return false;
if (((Maps.mapArray[yTile1][i] >> 8) & 0x0f) == 0x0f) {
rect2.x = i * 16;
rect2.y = yTile1 * 16;
if (Rect.IntersectRect(rect1, rect2)) {
return true;
}
}
if (((Maps.mapArray[yTile2][i] >> 8) & 0x0f) == 0x0f) {
rect2.x = i * 16;
rect2.y = yTile2 * 16;
if (Rect.IntersectRect(rect1, rect2)) {
return true;
}
}
for(i=gm.lgr.corps.length-1;i>=0;i--){
if(!gm.lgr.corps[i].isHidden){
rect2.x=gm.lgr.corps[i].x+Maps.x;
rect2.y=gm.lgr.corps[i].y+Maps.y;
rect2.dx=16;
rect2.dy=16;
if(Rect.IntersectRect(rect1, rect2)){
return true;
}
}
}
}
return false;
}
// 纵向地图碰撞检测
private boolean checkTileCollisionVertical() {
if (spriteState == TANE) {
// 16X16
if (dy > 0) {
isJumpOver = true;
for (int i = (y + Maps.y + 15)
/ Maps.tileSize + 1; i <= (y + Maps.y + dy)
/ Maps.tileSize + 1; i++) {
if (i < 0 || i > Maps.h - 1) {
continue;
}
int xTile1 = (x + Maps.x + 2)/ Maps.tileSize;
int xTile2 = (x + Maps.x + 14)/ Maps.tileSize;
if (xTile2 > Maps.w - 1 || xTile1 < 0) {
return false;
}
if (((Maps.mapArray[i][xTile1] >> 8) & 0x0f) == 0x0f) {
dy = (i - 1) * Maps.tileSize
- (y + Maps.y);
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
return true;
}
if (((Maps.mapArray[i][xTile2] >> 8) & 0x0f) == 0x0f) {
dy = (i - 1) * Maps.tileSize
- (y + Maps.y);
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
return true;
}
}
} else if (dy < 0) {
for (int i = (y + Maps.y)
/ Maps.tileSize; i <= (y + Maps.y)
/ Maps.tileSize; i++) {
if (i < 0 || i > Maps.h - 1) {
continue;
}
int xTile1 = (x + Maps.x + 2) / Maps.tileSize;
int xTile2 = (x + Maps.x + 14)/ Maps.tileSize;
if (xTile2 > Maps.w - 1 || xTile1 < 0) {
return false;
}
if (((Maps.mapArray[i][xTile1] >> 8) & 0x0f) == 0x0f) {
dy = 0;
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
return true;
}
if (((Maps.mapArray[i][xTile2] >> 8) & 0x0f) == 0x0f) {
dy=0;
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
return true;
}
}
} else {
isJumpOver = true;
}
} else {
//TANK TANE
rect1.y = this.y + Maps.y + 5;
rect1.dx = 32;
rect1.dy = 32;
rect2.dx = 16;
rect2.dy = 16;
if (dy > 0) {
for (int i = (y + Maps.y + 12)
/ Maps.tileSize + 2; i <= (y + Maps.y + dy)
/ Maps.tileSize + 2; i++) {
if (i < 0 || i > Maps.h - 1) {
continue;
}
int xTile1 = (x + Maps.x + 4) / Maps.tileSize;
int xTile2 = (x + Maps.x + 18) / Maps.tileSize;
int xTile3 = (x + Maps.x + 28) / Maps.tileSize;
if (xTile3 > Maps.w - 1 || xTile1 < 0) {
return false;
}
if (((Maps.mapArray[i][xTile1] >> 8) & 0x0f) == 0x0f) {
dy = (i - 2) * Maps.tileSize - (y + Maps.y);
isJumpOver = true;
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
return true;
}
if (((Maps.mapArray[i][xTile2] >> 8) & 0x0f) == 0x0f) {
dy = (i - 2) * Maps.tileSize - (y + Maps.y);
isJumpOver = true;
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
return true;
}
if (((Maps.mapArray[i][xTile3] >> 8) & 0x0f) == 0x0f) {
dy = (i - 2) * Maps.tileSize - (y + Maps.y);
isJumpOver = true;
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
return true;
}
}
} else if (dy < 0) {
for (int i = (y + Maps.y+8)
/ Maps.tileSize; i <= (y + Maps.y)
/ Maps.tileSize; i++) {
if (i < 0 || i > Maps.h - 1) {
continue;
}
int xTile1 = (x + Maps.x + 4) / Maps.tileSize;
int xTile2 = (x + Maps.x + 18)/ Maps.tileSize;
int xTile3 = (x + Maps.x + 28)/Maps.tileSize;
if (xTile2 > Maps.w - 1 || xTile1 < 0) {
return false;
}
if (((Maps.mapArray[i][xTile1] >> 8) & 0x0f) == 0x0f) {
dy = 0;
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
return true;
}
if (((Maps.mapArray[i][xTile2] >> 8) & 0x0f) == 0x0f) {
dy=0;
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
return true;
}
if (((Maps.mapArray[i][xTile3] >> 8) & 0x0f) == 0x0f) {
dy=0;
keyAction &= ~KeyMask.MASK_KEY_JUMP_FLAG;
return true;
}
}
} else {
isJumpOver = false;
}
}
return false;
}
//检查横向与敌人的碰撞
private boolean checkEnemyCollision(){
if(gm.isGameStart){
rect1.x=x+4;
rect1.y=y+16;
rect1.dy=16;
rect1.dx=16;
if(spriteState==TANE){
rect1.x=x;
rect1.y=y;
rect1.dx=16;
rect1.dy=16;
}
for(int i=gm.lgr.enemySprite16.length-1;i>=0;i--){
if(!gm.lgr.enemySprite16[i].isHidden){
rect2.x=gm.lgr.enemySprite16[i].x;
rect2.y=gm.lgr.enemySprite16[i].y;
rect2.dx=16;
rect2.dy=16;
if(Rect.IntersectRect(rect1, rect2)){
return true;
}
}
}
if(isBoss){
for(int i=gm.lgr.enemySprite32.length-1;i>=0;i--){
if(!gm.lgr.enemySprite32[i].isHidden){
rect2.x=gm.lgr.enemySprite32[i].x+24;
rect2.y=gm.lgr.enemySprite32[i].y+10;
rect2.dx=48;
rect2.dy=48;
if(Rect.IntersectRect(rect1, rect2)){
return true;
}
}
}
}else{
for(int i=gm.lgr.enemySprite32.length-1;i>=0;i--){
if(!gm.lgr.enemySprite32[i].isHidden){
rect2.x=gm.lgr.enemySprite32[i].x;
rect2.y=gm.lgr.enemySprite32[i].y;
rect2.dx=32;
rect2.dy=32;
if(Rect.IntersectRect(rect1, rect2)){
return true;
}
}
}
}
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -