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

📄 tanksprite.java

📁 经典FC游戏《超惑星战记》的J2ME版本!!功能基本上都实现了
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		
		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 + -