import java.util.Random; import java.util.Vector; public class Tank extends GameObject { protected float geschwindigkeit, xf_Koordinate, yf_Koordinate; protected long currTime; protected long time, time1; protected int missileType = 70; protected long feuernKontroller; protected long feuernHaufigkeit = 700;// ms protected int energie; protected static Random random = new Random(); protected boolean aktive = true; protected boolean feuern = false; protected boolean keyUp = false, keyDown = false, keyLeft = false, keyRight = false; protected boolean flachHeit = false; protected boolean feindlich; protected int beschId; protected long elapsedTime; /* * U=1 UR=2 R=3 DR=4 D=5 LD=6 L=7 UL=8 */ protected int flachHeitRichtung; protected int tankRichtung = 0, fahrRichtung = 1; /** * * @param tankManager * @param x_Koordinate * -(0-59) * @param y_Koordinate * -(0-59) * @param tankType */ public Tank(TankManager tankManager, int x_Koordinate, int y_Koordinate, int tankType) { init(tankManager, x_Koordinate, y_Koordinate, tankType); } protected void init(TankManager tankManager, int x_Koordinate, int y_Koordinate, int tankType) { this.id = this.hashCode(); switch (tankType) { case 00: super.init(tankManager, x_Koordinate * tankManager.koernigkeit2, y_Koordinate * tankManager.koernigkeit2, 255, 0, 210, tankManager.koernigkeit2 * 2, tankManager.koernigkeit2 * 2, tankType); this.feindlich = false; this.geschwindigkeit = 0.00000f; this.feuernHaufigkeit = 0; this.energie = 1; break; case 01: super.init(tankManager, x_Koordinate * tankManager.koernigkeit2, y_Koordinate * tankManager.koernigkeit2, 255, 0, 0, tankManager.koernigkeit2 * 3, tankManager.koernigkeit2 * 3, tankType); this.feindlich = false; this.geschwindigkeit = 0.00020f; this.feuernHaufigkeit = 700; this.energie = 50; break; case 02: super.init(tankManager, x_Koordinate * tankManager.koernigkeit2, y_Koordinate * tankManager.koernigkeit2, 0, 255, 0, tankManager.koernigkeit2 * 3, tankManager.koernigkeit2 * 3, tankType); this.feindlich = false; this.geschwindigkeit = 0.00010f; this.feuernHaufigkeit = 700; this.energie = 100; break; case 03: super.init(tankManager, x_Koordinate * tankManager.koernigkeit2, y_Koordinate * tankManager.koernigkeit2, 0, 0, 255, tankManager.koernigkeit2 * 3, tankManager.koernigkeit2 * 3, tankType); this.feindlich = false; this.geschwindigkeit = 0.00015f; this.feuernHaufigkeit = 500; this.energie = 70; break; case 11: super.init(tankManager, x_Koordinate * tankManager.koernigkeit2, y_Koordinate * tankManager.koernigkeit2, 210, 10, 210, tankManager.koernigkeit2 * 3, tankManager.koernigkeit2 * 3, tankType); this.feindlich = true; this.geschwindigkeit = 0.00010f; this.feuernHaufigkeit = 900; this.energie = 1; break; case 12: super.init(tankManager, x_Koordinate * tankManager.koernigkeit2, y_Koordinate * tankManager.koernigkeit2, 210, 10, 210, tankManager.koernigkeit2 * 3, tankManager.koernigkeit2 * 3, tankType); this.feindlich = true; this.geschwindigkeit = 0.00010f; this.feuernHaufigkeit = 900; this.energie = 1; break; case 13: super.init(tankManager, x_Koordinate * tankManager.koernigkeit2, y_Koordinate * tankManager.koernigkeit2, 210, 10, 210, tankManager.koernigkeit2 * 3, tankManager.koernigkeit2 * 3, tankType); this.feindlich = true; this.geschwindigkeit = 0.00010f; this.feuernHaufigkeit = 900; this.energie = 1; break; case 21: super.init(tankManager, x_Koordinate * tankManager.koernigkeit2, y_Koordinate * tankManager.koernigkeit2, 210, 10, 210, tankManager.koernigkeit2 * 4, tankManager.koernigkeit2 * 4, tankType); this.feindlich = true; this.geschwindigkeit = 0.00005f; this.energie = 30; break; case 22: super.init(tankManager, x_Koordinate * tankManager.koernigkeit2, y_Koordinate * tankManager.koernigkeit2, 210, 10, 210, tankManager.koernigkeit2 * 4, tankManager.koernigkeit2 * 4, tankType); this.feindlich = true; this.geschwindigkeit = 0.00005f; this.energie = 30; break; case 23: super.init(tankManager, x_Koordinate * tankManager.koernigkeit2, y_Koordinate * tankManager.koernigkeit2, 210, 10, 210, tankManager.koernigkeit2 * 4, tankManager.koernigkeit2 * 4, tankType); this.feindlich = true; this.geschwindigkeit = 0.00005f; this.energie = 30; break; } currTime = System.currentTimeMillis(); time = currTime; time1 = currTime; feuernKontroller = currTime; this.xf_Koordinate = x_Koordinate * tankManager.koernigkeit2 + 0.0f; this.yf_Koordinate = y_Koordinate * tankManager.koernigkeit2 + 0.0f; } protected void malen() { long elapsedTime = System.currentTimeMillis() - currTime; currTime += elapsedTime; if (tankManager.status == GameManager.PAUSE || tankManager.status == GameManager.EXIT) { if (feindlich) { time += elapsedTime; time1 += elapsedTime; } elapsedTime = 0; } if (feuern) { feuern(); } if (!aktive) { elapsedTime = 0; } koordinateAktualisieren(elapsedTime); tankMalen(); } protected void tankMalen() { tankManager.maler.setColor(colorR, colorG, colorB); tankManager.maler.fillOvall(x_Koordinate, y_Koordinate, objWidth, objHeight); geschuetzTurm(); } private void geschuetzTurm() { int pW = objWidth / 10, pH = objWidth / 2 + objWidth / 6; switch (this.fahrRichtung) { case 1: tankManager.maler.setColor(255, 165, 0); tankManager.maler.fillRect(x_Koordinate + objWidth / 2 - pW / 2, y_Koordinate - pH + objWidth / 2, pW, pH); break; case 3: tankManager.maler.setColor(255, 165, 0); tankManager.maler.fillRect(x_Koordinate + objWidth / 2, y_Koordinate + objWidth / 2 - pW / 2, pH, pW); break; case 5: tankManager.maler.setColor(255, 165, 0); tankManager.maler.fillRect(x_Koordinate + objWidth / 2 - pW / 2, y_Koordinate + objWidth / 2, pW, pH); break; case 7: tankManager.maler.setColor(255, 165, 0); tankManager.maler.fillRect(x_Koordinate - (pH - objWidth / 2), y_Koordinate + objWidth / 2 - pW / 2, pH, pW); break; } } protected void keyPressBehandeln(int key) { switch (key) { case 38: keyUp = true; keyDown = false; /* fur vier richtung */ keyLeft = false; /* fur vier richtung */ keyRight = false; /* fur vier richtung */ break; case 40: keyUp = false; keyDown = true; keyLeft = false; keyRight = false; break; case 37: keyUp = false; keyDown = false; keyLeft = true; keyRight = false; break; case 39: keyUp = false; keyDown = false; keyLeft = false; keyRight = true; break; case 17: /* key Ctrl */ feuern = true; break; } richtungErkennen(); } protected void keyReleaseBehandeln(int key) { switch (key) { case 38: keyUp = false; break; case 40: keyDown = false; break; case 37: keyLeft = false; break; case 39: keyRight = false; break; case 17: /* key Ctrl */ feuern = false; break; } richtungErkennen(); } protected void richtungErkennen() { if (keyLeft && !keyUp && !keyRight && !keyDown) tankRichtung = 7; else if (keyLeft && keyUp && !keyRight && !keyDown) tankRichtung = 8; else if (!keyLeft && keyUp && !keyRight && !keyDown) tankRichtung = 1; else if (!keyLeft && keyUp && keyRight && !keyDown) tankRichtung = 2; else if (!keyLeft && !keyUp && keyRight && !keyDown) tankRichtung = 3; else if (!keyLeft && !keyUp && keyRight && keyDown) tankRichtung = 4; else if (!keyLeft && !keyUp && !keyRight && keyDown) tankRichtung = 5; else if (keyLeft && !keyUp && !keyRight && keyDown) tankRichtung = 6; else if (!keyLeft && !keyUp && !keyRight && !keyDown) tankRichtung = 0; } protected void feuern() { if (currTime - feuernKontroller > feuernHaufigkeit) { this.tankManager.missilesMenge.addElement(new Missile(tankManager, x_Koordinate, y_Koordinate, objWidth, objHeight, fahrRichtung, missileType, feindlich, id)); feuernKontroller = currTime; } } protected void koordinateAktualisieren(long elapsedTime) { x_Koe = x_Koordinate / tankManager.koernigkeit2; y_Koe = y_Koordinate / tankManager.koernigkeit2; int x_KoeRest = x_Koordinate % tankManager.koernigkeit2; int y_KoeRest = y_Koordinate % tankManager.koernigkeit2; if (feindlich&&elapsedTime!=0) { tankFeindKI(); } int alteX_Koordinate, alteY_Koordinate, alteX_Koe, alteY_Koe; float alteXf_Koordinate, alteYf_Koordinate; alteX_Koordinate = x_Koordinate; alteY_Koordinate = y_Koordinate; alteXf_Koordinate = xf_Koordinate; alteYf_Koordinate = yf_Koordinate; alteX_Koe = x_Koe; alteY_Koe = y_Koe; if ((x_KoeRest != 0 || y_KoeRest != 0) && !flachHeit) { flachHeit = true; flachHeitRichtung = fahrRichtung; } if (x_KoeRest == 0 && y_KoeRest == 0) { flachHeit = false; } if (flachHeit) { switch (flachHeitRichtung) { case 1: yf_Koordinate -= geschwindigkeit * tankManager.screenWidth * elapsedTime; y_Koordinate = getRund(yf_Koordinate); if (tankRichtung == 0) { if (y_Koordinate / tankManager.koernigkeit2 < alteY_Koordinate / tankManager.koernigkeit2) { y_Koordinate = y_Koe * tankManager.koernigkeit2; } } if (yf_Koordinate < 0) { yf_Koordinate = 0; y_Koordinate = 0; } y_Koe = y_Koordinate / tankManager.koernigkeit2; break; case 3: xf_Koordinate += geschwindigkeit * tankManager.screenWidth * elapsedTime; x_Koordinate = getRund(xf_Koordinate); if (tankRichtung == 0) { if (x_Koordinate / tankManager.koernigkeit2 > alteX_Koordinate / tankManager.koernigkeit2) { x_Koordinate = (x_Koe + 1) * tankManager.koernigkeit2; } } if (x_Koordinate % tankManager.koernigkeit2 != 0) { x_Koe = x_Koordinate / tankManager.koernigkeit2 + 1; } break; case 5: yf_Koordinate += geschwindigkeit * tankManager.screenWidth * elapsedTime; y_Koordinate = getRund(yf_Koordinate); if (tankRichtung == 0) { if (y_Koordinate / tankManager.koernigkeit2 > alteY_Koordinate / tankManager.koernigkeit2) { y_Koordinate = (y_Koe + 1) * tankManager.koernigkeit2; } } if (y_Koordinate % tankManager.koernigkeit2 != 0) { y_Koe = y_Koordinate / tankManager.koernigkeit2 + 1; } break; case 7: xf_Koordinate -= geschwindigkeit * tankManager.screenWidth * elapsedTime; x_Koordinate = getRund(xf_Koordinate); if (tankRichtung == 0) { if (x_Koordinate / tankManager.koernigkeit2 < alteX_Koordinate / tankManager.koernigkeit2) { x_Koordinate = x_Koe * tankManager.koernigkeit2; } } if (xf_Koordinate < 0) { xf_Koordinate = 0; x_Koordinate = 0; } x_Koe = x_Koordinate / tankManager.koernigkeit2; break; } } else { switch (tankRichtung) { case 1: yf_Koordinate -= geschwindigkeit * tankManager.screenWidth * elapsedTime; y_Koordinate = getRund(yf_Koordinate); break; case 3: xf_Koordinate += geschwindigkeit * tankManager.screenWidth * elapsedTime; x_Koordinate = getRund(xf_Koordinate); break; case 5: yf_Koordinate += geschwindigkeit * tankManager.screenWidth * elapsedTime; y_Koordinate = getRund(yf_Koordinate); break; case 7: xf_Koordinate -= geschwindigkeit * tankManager.screenWidth * elapsedTime; x_Koordinate = getRund(xf_Koordinate); break; } } if (this.tankRichtung != 0 && !flachHeit) fahrRichtung = tankRichtung; // �߽��� if (x_Koordinate < 0 || x_Koordinate > tankManager.screenWidth - objWidth || y_Koordinate < 0 || y_Koordinate > tankManager.screenHeight - objHeight) { x_Koordinate = alteX_Koordinate; y_Koordinate = alteY_Koordinate; xf_Koordinate = alteXf_Koordinate; yf_Koordinate = alteYf_Koordinate; } if (stossenGegen(tankManager.tankMenge)) { x_Koordinate = alteX_Koe * tankManager.koernigkeit2; y_Koordinate = alteY_Koe * tankManager.koernigkeit2; xf_Koordinate = alteXf_Koordinate; yf_Koordinate = alteYf_Koordinate; } if (stossenGegen(tankManager.brickwall)) { x_Koordinate = alteX_Koordinate; y_Koordinate = alteY_Koordinate; xf_Koordinate = alteXf_Koordinate; yf_Koordinate = alteYf_Koordinate; } // if (stossenGegen(tankManager.grasswall)) { // x_Koordinate = alteX_Koordinate; // y_Koordinate = alteY_Koordinate; // } if (stossenGegen(tankManager.metalwall)) { x_Koordinate = alteX_Koordinate; y_Koordinate = alteY_Koordinate; xf_Koordinate = alteXf_Koordinate; yf_Koordinate = alteYf_Koordinate; } if (stossenGegen(tankManager.waterwall)) { x_Koordinate = alteX_Koordinate; y_Koordinate = alteY_Koordinate; xf_Koordinate = alteXf_Koordinate; yf_Koordinate = alteYf_Koordinate; } } protected void tankFeindKI() { } public void beschaedigen(int besch, int beschId) { this.beschId = beschId; this.energie = this.energie - besch; if (this.energie <= 0) { explodieren(); } } protected void explodieren() { tankManager.tankMenge.removeElement(this); if (tankManager.tank1 != null && this.id == tankManager.tank1.id) { tankManager.tank1 = null; } } protected void toolBehandeln(int toolType) { } }