📄 tanksprite.java
字号:
//与敌人子弹碰撞检测
private boolean checkBulletDamage(){
rect1.x = x;
rect1.y = y+16;
rect1.dx=24;
rect1.dy=16;
rect2.dx = 8;
rect2.dy = 8;
if(spriteState==TANE){
rect1.x=x;
rect1.y=y;
rect1.dx=16;
rect1.dy=16;
}
for(int i=gm.lgr.enemyBullet.length-1;i>=0;i--){
if(!gm.lgr.enemyBullet[i].isHidden){
rect2.x=gm.lgr.enemyBullet[i].x;
rect2.y=gm.lgr.enemyBullet[i].y;
if(Rect.IntersectRect(rect1, rect2)){
gm.lgr.enemyBullet[i].isHidden=true;
gm.lgr.enemyBullet[i].creatBombEffect(gm.lgr.enemyBullet[i].x, gm.lgr.enemyBullet[i].y, gm.lgr.enemyBullet[i].bulletType);
attack=gm.lgr.enemyBullet[i].pow;
return true;
}
}
}
return false;
}
//检测当前精灵所在地图的属性状态
private void checkTileValue(){
int i = 0;
int yTile;
rect1.dx = 16;
rect1.dy = 16;
rect2.dx = 16;
rect2.dy = 16;
if(spriteState==TANE){
rect1.y = this.y + Maps.y+4;
rect1.x = x + Maps.x + 8;
i = rect1.x / Maps.tileSize;
if (i < 0 || i > Maps.w - 1)
return ; //超出地图,不作判断
yTile = rect1.y / Maps.tileSize;
rect2.x = i * 16;
rect2.y = yTile * 16;
}else{
rect1.y = this.y + Maps.y + 15; //坦克Y起点
if(dx==0){
rect1.x = x + Maps.x + dx + 16 ;
i = rect1.x / Maps.tileSize;
}else if(dx<0){
rect1.x = x + Maps.x + 4 ;
i = rect1.x / Maps.tileSize;
}else{
rect1.x = x + Maps.x +12 ;
i = rect1.x / Maps.tileSize+1;
}
if (i < 0 || i > Maps.w - 1)
return ;
yTile = (y + Maps.y) / Maps.tileSize + 1;
rect2.x = i * 16;
rect2.y = yTile * 16;
}
isWater=false; //不在水中
// isLadder=false;
isHidden=false;
//检测地图属性,作出相当的判断
/**
* 碰撞(0f):
*通道(01):
*掉血:(02):
*水:(04):
*梯:(08):
*/
value=(Maps.mapArray[yTile][i] >> 8);
/**------------------TANK-----------------------------------------------------------*/
if(!haveData){
switch(spriteState){
case TANK:
switch(value){
case 0x01:
isHidden=true;
if(timeCnt++%2==0)
isHidden=false;
break;
case 0x02:
if(!isProtected){
loseLife(2);
if(spriteState==TANK){
isProtected=true;
}else{
isProtected=true;
}
}
break;
case 0x04: //在水中
isWater=true;
break;
case 0x09: //11
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
break;
case 0x0b: //12
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
break;
case 0x0c: //13
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
break;
case 0x0e:
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
break;
case 0x0d: //15
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
break;
}
break;
/*--------------------TANE-------------------------*/
case TANE:
switch(value){
case 0x02:
if(!isProtected){
loseLife(2);
isProtected=true;
}
break;
case 0x04: //在水中
isWater=true;
break;
case 0x08:
if(isLadder){
x=i*16-Maps.x;
}else{
y=yTile*16-Maps.y;
}
break;
case 0x20: //16
if(isDown){
isChangeScreen=true;
direction=up;
LoadGameResource.data=value;
haveData=true;
}
break;
case 0x21: //17 C12
if(isDown){
isChangeScreen=true;
direction=up;
LoadGameResource.data=value;
haveData=true;
}
break;
case 0x22: //18 C13
if(isDown){
isChangeScreen=true;
direction=up;
LoadGameResource.data=value;
haveData=true;
}
break;
case 0x23: //19 C14
if(isDown){
isChangeScreen=true;
direction=up;
LoadGameResource.data=value;
haveData=true;
}
break;
case 0x24: //17 C15
if(isDown){
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
}
break;
}
break;
/*---------------------KANE-----------------------*/
case KANE:
switch(value){
case 0x01:
isHidden=true;
if(timeCnt++%2==0)
isHidden=false;
break;
case 0x02:
if(!isProtected){
loseLife(2);
if(spriteState==TANK){
isProtected=true;
}else{
isProtected=true;
}
}
break;
case 0x11: //c1
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
break;
case 0x12: //c2
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
break;
case 0x13: //c3
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
break;
case 0x14: //c4
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
break;
case 0x15: //c5
isChangeScreen=true;
LoadGameResource.data=value;
haveData=true;
break;
case 0x16:
if(!HYPER_BEAM){
isChangeScreen=true;
isBoss=true;
haveData=true;
LoadGameResource.data=value;
}
break;
}
break;
}
}
}
// 换地图中主角的偏移
public void initOffset(int offsetX,int offsetY){
Maps.x=offsetX*16-TankGameCanvas.width/2;
Maps.y=offsetY*16-TankGameCanvas.height/2;
x=TankGameCanvas.width/2;
y=TankGameCanvas.height/2;
if(Maps.x<0){
Maps.x=0;
x=offsetX*16;
}
if(Maps.y<0){
Maps.y=0;
y=offsetY*16;
}
if(Maps.h*16-Maps.y<TankGameCanvas.height){
Maps.y=Maps.h*16-TankGameCanvas.height;
}
if(Maps.w*16-Maps.x<TankGameCanvas.width){
Maps.x=Maps.w*16-TankGameCanvas.width;
x+=offsetX*16-Maps.x-TankGameCanvas.width/2;
}
isHidden=false;
isDown=false;
}
// 轮子状态
public void drop(){
isUp=false;
for(int i=1;i<=2;i++){
if(isLeft){
if(frameCnt<2){
frameCnt++;
wheelRise-=1;
}
}else if(!isLeft){
if(frameCnt>5){
frameCnt--;
wheelRise-=1;
}
}
}
}
//TODO 判断按键按下的动作
public void judgeKeyCode(int keyCode, int gameKeyCode) {
switch (gameKeyCode) {
case Canvas.UP:
keyAction|=KeyMask.MASK_KEY_UP;
break;
case Canvas.DOWN:
keyAction|=KeyMask.MASK_KEY_DOWN;
break;
case Canvas.FIRE:
if ((((keyAction & KeyMask.MASK_KEY_FIRE) == 0) && ((keyAction & KeyMask.MASK_KEY_FIRE_FLAG) == 0))) {
keyAction |= KeyMask.MASK_KEY_FIRE | KeyMask.MASK_KEY_FIRE_FLAG;
}
break;
case Canvas.LEFT:
keyAction |= KeyMask.MASK_KEY_LEFT;
break;
case Canvas.RIGHT:
keyAction |= KeyMask.MASK_KEY_RIGHT;
break;
default:
switch (keyCode) {
case Canvas.KEY_NUM0:
if ((((keyAction & KeyMask.MASK_KEY_ZERO) == 0) && ((keyAction & KeyMask.MASK_KEY_ZERO_FLAG) == 0))) {
keyAction |= KeyMask.MASK_KEY_ZERO | KeyMask.MASK_KEY_ZERO_FLAG;
isShowMap=!isShowMap;
keyAction &= ~KeyMask.MASK_KEY_ZERO_FLAG;
}
break;
case Canvas.KEY_NUM1:
if ((((keyAction & KeyMask.MASK_KEY_STATE) == 0) && ((keyAction & KeyMask.MASK_KEY_STATE_FLAG) == 0))) {
keyAction |= KeyMask.MASK_KEY_STATE | KeyMask.MASK_KEY_STATE_FLAG;
if(spriteState==TANK&&isJumpOver){
gm.lgr.staticTankSprite.init(this);
tanePow=16;
spriteState=TANE;
}else if(spriteState==TANE){
if(x-gm.lgr.staticTankSprite.x<20&&x-gm.lgr.staticTankSprite.x>=0&&y-gm.lgr.staticTankSprite.y>0&&y-gm.lgr.staticTankSprite.y<20){
init(gm.lgr.staticTankSprite);
spriteState=TANK;
}
}
keyAction &= ~KeyMask.MASK_KEY_STATE_FLAG;
}
break;
case Canvas.KEY_NUM2:
keyAction|=KeyMask.MASK_KEY_UP;
break;
case Canvas.KEY_NUM3:
if ((((keyAction & KeyMask.MASK_KEY_CONTORL) == 0) && ((keyAction & KeyMask.MASK_KEY_CONTORL_FLAG) == 0))) {
keyAction |= KeyMask.MASK_KEY_CONTORL | KeyMask.MASK_KEY_CONTORL_FLAG;
GameManage.gameState=GameManage.GMAESTATE_CONTROL;
keyAction &= ~KeyMask.MASK_KEY_CONTORL_FLAG;
}
break;
case Canvas.KEY_NUM4:
keyAction |= KeyMask.MASK_KEY_LEFT;
break;
case Canvas.KEY_NUM6:
keyAction |= KeyMask.MASK_KEY_RIGHT;
break;
case Canvas.KEY_NUM8:
keyAction |= KeyMask.MASK_KEY_DOWN;
break;
case Canvas.KEY_NUM5:
break;
case Canvas.KEY_NUM7:
case Canvas.KEY_NUM9:
if ((((keyAction & KeyMask.MASK_KEY_FIRE) == 0) && ((keyAction & KeyMask.MASK_KEY_FIRE_FLAG) == 0))) {
keyAction |= KeyMask.MASK_KEY_FIRE | KeyMask.MASK_KEY_FIRE_FLAG;
}
break;
case Canvas.KEY_POUND:
case Canvas.KEY_STAR:
if(((keyAction & KeyMask.MASK_KEY_JUMP)==0)&&((keyAction & KeyMask.MASK_KEY_JUMP_FLAG)==0)){
keyAction |= KeyMask.MASK_KEY_JUMP | KeyMask.MASK_KEY_JUMP_FLAG;
jump();
}
break;
}
break;
}
}
//释放按键处理
public void freeKey(int keyCode, int gameKeyCode) {
switch (gameKeyCode) {
case Canvas.FIRE:
keyAction &= ~KeyMask.MASK_KEY_FIRE;
break;
case Canvas.UP:
keyAction &= ~KeyMask.MASK_KEY_UP;
drop();
break;
case Canvas.DOWN:
keyAction &= ~KeyMask.MASK_KEY_DOWN;
break;
case Canvas.LEFT:
keyAction &= ~KeyMask.MASK_KEY_LEFT;
break;
case Canvas.RIGHT:
keyAction &= ~KeyMask.MASK_KEY_RIGHT;
break;
default:
switch (keyCode) {
case Canvas.KEY_NUM0:
keyAction &= ~KeyMask.MASK_KEY_ZERO;
break;
case Canvas.KEY_NUM1:
keyAction &= ~KeyMask.MASK_KEY_STATE;
break;
case Canvas.KEY_NUM3:
keyAction &= ~KeyMask.MASK_KEY_CONTORL;
break;
case Canvas.KEY_NUM4: // left
keyAction &= ~KeyMask.MASK_KEY_LEFT;
break;
case Canvas.KEY_NUM6:
keyAction &= ~KeyMask.MASK_KEY_RIGHT; // right
break;
case Canvas.KEY_NUM2:
keyAction &= ~KeyMask.MASK_KEY_UP; // jump
drop();
break;
case Canvas.KEY_NUM8:
keyAction &= ~KeyMask.MASK_KEY_DOWN;
break;
case Canvas.KEY_NUM5:
break;
case Canvas.KEY_NUM7:
case Canvas.KEY_NUM9:
keyAction &= ~KeyMask.MASK_KEY_FIRE;
break;
case Canvas.KEY_POUND:
case Canvas.KEY_STAR:
keyAction &= ~KeyMask.MASK_KEY_JUMP;
break;
}
break;
}
}
public void reInit(){
tankPow=16;
tanePow=16;
kaneGun=0;
}
//读档
public void readData(DataInputStream dis) throws java.io.IOException{
super.readData(dis);
spriteState=dis.readChar();
direction=dis.readChar();
frameCnt=dis.readInt();
tankPow=dis.readInt();
tanePow=dis.readInt();
tankHov=dis.readInt();
kaneGun=dis.readInt();
tankMissile=dis.readInt();
tankHball=dis.readInt();
tankBolt=dis.readInt();
oddFacePow=dis.readInt();
Maps.x=dis.readInt();
Maps.y=dis.readInt();
isBoss=dis.readBoolean();
isShowMap=dis.readBoolean();
isBossOver=dis.readBoolean();
haveData=dis.readBoolean();
HYPER_BEAM=dis.readBoolean();
CRUSHER_BEAM=dis.readBoolean();
HOVER_BEAM=dis.readBoolean();
KEY_BEAM=dis.readBoolean();
DIVE_BEAM=dis.readBoolean();
WALL1_BEAM=dis.readBoolean();
WALL2_BEAM=dis.readBoolean();
System.out.println("Tank 读档");
}
//存档
public void writeData(DataOutputStream dos) throws java.io.IOException{
super.writeData(dos);
dos.writeChar(spriteState);
dos.writeChar(direction);
dos.writeInt(frameCnt);
dos.writeInt(tankPow);
dos.writeInt(tanePow);
dos.writeInt(tankHov);
dos.writeInt(kaneGun);
dos.writeInt(tankMissile);
dos.writeInt(tankHball);
dos.writeInt(tankBolt);
dos.writeInt(oddFacePow);
dos.writeInt(Maps.x);
dos.writeInt(Maps.y);
dos.writeBoolean(isBoss);
dos.writeBoolean(isShowMap);
dos.writeBoolean(isBossOver);
dos.writeBoolean(haveData);
dos.writeBoolean(HYPER_BEAM);
dos.writeBoolean(CRUSHER_BEAM);
dos.writeBoolean(HOVER_BEAM);
dos.writeBoolean(KEY_BEAM);
dos.writeBoolean(DIVE_BEAM);
dos.writeBoolean(WALL1_BEAM);
dos.writeBoolean(WALL2_BEAM);
System.out.println("Tank 存档");
}
}
class StaticTankSprite extends FSprite{
private int tempX;
private int tempY;
public int wheelRise; //车轮的高度
public int leftFrameCnt; //左轮
public int rightFrameCnt; //右轮
public boolean isLeft;
public StaticTankSprite() {
}
public void init(TankSprite tankSprite){
this.x=tankSprite.x;
this.y=tankSprite.y;
this.leftFrameCnt=tankSprite.leftFrameCnt;
this.rightFrameCnt=tankSprite.rightFrameCnt;
isHidden=false;
this.isLeft=tankSprite.isLeft;
if(tankSprite.isLeft){
frameCnt=8;
}else{
frameCnt=9;
}
this.wheelRise=tankSprite.wheelRise;
tempX=tankSprite.x+Maps.x;
tempY=tankSprite.y+Maps.y;
}
public void action(){
}
public void setPot(int mapX,int mapY){
this.x=tempX-mapX;
this.y=tempY-mapY;
}
//读档
public void readData(DataInputStream dis) throws java.io.IOException{
x=dis.readInt();
y=dis.readInt();
tempX=dis.readInt();
tempY=dis.readInt();
isHidden=dis.readBoolean();
isLeft=dis.readBoolean();
leftFrameCnt=dis.readInt();
rightFrameCnt=dis.readInt();
frameCnt=dis.readInt();
wheelRise=dis.readInt();
}
//存档
public void writeData(DataOutputStream dos) throws java.io.IOException{
dos.writeInt(x);
dos.writeInt(y);
dos.writeInt(tempX);
dos.writeInt(tempY);
dos.writeBoolean(isHidden);
dos.writeBoolean(isLeft);
dos.writeInt(leftFrameCnt);
dos.writeInt(rightFrameCnt);
dos.writeInt(frameCnt);
dos.writeInt(wheelRise);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -