📄 cpc.java
字号:
return flag;
}
public boolean isCollosionAnything(int ax, int ay) {
boolean flag = false;
boolean[] br = getCollosionWithMap(ax, ay);
if (br[0] || br[1] || br[2] || br[3]) {
flag = true;
}
if (flag) {
return flag;
} else {
// CPC
for (int i = 0; i < MyGameCanvas.vecticUnits.size(); i++) {
CPC cpc = (CPC) MyGameCanvas.vecticUnits.elementAt(i);
if (cpc.bVar == B_VAR_MAGIC_CPC_FIRE
|| cpc.bVar == B_VAR_MAGIC_CPC_FIRE_BALL
|| cpc.bVar == B_VAR_MAGIC_CPC_FIRE) {
continue;
}
int r1x1 = cpc.nX;
int r1y1 = cpc.nY;
int r1x2 = cpc.nX + 16;
int r1y2 = cpc.nY + 16;
if (bVar == B_VAR_BOSS_UFO) {
r1x1 = cpc.nX + 4;
r1y1 = cpc.nY + 4;
r1x2 = cpc.nX + 24;
r1y2 = cpc.nY + 24;
}
if (bVar == B_VAR_MAGIC_LISA_FIRE) {
int r2x1 = ax;
int r2y1 = ay;
int r2x2 = ax + 8;
int r2y2 = ay + 8;
if (cpc.equals(this)) {
// 不和自己比较:)
} else {
if (MyGameCanvas.isIntersectRect(r1x1, r1y1, r1x2,
r1y2, r2x1, r2y1, r2x2, r2y2)) {
switch (cpc.bVar) {
case B_VAR_BOX:
case B_VAR_NPC:
case B_VAR_DOOR:
case B_VAR_SAVING:
case B_VAR_ZHEN: {
if (cpc.bVar == B_VAR_ZHEN) {
if (bBossState == 2) {
flag = true;
}
} else {
flag = true;
}
}
break;
default: {
// cpc.nHP -= nAttackPower; //
// nHP = 0;
// flag = true;
// // 通知那个人睡眠,自己不睡眠
// cpc.setSleep(i << 1);
// nHP = 0;
flag = false;
}
break;
}
}
}
} else if (bVar == B_VAR_MAGIC_CPC_FIRE
|| bVar == B_VAR_MAGIC_CPC_FIRE_BALL) {
int r2x1 = ax;
int r2y1 = ay;
int r2x2 = ax + 8;
int r2y2 = ay + 8;
if (cpc.equals(this)) {
// 不和自己比较:)
} else {
if (MyGameCanvas.isIntersectRect(r1x1, r1y1, r1x2,
r1y2, r2x1, r2y1, r2x2, r2y2)) {
switch (cpc.bVar) {
case B_VAR_BOX:
case B_VAR_NPC:
case B_VAR_DOOR:
case B_VAR_SAVING: {
nHP = 0;
flag = true;
}
break;
}
}
}
} else {
int r2x1 = ax;
int r2y1 = ay;
int r2x2 = ax + 16;
int r2y2 = ay + 16;
if (cpc.equals(this)) {
// 不和自己比较:)
} else {
if (MyGameCanvas.isIntersectRect(r1x1, r1y1, r1x2,
r1y2, r2x1, r2y1, r2x2, r2y2)) {
flag = false;
switch (cpc.bVar) {
case B_VAR_BOX:
case B_VAR_NPC:
case B_VAR_DOOR:
case B_VAR_SAVING:
case B_VAR_ZHEN: {
if (cpc.bVar == CPC.B_VAR_ZHEN) {
if (bBossState == 2) {
flag = true;
}
} else {
flag = true;
}
}
break;
}
// 通知那个人睡眠,自己不睡眠
// cpc.setSleep(i << 1);
}
}
}
}
if (flag) {
return flag;
} else {
int r1x1 = MyGameCanvas.instance.npcLisa.nX + 2;
int r1y1 = MyGameCanvas.instance.npcLisa.nY + 2;
int r1x2 = r1x1 + 16 - 4;
int r1y2 = r1y1 + 16 - 4;
if (bVar == B_VAR_MAGIC_LISA_FIRE) {
//
} else if (bVar == B_VAR_MAGIC_CPC_FIRE
|| bVar == B_VAR_MAGIC_CPC_FIRE_BALL) {
int r2x1 = ax;
int r2y1 = ay;
int r2x2 = ax + 8;
int r2y2 = ay + 9;
if (MyGameCanvas.isIntersectRect(r1x1, r1y1, r1x2, r1y2,
r2x1, r2y1, r2x2, r2y2)) {
MyGameCanvas.instance.npcLisa.delHp(-1);
nHP = 0;
// NPC
flag = true;
}
} else {
int r2x1 = ax;
int r2y1 = ay;
int r2x2 = ax + 16;
int r2y2 = ay + 16;
if (MyGameCanvas.isIntersectRect(r1x1, r1y1, r1x2, r1y2,
r2x1, r2y1, r2x2, r2y2)) {
// NPC
if (bVar == B_VAR_BOSS_SIMPLY
|| bVar == B_VAR_BOSS_SNAKE
|| bVar == B_VAR_BOSS_UFO || bVar == B_VAR_OGRE
|| bVar == B_VAR_OGRE || bVar == B_VAR_WORM) {
MyGameCanvas.instance.npcLisa.delHp(-1);
} else if (bVar == B_VAR_ZHEN) {
if (bBossState == 2) {
MyGameCanvas.instance.npcLisa.delHp(-1);
}
}
flag = false;
}
}
return flag;
}
}
}
//
public boolean[] getDirCanGo(int x, int y) {
boolean flags[] = new boolean[4];
int t_x = 0;
int t_y = 0;
// up
t_x = x;
t_y = y - nSpeed;
if (isCollosionAnything(t_x, t_y)) {
flags[0] = false; // 不能走
} else {
flags[0] = true; // 能走
}
// down
t_x = x;
t_y = y + nSpeed;
if (isCollosionAnything(t_x, t_y)) {
flags[1] = false; // 不能走
} else {
flags[1] = true; // 能走
}
// left
t_x = x - nSpeed;
t_y = y;
if (isCollosionAnything(t_x, t_y)) {
flags[2] = false; // 不能走
} else {
flags[2] = true; // 能走
}
// right
t_x = nX + nSpeed;
t_y = nY;
if (isCollosionAnything(t_x, t_y)) {
flags[3] = false; // 不能走
} else {
flags[3] = true; // 能走
}
return flags;
}
//
public boolean[] getCollosionWithMap(int ax, int ay) {
boolean[] flags = new boolean[4];
int tx[] = new int[4];
int ty[] = new int[4];
for (int i = 0; i < flags.length; i++) {
flags[i] = false;
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < nRectCollosion[i].length; j++) {
boolean flag = false;
int t_x0 = nRectCollosion[i][j][0] + ax;
int t_y0 = nRectCollosion[i][j][1] + ay;
int t_x1 = nRectCollosion[i][j][2] + ax;
int t_y1 = nRectCollosion[i][j][3] + ay;
tx[0] = t_x0 + 1;
ty[0] = t_y0 + 1;
tx[1] = t_x1 - 1;
ty[1] = t_y0 + 1;
tx[2] = t_x0 + 1;
ty[2] = t_y1 - 1;
tx[3] = t_x1 - 1;
ty[3] = t_y1 - 1;
for (int m = 0; m < 4; m++) {
int tempx = tx[m] / Consts.SN_TILE_WIDTH;
int tempy = ty[m] / Consts.SN_TILE_HEIGHT;
if (!MyGameCanvas.isXYInTiles(tempx, tempy,
MyGameCanvas.snsTiles)) {
flags[i] = true;
flag = true;
break;
} else {
byte block_val = Consts
.getTileVar((short) MyGameCanvas.snsTiles[tempy][tempx]);
if (Consts.SB_TILE_NULL != block_val) {
flags[i] = true;
flag = true;
break;
}
}
}
if (flag) {
break;
}
}
}
return flags;
}
public void setSleep(int seed) {
nSleepTime = MyGameCanvas.instance.getRandomInt(1, N_SLEEP_TIME, seed);
}
public void initAbsXY(int x, int y) {
nX = x;
nY = y;
xCalc = x * 10;
yCalc = y * 10;
}
public void setBoom() {
// Consts.log("setBoom()");
nTimer = 0;
bBombState = B_BOMB_STATE_BOMBING;
nHP = 0;
//
// 计算
int tx = nX / Consts.SN_TILE_WIDTH;
int ty = nY / Consts.SN_TILE_HEIGHT;
// up down
if (tx > 0 && tx < MyGameCanvas.snTilesWidthNum - 1) {
int t_var = ty;
while (t_var > 0) {
t_var--;
byte key = getMapsPre(tx, t_var);
if (key == (byte) 0) {
nAttackByBombTileNumUp++;
} else if (key == 2 || key == 3) {
nAttackByBombTileNumUp++;
break;
} else {
break;
}
if (nAttackByBombTileNumUp >= nPower) {
break;
}
}
t_var = ty;
while (t_var < MyGameCanvas.snTilesHeightNum - 1) {
t_var++;
byte key = getMapsPre(tx, t_var);
if (key == 0) {
nAttackByBombTileNumDown++;
} else if (key == 2 || key == 3) {
nAttackByBombTileNumDown++;
break;
} else {
break;
}
if (nAttackByBombTileNumDown >= nPower) {
break;
}
}
}
// left right
if (ty > 0 && ty < MyGameCanvas.snTilesHeightNum - 1) {
int t_var = tx;
while (t_var > 0) {
t_var--;
byte key = getMapsPre(t_var, ty);
if (key == 0) {
nAttackByBombTileNumLeft++;
} else if (key == 2 || key == 3) {
nAttackByBombTileNumLeft++;
break;
} else {
break;
}
if (nAttackByBombTileNumLeft >= nPower) {
break;
}
}
t_var = tx;
while (t_var < MyGameCanvas.snTilesWidthNum - 1) {
t_var++;
byte key = getMapsPre(t_var, ty);
if (key == 0) {
nAttackByBombTileNumRight++;
} else if (key == 2 || key == 3) {
nAttackByBombTileNumRight++;
break;
} else {
break;
}
if (nAttackByBombTileNumRight >= nPower) {
break;
}
}
}
//
// Consts.log("nAttackByBombTileNumLeft " + nAttackByBombTileNumLeft);
// 放置火焰
MyGameCanvas.instance.addFires(tx, ty);
// up
for (int m = 1; m <= nAttackByBombTileNumUp; m++) {
MyGameCanvas.instance.addFires(tx, ty - m);
}
// down
for (int m = 1; m <= nAttackByBombTileNumDown; m++) {
MyGameCanvas.instance.addFires(tx, ty + m);
}
// left
for (int m = 1; m <= nAttackByBombTileNumLeft; m++) {
MyGameCanvas.instance.addFires(tx - m, ty);
}
// right
for (int m = 1; m <= nAttackByBombTileNumRight; m++) {
MyGameCanvas.instance.addFires(tx + m, ty);
}
// 引爆周围的炸弹
if (MyGameCanvas.instance.vecticUnits != null) {
int size = MyGameCanvas.instance.vecticUnits.size();
//
for (int i = 0; i < size; i++) {
CPC cpc = (CPC) MyGameCanvas.instance.vecticUnits.elementAt(i);
if (cpc.bVar == B_VAR_BOMB) {
if (!cpc.equals(this)) {
if (cpc.bBombState == B_BOMB_STATE_STATIC) {
// up
for (int m = 1; m <= nAttackByBombTileNumUp; m++) {
if (tx == cpc.nX / Consts.SN_TILE_WIDTH
&& ty - m == cpc.nY
/ Consts.SN_TILE_HEIGHT) {
cpc.setBoom();
}
}
// down
for (int m = 1; m <= nAttackByBombTileNumDown; m++) {
if (tx == cpc.nX / Consts.SN_TILE_WIDTH
&& ty + m == cpc.nY
/ Consts.SN_TILE_HEIGHT) {
cpc.setBoom();
}
}
// left
for (int m = 1; m <= nAttackByBombTileNumLeft; m++) {
if (tx - m == cpc.nX / Consts.SN_TILE_WIDTH
&& ty == cpc.nY / Consts.SN_TILE_HEIGHT) {
cpc.setBoom();
}
}
// right
for (int m = 1; m <= nAttackByBombTileNumRight; m++) {
if (tx + m == cpc.nX / Consts.SN_TILE_WIDTH
&& ty == cpc.nY / Consts.SN_TILE_HEIGHT) {
cpc.setBoom();
}
}
}
}
}
}
}
//
}
public boolean isTileXYNull(int x, int y) {
if (x < 0 || x >= MyGameCanvas.snTilesWidthNum || y < 0
|| y >= MyGameCanvas.snTilesHeightNum) {
return false;
}
boolean isFlag = true;
if (Consts.getTileVar(MyGameCanvas.snsTiles[y][x]) != Consts.SB_TILE_NULL) {
isFlag = false;
}
if (isFlag) {
int r1x1 = x * Consts.SN_TILE_WIDTH;
int r1y1 = y * Consts.SN_TILE_HEIGHT;
int r1x2 = r1x1 + Consts.SN_TILE_WIDTH;
int r1y2 = r1y1 + Consts.SN_TILE_HEIGHT;
for (int i = 0; i < MyGameCanvas.instance.vecticUnits.size(); i++) {
CPC cpc = (CPC) MyGameCanvas.instance.vecticUnits.elementAt(i);
if (cpc.bVar == CPC.B_VAR_BOX || (cpc.bVar == CPC.B_VAR_ZHEN)) {
if (cpc.bVar == B_VAR_ZHEN) {
if (bBossState != 2) {
continue;
}
}
int r2x1 = cpc.nX;
int r2y1 = cpc.nY;
int r2x2 = cpc.nX + Consts.SN_TILE_WIDTH;
int r2y2 = cpc.nY + Consts.SN_TILE_HEIGHT;
if (MyGameCanvas.isIntersectRect(r1x1, r1y1, r1x2, r1y2,
r2x1, r2y1, r2x2, r2y2)) {
return false;
}
}
}
}
return isFlag;
}
public boolean isTilesNullForSnake(int x, int y) {
try {
if (Consts.getTileVar(MyGameCanvas.snsTiles[y][x]) == Consts.SB_TILE_NULL) {
return true;
}
} catch (Exception ex) {
}
return false;
}
public byte getMapsPre(int x, int y) {
// 0 -> 可以通行 1 -> 地图不能行走, 2 -> 有物体 3 -> 地图为可以爆炸的砖块
if (x < 0 || x >= MyGameCanvas.snTilesWidthNum || y < 0
|| y >= MyGameCanvas.snTilesHeightNum) {
return (byte) 1;
}
boolean isFlag = true;
if (Consts.getTileVar(MyGameCanvas.snsTiles[y][x]) != Consts.SB_TILE_NULL) {
if (Consts.getTileVar(MyGameCanvas.snsTiles[y][x]) == Consts.SB_TILE_BRICK) {
return (byte) 3;
}
return (byte) 1;
}
if (isFlag) {
int r1x1 = x * Consts.SN_TILE_WIDTH;
int r1y1 = y * Consts.SN_TILE_HEIGHT;
int r1x2 = r1x1 + Consts.SN_TILE_WIDTH;
int r1y2 = r1y1 + Consts.SN_TILE_HEIGHT;
for (int i = 0; i < MyGameCanvas.instance.vecticUnits.size(); i++) {
CPC cpc = (CPC) MyGameCanvas.instance.vecticUnits.elementAt(i);
if (cpc.bVar == CPC.B_VAR_SAVING || cpc.bVar == CPC.B_VAR_BOX
|| cpc.bVar == CPC.B_VAR_BOSS_SIMPLY
|| cpc.bVar == CPC.B_VAR_BOSS_SNAKE) {
int r2x1 = cpc.nX;
int r2y1 = cpc.nY;
int r2x2 = cpc.nX + Consts.SN_TILE_WIDTH;
int r2y2 = cpc.nY + Consts.SN_TILE_HEIGHT;
if (MyGameCanvas.isIntersectRect(r1x1, r1y1, r1x2, r1y2,
r2x1, r2y1, r2x2, r2y2)) {
return (byte) 2;
}
}
}
// lisa
int r2x1 = MyGameCanvas.instance.npcLisa.nX;
int r2y1 = MyGameCanvas.instance.npcLisa.nY;
int r2x2 = r2x1 + Consts.SN_TILE_WIDTH;
int r2y2 = r2y1 + Consts.SN_TILE_HEIGHT;
if (MyGameCanvas.isIntersectRect(r1x1, r1y1, r1x2, r1y2, r2x1,
r2y1, r2x2, r2y2)) {
return (byte) 2;
}
}
return (byte) 0;
}
public boolean isCanOGREMOVETO(int x, int y) {
for (int i = 0; i < MyGameCanvas.instance.vecticUnits.size(); i++) {
CPC cpc = (CPC) MyGameCanvas.instance.vecticUnits.elementAt(i);
if (cpc.bVar == CPC.B_VAR_BOMB || cpc.bVar == CPC.B_VAR_BOX
|| cpc.bVar == CPC.B_VAR_DOOR || cpc.bVar == CPC.B_VAR_NPC
|| cpc.bVar == CPC.B_VAR_RABIT
|| cpc.bVar == CPC.B_VAR_SAVING) {
if (cpc.nX / Consts.SN_TILE_WIDTH == x
&& cpc.nY / Consts.SN_TILE_HEIGHT == y) {
return false;
}
}
}
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -