📄 enemy.java
字号:
import javax.microedition.lcdui.*;
import java.util.Random;
class Enemy
{
private static Graphics g = null;
private static Random myrandom = new Random();
public boolean alive;
public int posX, posY;
public int direction;
private int speed;
private int sp;
public boolean shootFlag;
public int bulletNo, bulletCnt;
private int bulletLevel;
private Image imgCurrentDraw;
private Image imgEnemyLeft;
private Image imgEnemyRight;
private Image imgEnemyUp;
private Image imgEnemyDown;
public int frameWidth, frameHeight;
public boolean ifTimer;
public int kind;
public int lifeCount = 0;
public int bulletCount;
private boolean grassPaint = false;
private TankCanvas canvas;
public Enemy(TankCanvas canvas, int kind)
{
this.canvas = canvas;
this.kind = kind;
ifTimer = false;
shootFlag = false;
bulletLevel = 0;
direction = 0x14;
frameWidth = EnemyPool.frameWidth;
frameHeight = EnemyPool.frameHeight;
speed = canvas.tileW / 2;
sp = speed;
shootFlag = false;
bulletCount = 50;
direction = 0x14;
switch (kind)
{
case 0:
imgEnemyLeft = EnemyPool.enemyLeftNormal;
imgEnemyRight = EnemyPool.enemyRightNormal;
imgEnemyUp = EnemyPool.enemyUpNormal;
imgEnemyDown = EnemyPool.enemyDownNormal;
break;
case 1:
//red tanker
bulletCount = 25;
imgEnemyLeft = EnemyPool.enemyLeftRed;
imgEnemyRight = EnemyPool.enemyRightRed;
imgEnemyUp = EnemyPool.enemyUpRed;
imgEnemyDown = EnemyPool.enemyDownRed;
break;
case 2:
lifeCount = 3;
imgEnemyLeft = EnemyPool.enemyLeftGreen;
imgEnemyRight = EnemyPool.enemyRightGreen;
imgEnemyUp = EnemyPool.enemyUpGreen;
imgEnemyDown = EnemyPool.enemyDownGreen;
break;
case 3:
bulletCount = 15;
imgEnemyLeft = EnemyPool.enemyLeftNormal;
imgEnemyRight = EnemyPool.enemyRightNormal;
imgEnemyUp = EnemyPool.enemyUpNormal;
imgEnemyDown = EnemyPool.enemyDownNormal;
break;
default:
break;
}
imgCurrentDraw = imgEnemyDown;
}
synchronized void paint(Graphics g)
{
int fillposX = posX;
int fillposY = posY;
int fillwidth, fillheigh;
int i;
fillwidth = frameWidth;
fillheigh = frameHeight;
if (!ifTimer)
{
if (!shootFlag && ((myrandom.nextInt() & 2) == 0) && (bulletCnt == 0))
{
shootFlag = true;
i = 0;
for (i = 1; i < canvas.maxBullet; i++)
{
if (canvas.bulletAlive[i] == false)
break;
}
if ((i > 0) && (i < canvas.maxBullet))
{
bulletCnt = bulletCount;
bulletNo = i;
canvas.fireBullet(bulletNo, direction, posX, posY, 3);
}
}
}
if (bulletCnt > 0)
bulletCnt--;
grassPaint = false;
if (isMapCollide())
direction = tankAI();
g.setColor(0x0);
if (ifTimer)
{
speed = 0;
}
else
{
speed = sp;
}
switch (direction & 0x0f)
{
case 1:
if ((posX > canvas.mapOffsetX) && !isMapCollide())
{
posX -= speed;
fillposX = posX + frameWidth;
fillposY = posY;
fillwidth = speed;
fillheigh = frameHeight;
}
break;
case 2:
if ((posX < (canvas.mapOffsetX + canvas.mapWidth - frameWidth)) && !isMapCollide())
{
posX += speed;
fillposX = posX - speed;
fillposY = posY;
fillwidth = speed;
fillheigh = frameHeight;
}
break;
case 3:
if ((posY > canvas.mapOffsetY) && !isMapCollide())
{
posY -= speed;
fillposX = posX;
fillposY = posY + frameHeight;
fillwidth = frameWidth;
fillheigh = speed;
}
break;
case 4:
if ((posY < (canvas.mapOffsetY + canvas.mapHeight - frameHeight)) && !isMapCollide())
{
posY += speed;
fillposX = posX;
fillposY = posY - speed;
fillwidth = frameWidth;
fillheigh = speed;
}
default:
break;
}
g.fillRect(fillposX, fillposY, fillwidth, fillheigh);
switch (direction & 0x0f)
{
case 1:
g.drawImage(imgEnemyLeft, posX, posY, g.TOP | g.LEFT);
break;
case 2:
g.drawImage(imgEnemyRight, posX, posY, g.TOP | g.LEFT);
break;
case 3:
g.drawImage(imgEnemyUp, posX, posY, g.TOP | g.LEFT);
break;
case 4:
g.drawImage(imgEnemyDown, posX, posY, g.TOP | g.LEFT);
default:
break;
}
if (grassPaint)
{
canvas.grassPaint = true;
}
}
boolean isMapCollide()
{
boolean collFlag = false;
int collX, collY;
int i;
int tileW = canvas.tileW;
collX = posX - canvas.mapOffsetX;
collY = posY - canvas.mapOffsetY;
switch (direction & 0x0f)
{
case 1:
collX = collX - speed;
if (collX <= 0)
collFlag = true;
else
{
collFlag = false;
for (i = (collY / tileW * (canvas.mapWidth / tileW) + collX / tileW); i <= ((collY + frameHeight) / tileW * (canvas.mapWidth / tileW) + collX / tileW); i += (canvas.mapWidth / tileW))
{
if (canvas.mapInfo[i] == 3)
{
grassPaint = true;
}
if (canvas.mapInfo[i] != 0 && canvas.mapInfo[i] != 3)
{
collFlag = true;
break;
}
}
}
break;
case 2:
collX = collX + frameWidth + speed;
if (collX >= canvas.mapWidth)
collFlag = true;
else
{
collFlag = false;
for (i = (collY / tileW * (canvas.mapWidth / tileW) + collX / tileW); i <= ((collY + frameHeight) / tileW * (canvas.mapWidth / tileW) + collX / tileW); i += (canvas.mapWidth / tileW))
{
if (canvas.mapInfo[i] == 3)
{
grassPaint = true;
}
if (canvas.mapInfo[i] != 0 && canvas.mapInfo[i] != 3)
{
collFlag = true;
break;
}
}
}
break;
case 3:
collY = collY - speed;
if (collY <= 0)
collFlag = true;
else
{
collFlag = false;
for (i = (collY / tileW * (canvas.mapWidth / tileW) + collX / tileW); i <= (collY / tileW * (canvas.mapWidth / tileW) + (collX + frameWidth) / tileW); i++)
{
if (canvas.mapInfo[i] == 3)
{
grassPaint = true;
}
if (canvas.mapInfo[i] != 0 && canvas.mapInfo[i] != 3)
{
collFlag = true;
break;
}
}
}
break;
case 4:
collY = collY + frameHeight + speed;
if (collY >= canvas.mapHeight)
collFlag = true;
else
{
collFlag = false;
for (i = (collY / tileW * (canvas.mapWidth / tileW) + collX / tileW); i <= (collY / tileW * (canvas.mapWidth / tileW) + (collX + frameWidth) / tileW); i++)
{
if (canvas.mapInfo[i] == 3)
{
grassPaint = true;
}
if (canvas.mapInfo[i] != 0 && canvas.mapInfo[i] != 3)
{
collFlag = true;
break;
}
}
}
break;
default:
break;
}
return collFlag;
}
boolean isObjCollide(int objX, int objY)
{
boolean collFlag = false;
int collX, collY;
int i;
collX = posX;
collY = posY;
switch (direction & 0x0f)
{
case 1:
collX = collX - speed;
break;
case 2:
collX = collX + speed;
break;
case 3:
collY = collY - speed;
break;
case 4:
collY = collY + speed;
default:
break;
}
if (collX < (objX + frameWidth) && (collX + frameWidth) > objX && collY < (objY + frameHeight) && (collY + frameHeight) > objY)
collFlag = true;
return collFlag;
}
int tankAI()
{
int direction_bak;
direction_bak = direction;
if ((direction & 0x0f) == 4 | (direction & 0x0f) == 3)
{
if ((myrandom.nextInt() & 1) == 0)
{
direction = 1;
if (!isMapCollide())
return direction | 0x10;
direction = 2;
if (!isMapCollide())
return direction | 0x10;
}
else
{
direction = 2;
if (!isMapCollide())
return direction | 0x10;
direction = 1;
if (!isMapCollide())
return direction | 0x10;
}
if ((direction_bak & 0x0f) == 3)
{
direction = 4;
if (!isMapCollide())
return direction | 0x10;
}
else
{
direction = 3;
if (!isMapCollide())
return direction | 0x10;
}
}
if ((direction & 0x0f) == 2 | (direction & 0x0f) == 1)
{
if ((myrandom.nextInt() & 1) == 0)
{
direction = 4;
if (!isMapCollide())
return direction | 0x10;
direction = 3;
if (!isMapCollide())
return direction | 0x10;
}
else
{
direction = 3;
if (!isMapCollide())
return direction | 0x10;
direction = 4;
if (!isMapCollide())
return direction | 0x10;
}
if ((direction_bak & 0x0f) == 1)
{
direction = 2;
if (!isMapCollide())
return direction | 0x10;
}
else
{
direction = 1;
if (!isMapCollide())
return direction | 0x10;
}
}
return direction_bak;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -