📄 maincanvas.java
字号:
}
SetViewWindow();
break;
case GAME_BUTTON: //游戏中途显示按钮
{
switch (m_UI.Input(keyStates)) {
case MyButton.BUTTON_RESET: //按下复位键
Reset();
setState(GAME_GAMING);
break;
case MyButton.BUTTON_EXIT: //按下退出键
TankMidlet.midlet.notifyDestroyed();
break;
}
}
break;
case GAME_END:
break;
}
}
public void Logic() {
switch (m_nState) {
case GAME_GAMING:
//爆炸逻辑
for (int m = 0; m < m_aExplosion.length; m++) {
m_aExplosion[m].Logic();
}
//坦克逻辑
m_Tank1.Logic();
//副坦克的子弹发射,无比重要
if (mode != 0) {
m_Tank2.Logic();
}
//敌方坦克的运行在此
for (int n = 0; n < m_eTank.length; n++) {
if (mode == 0) {
m_eTank[n].Logic();
} else if (mode == 1) {
m_eTank[n].Logic(this, n);
} else {
break;
}
}
//碰撞检测
CheckCollision();
//产生新的敌方坦克
CreateETank();
break;
}
}
public void Paint() {
Graphics g = getGraphics();
//用黑色清屏
g.setColor(0);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0xFFFF0000);
switch (m_nState) {
case GAME_UI: //显示界面
m_UI.Paint(g, getWidth(), getHeight());
break;
case GAME_GAMING: //显示游戏画面
case GAME_BUTTON:
case GAME_END:
m_LayerManager.paint(g, 0, 0);
if (m_nState == GAME_END) {
m_TextSp.paint(g);
}
m_UI.Paint(g, getWidth(), getHeight());
break;
}
flushGraphics();
}
//碰撞检测
private void CheckCollision() {
BulletSprite mB1 = m_Tank1.m_Bullet;
BulletSprite mEB = null;
for (int n = 0; n < m_eTank.length; n++) {
mEB = m_eTank[n].m_Bullet;
//敌人子弹和我方坦克碰撞
if (mEB.collidesWith(m_Tank1, false)) {
mEB.setVisible(false);
m_Tank1.setVisible(false);
if (mode == 0) {
m_TextSp.setFrame(1);
setState(GAME_END);
break;
}
if (mode != 0) {
sendDeath(1);
if (!m_Tank2.isVisible()) {
m_TextSp.setFrame(1);
setState(GAME_END);
break;
}
}
}
if (mode != 0) {
if (mEB.collidesWith(m_Tank2, false)) {
mEB.setVisible(false);
m_Tank2.setVisible(false);
sendDeath(2);
if (!m_Tank1.isVisible()) {
m_TextSp.setFrame(1);
setState(GAME_END);
break;
}
}
}
//我方子弹和敌人坦克碰撞
if (mB1.collidesWith(m_eTank[n], false)) {
// CreateExplosion(mB1.getRefPixelX(), mB1.getRefPixelY());
mB1.setVisible(false);
m_eTank[n].setVisible(false);
if (mode != 0) {
sendDeath(7 + n);
}
m_nDestroyETank++;
if (m_nDestroyETank >= m_nTotalETank) {
//消灭的所有坦克,游戏胜利
if (mode != 0) {
sendDeath(6);
}
m_TextSp.setFrame(0);
setState(GAME_END);
return;
}
}
if (mode != 0) {
BulletSprite mB2;
mB2 = m_Tank2.m_Bullet;
if (mB2.collidesWith(m_eTank[n], false)) {
//CreateExplosion(mB2.getRefPixelX(), mB2.getRefPixelY());
mB2.setVisible(false);
m_eTank[n].setVisible(false);
if (mode != 0) {
sendDeath(7 + n);
}
m_nDestroyETank++;
if (m_nDestroyETank >= m_nTotalETank) {
//消灭的所有坦克,游戏胜利
sendDeath(6);
m_TextSp.setFrame(0);
setState(GAME_END);
return;
}
}
}
//我方坦克和敌人碰撞
if (m_Tank1.collidesWith(m_eTank[n], false)) {
//都向后退
m_Tank1.MoveBack();
m_eTank[n].MoveBack();
}
if (mode != 0) {
if (m_Tank2.collidesWith(m_eTank[n], false)) {
//都向后退
m_Tank2.MoveBack();
m_eTank[n].MoveBack();
}
}
//敌人和地图碰撞,敌人向后退
if (m_eTank[n].collidesWith(m_Scene.m_LyBulletPass, false)) {
m_eTank[n].MoveBack();
} else if (m_eTank[n].collidesWith(m_Scene.m_LyCanHit, false)) {
m_eTank[n].MoveBack();
} else if (m_eTank[n].collidesWith(m_Scene.m_LyNotPass, false)) {
m_eTank[n].MoveBack();
}
//敌人子弹与地图相撞
int nERow = mEB.GetCurRow();
int nECol = mEB.GetCurCol();
if (nERow < 0 || nERow >= m_Scene.m_LyCanHit.getRows() ||
nECol < 0 || nECol >= m_Scene.m_LyCanHit.getColumns()) {//子弹超出场景范围
mEB.setVisible(false);
continue;
}
if (mEB.collidesWith(m_Scene.m_LyHQ, false)) {//子弹打到司令部
m_Scene.m_LyHQ.setCell(nECol, nERow, 6);
// CreateExplosion(mEB.getRefPixelX(), mEB.getRefPixelY());
mEB.setVisible(false);
if (mode == 0) {
m_TextSp.setFrame(1);
setState(GAME_END);
return;
} else {
sendDeath(3);
//游戏失败
m_TextSp.setFrame(1);
setState(GAME_END);
return;
}
}
if (mEB.collidesWith(m_Scene.m_LyCanHit, false)) {//子弹打到可摧毁的区域
m_Scene.m_LyCanHit.setCell(nECol, nERow, 0);
//CreateExplosion(mEB.getRefPixelX(), mEB.getRefPixelY());
mEB.setVisible(false);
if (mode != 0) {
sendMapMessage(nECol, nERow);
}
} else if (mEB.collidesWith(m_Scene.m_LyNotPass, false)) {//子弹打到不可摧毁的区域
//CreateExplosion(mEB.getRefPixelX(), mEB.getRefPixelY());
mEB.setVisible(false);
}
// }
}
//我方坦克和地图碰撞,则向后退
if (m_Tank1.collidesWith(m_Scene.m_LyBulletPass, false)) {
m_Tank1.MoveBack();
} else if (m_Tank1.collidesWith(m_Scene.m_LyCanHit, false)) {
m_Tank1.MoveBack();
} else if (m_Tank1.collidesWith(m_Scene.m_LyNotPass, false)) {
m_Tank1.MoveBack();
}
if (mode != 0) {
if (m_Tank2.collidesWith(m_Scene.m_LyBulletPass, false)) {
m_Tank2.MoveBack();
} else if (m_Tank2.collidesWith(m_Scene.m_LyCanHit, false)) {
m_Tank2.MoveBack();
} else if (m_Tank2.collidesWith(m_Scene.m_LyNotPass, false)) {
m_Tank2.MoveBack();
}
}
//我方子弹与地图相撞
int nRow1 = mB1.GetCurRow();
int nCol1 = mB1.GetCurCol();
int nRow2;
int nCol2;
if (nRow1 < 0 || nRow1 >= m_Scene.m_LyCanHit.getRows() ||
nCol1 < 0 || nCol1 >= m_Scene.m_LyCanHit.getColumns()) {//子弹超出场景范围
mB1.setVisible(false);
return;
}
if (mode != 0) {
//我方子弹与地图相撞
BulletSprite mB2;
mB2 = m_Tank2.m_Bullet;
nRow2 = mB2.GetCurRow();
nCol2 = mB2.GetCurCol();
if (nRow2 < 0 || nRow2 >= m_Scene.m_LyCanHit.getRows() ||
nCol2 < 0 || nCol2 >= m_Scene.m_LyCanHit.getColumns()) {//子弹超出场景范围
mB2.setVisible(false);
return;
}
if (mB2.collidesWith(m_Scene.m_LyHQ, false)) {//子弹打到司令部
m_Scene.m_LyHQ.setCell(nCol2, nRow2, 6);
// CreateExplosion(mB2.getRefPixelX(), mB2.getRefPixelY());
//游戏失败
sendDeath(3);
m_TextSp.setFrame(1);
setState(GAME_END);
mB2.setVisible(false);
} else if (mB2.collidesWith(m_Scene.m_LyCanHit, false)) {//子弹打到可摧毁的区域
m_Scene.m_LyCanHit.setCell(nCol2, nRow2, 0);
//CreateExplosion(mB2.getRefPixelX(), mB2.getRefPixelY());
mB2.setVisible(false);
sendMapMessage(nCol2, nRow2);
} else if (mB2.collidesWith(m_Scene.m_LyNotPass, false)) {//子弹打到不可摧毁的区域
// CreateExplosion(mB2.getRefPixelX(), mB2.getRefPixelY());
mB2.setVisible(false);
}
}
if (mB1.collidesWith(m_Scene.m_LyHQ, false)) {//子弹打到司令部
m_Scene.m_LyHQ.setCell(nCol1, nRow1, 6);
// CreateExplosion(mB1.getRefPixelX(), mB1.getRefPixelY());
//游戏失败
m_TextSp.setFrame(1);
setState(GAME_END);
mB1.setVisible(false);
} else if (mB1.collidesWith(m_Scene.m_LyCanHit, false)) {//子弹打到可摧毁的区域
m_Scene.m_LyCanHit.setCell(nCol1, nRow1, 0);
// CreateExplosion(mB1.getRefPixelX(), mB1.getRefPixelY());
mB1.setVisible(false);
if (mode != 0) {
sendMapMessage(nCol1, nRow1);
}
} else if (mB1.collidesWith(m_Scene.m_LyNotPass, false)) {//子弹打到不可摧毁的区域
//CreateExplosion(mB1.getRefPixelX(), mB1.getRefPixelY());
mB1.setVisible(false);
}
}
//随机产生敌方坦克
public void CreateETank() {
if (m_nTotalETank <= 0) {
return;
}
//以20分之一的概率产生坦克
int nRs = m_Random.nextInt() % 20;
if (Math.abs(nRs) != 0) {
return;
}
//如果某一位置的坦克被摧毁,则可以产生新坦克
for (int n = 0; n < m_eTank.length; n++) {
if (m_eTank[n].isVisible()) {
continue;
}
//在这里修改过,不让客户端的敌人坦克显示出来
if (mode != 1) {
m_eTank[n].Start(n * 2 * 15 + 15 + 7, 15 + 7, 2, 1);
if (mode == 2) {
sendStartToServer(1);
}
}
break;
}
}
//产生爆炸,参数nX、nY分别是爆炸位置的横纵坐标
public void CreateExplosion(int nX, int nY) {
for (int m = 0; m < m_aExplosion.length; m++) {
if (m_aExplosion[m].isVisible()) {
continue;
}
m_aExplosion[m].Start(nX, nY);
break;
}
}
public void commandAction(Command c, Displayable s) {
if (c == restartCommand && m_nState == GAME_END) {
switch (mode) {
case 0:
Reset();
for (int n = 0; n < m_eTank.length; n++) {
m_eTank[n].Start(n * 2 * 15 + 15 + 7, 15 + 7, 2, 1);
}
setState(GAME_GAMING);
break;
case 2:
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
Reset();
for (int n = 0; n < m_eTank.length; n++) {
m_eTank[n].Start(n * 2 * 15 + 15 + 7, 15 + 7, 2, 1);
}
sendStartToServer(1);
setState(GAME_GAMING);
break;
}
}
if (c == exitCommand) {
switch (mode) {
case 0:
midlet.quit();
break;
case 1:
sendDeath(5);
System.out.println("服务器退出连接");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
midlet.quit();
break;
case 2:
sendDeath(4);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
midlet.quit();
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -