📄 btltank.java
字号:
// Decompiled by DJ v2.9.9.60 Copyright 2000 Atanas Neshkov Date: 2004-12-12 17:45:02
// Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name: BtlTank.java
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.*;
import java.io.PrintStream;
// <applet code="BtlTank" width=400 height=250>
public class BtlTank extends Applet
implements Runnable
{
public void createGame()
{
if(!fGameIsLoaded)
{
fScreenWidth = size().width;
fScreenHeight = size().height;
fXMidScr = fScreenWidth / 2;
fYMidScr = fScreenHeight / 2;
fOffScrImage = createImage(fScreenWidth, fScreenHeight);
fOffScrGraphics = fOffScrImage.getGraphics();
fOffScrGraphics.setFont(fFont1);
FontMetrics fontmetrics = fOffScrGraphics.getFontMetrics();
fFont1Height = fontmetrics.getHeight();
fStatsLeftMargin = fontmetrics.stringWidth("ENEMIES ");
fOffScrGraphics.setFont(fFont2);
fontmetrics = fOffScrGraphics.getFontMetrics();
fFont2Height = fontmetrics.getHeight();
fTitleImage = loadImage("title.gif");
fPlayerGunSnd = getAudioClip(getCodeBase(), "pgun.au");
fBgrSnd = getAudioClip(getCodeBase(), "bgr.au");
fCollideSnd = getAudioClip(getCodeBase(), "collide.au");
fExplodeSnd = getAudioClip(getCodeBase(), "explode.au");
fViewerCollisionSnd = getAudioClip(getCodeBase(), "vcollide.au");
ZTable.Initialize();
ZMatrix.InitNonchangingValues();
fView = new ZView();
fLight = new ZLight(lightX, lightY, lightZ, lightIntensity);
fWorld = new ZWorld();
fWorld.Create(300, fLight, fCollideSnd, fExplodeSnd, fViewerCollisionSnd);
fWorld.SetViewerDistance(256);
fWorld.SetView(fView);
ZObject.SetWorld(fWorld);
createPoly();
fWorld.SetGraphics(fOffScrGraphics, fScreenWidth, fScreenHeight, fXMidScr, fYMidScr);
fWireframeMode = false;
fWorld.SetWireframeMode(fWireframeMode);
fBgrImage = createImage(fScreenWidth, fScreenHeight / 2 + 5);
fView.SetView(0, 0, fScreenWidth, fScreenHeight, fScreenWidth / 2, fScreenHeight / 2);
fView.SetWorld(fWorld);
fSkyImage = loadImage("mtn.gif");
fGameIsLoaded = true;
}
requestFocus();
}
public void stop()
{
if(fThread != null)
{
fBgrSnd.stop();
if(fThread.isAlive())
fThread.stop();
fThread = null;
}
}
public boolean keyDown(Event event, int i)
{
if(fStatus == 1)
{
newGame();
newLevel();
return true;
}
if(fStatus == 4)
return true;
switch(i)
{
default:
break;
case 74: // 'J'
case 106: // 'j'
case 1006:
fRotateLeft = true;
break;
case 76: // 'L'
case 108: // 'l'
case 1007:
fRotateRight = true;
break;
case 73: // 'I'
case 105: // 'i'
case 1004:
fMoveForward = true;
break;
case 75: // 'K'
case 107: // 'k'
case 1005:
fMoveBackward = true;
break;
case 32: // ' '
fShooting = true;
break;
case 70: // 'F'
case 102: // 'f'
fWireframeMode = !fWireframeMode;
fWorld.SetWireframeMode(fWireframeMode);
break;
case 77: // 'M'
case 109: // 'm'
fDrawMap = !fDrawMap;
break;
case 44: // ','
case 60: // '<'
fMapScalingFactor--;
if(fMapScalingFactor < 1)
fMapScalingFactor = 1;
break;
case 46: // '.'
case 62: // '>'
fMapScalingFactor++;
if(fMapScalingFactor > 20)
fMapScalingFactor = 20;
break;
case 82: // 'R'
case 114: // 'r'
enterIntro();
return true;
case 81: // 'Q'
case 113: // 'q'
lightIntensity += 5;
fLight.SetLight(lightX, lightY, lightZ, lightIntensity);
break;
case 65: // 'A'
case 97: // 'a'
lightIntensity -= 5;
fLight.SetLight(lightX, lightY, lightZ, lightIntensity);
break;
case 83: // 'S'
case 115: // 's'
fView.MoveY(10);
break;
case 87: // 'W'
case 119: // 'w'
fView.MoveY(-10);
break;
case 69: // 'E'
case 101: // 'e'
fView.RotateXZ(52, 0);
break;
case 68: // 'D'
case 100: // 'd'
fView.RotateXZ(-52, 0);
break;
case 84: // 'T'
case 116: // 't'
DEBUG = !DEBUG;
break;
case 66: // 'B'
case 98: // 'b'
BGR = !BGR;
break;
}
return true;
}
public void checkKeys()
{
if(fStatus == 0 || fStatus == 2)
{
if(fMoveForward)
{
fView.Move(fMovementSpeed);
fMovementSpeed += 3;
if(fMovementSpeed > 20)
fMovementSpeed = 20;
} else
if(fMoveBackward)
{
fView.Move(-fMovementSpeed);
fMovementSpeed += 3;
if(fMovementSpeed > 20)
fMovementSpeed = 20;
}
if(fRotateLeft)
{
fView.RotateOnYAxis(-fRotationSpeed);
fRotationSpeed += 5;
if(fRotationSpeed > 26)
fRotationSpeed = 26;
} else
if(fRotateRight)
{
fView.RotateOnYAxis(fRotationSpeed);
fRotationSpeed += 5;
if(fRotationSpeed > 26)
fRotationSpeed = 26;
}
if(fShooting)
{
if(fView.Shoot(fWorld))
fPlayerGunSnd.play();
fShooting = false;
}
}
}
public void drawCockpit()
{
fOffScrGraphics.setColor(Color.green);
fOffScrGraphics.drawLine(fXMidScr - 20, fYMidScr, fXMidScr - 20 - 20, fYMidScr);
fOffScrGraphics.drawLine(fXMidScr + 20, fYMidScr, fXMidScr + 20 + 20, fYMidScr);
fOffScrGraphics.drawLine(fXMidScr, fYMidScr - 20, fXMidScr, fYMidScr - 20 - 20);
fOffScrGraphics.drawLine(fXMidScr, fYMidScr + 20, fXMidScr, fYMidScr + 20 + 20);
fOffScrGraphics.drawRect(fXMidScr - 20, fYMidScr - 20, 40, 40);
}
public void drawTextCentered(int i, int j, int k, String s, Graphics g)
{
FontMetrics fontmetrics = g.getFontMetrics();
int l = i + (k - i - fontmetrics.stringWidth(s) >> 1);
int i1 = j;
g.setColor(Color.black);
g.drawString(s, l - 1, i1);
g.setColor(Color.gray);
g.drawString(s, l + 1, i1);
g.setColor(Color.white);
g.drawString(s, l, i1);
}
public void drawBackground()
{
if(fStatus == 1)
{
fOffScrGraphics.setColor(Color.black);
fOffScrGraphics.fillRect(0, 0, fScreenWidth, fScreenHeight);
return;
}
if(!fWireframeMode)
{
fOffScrGraphics.drawImage(fSkyImage, -fView.fYAngle, 0, this);
fOffScrGraphics.drawImage(fBgrImage, 0, fYMidScr + fView.fShakeYAmount, this);
return;
} else
{
fOffScrGraphics.setColor(Color.black);
fOffScrGraphics.fillRect(0, 0, fScreenWidth, fScreenHeight);
fOffScrGraphics.setColor(Color.gray);
fOffScrGraphics.drawLine(0, fYMidScr + fView.fShakeYAmount, fScreenWidth, fYMidScr + fView.fShakeYAmount);
return;
}
}
private void newLevel()
{
fWorld.RemoveAllObjects();
fLevel++;
fView.fRemainingEnemies = 5;
fStatus = 0;
fStatusTimer = 0;
fStartingLevelMessageCountdown = 100;
fLowEnergyWarningMessageCountdown = 0;
fLowEnergyWarningMessageHasPlayed = false;
predrawBackground();
createPoly();
fView.SetPos(0, 0, 0, 0, 480, 0);
fView.SetStatus(0);
fMapScalingFactor = 4;
}
public void drawOffScreen()
{
fWorld.CheckCollision();
fWorld.CheckCollisionWithEnemyBullet();
checkKeys();
fMatrix.InitTrans();
fWorld.Transform(fMatrix);
drawBackground();
fView.Draw(fWorld);
if(fStatus != 1)
{
drawMap(fOffScrGraphics);
drawCockpit();
drawStats(fOffScrGraphics);
}
if(fStatus == 1)
{
fOffScrGraphics.drawImage(fTitleImage, fScreenWidth - fTitleImage.getWidth(this) >> 1, 20, this);
fOffScrGraphics.setFont(fFont2);
drawTextCentered(0, 20 + fTitleImage.getHeight(this) + fFont2Height, size().width, "CLICK TO START", fOffScrGraphics);
fOffScrGraphics.setFont(fFont1);
drawTextCentered(0, fScreenHeight - fFont1Height, size().width, "(C) F. PERMADI", fOffScrGraphics);
}
if(fStatus == 3)
{
fOffScrGraphics.setFont(fFont2);
drawTextCentered(0, fYMidScr - fFont2Height, size().width, "GAMEOVER", fOffScrGraphics);
fStatusTimer++;
if(fStatusTimer >= 100)
enterIntro();
}
if(fStatus == 2)
{
fOffScrGraphics.setFont(fFont2);
drawTextCentered(0, fYMidScr - fFont2Height, size().width, "STAGE " + fLevel + " CLEAR", fOffScrGraphics);
fStatusTimer++;
if(fStatusTimer >= 40)
newLevel();
}
if(fStartingLevelMessageCountdown > 0)
{
fOffScrGraphics.setFont(fFont2);
drawTextCentered(0, fYMidScr - fFont2Height * 3, size().width, "STAGE-" + fLevel, fOffScrGraphics);
fOffScrGraphics.setFont(fFont1);
drawTextCentered(0, (fYMidScr - fFont2Height * 3) + fFont1Height, size().width, "ELIMINATE ALL ENEMIES", fOffScrGraphics);
fStartingLevelMessageCountdown--;
} else
if(fLowEnergyWarningMessageCountdown > 0)
{
if(fLowEnergyWarningMessageCountdown % 5 < 3)
{
fOffScrGraphics.setFont(fFont1);
drawTextCentered(0, fYMidScr - fFont2Height * 3, size().width, "WARNING-LOW ENERGY", fOffScrGraphics);
}
fLowEnergyWarningMessageCountdown--;
}
if(fStatus == 0)
{
if(fView.fEnergy < 3)
if(fView.fEnergy <= 0)
{
fStatusTimer = 0;
fStatus = 3;
} else
if(!fLowEnergyWarningMessageHasPlayed)
{
fLowEnergyWarningMessageHasPlayed = true;
fLowEnergyWarningMessageCountdown = 50;
}
if(fView.fRemainingEnemies <= 0)
{
fStatusTimer = 0;
fStatus = 2;
}
}
}
public void destroy()
{
Runtime.getRuntime().gc();
fOffScrGraphics.finalize();
}
private void newGame()
{
fView.fEnergy = 8;
fView.fScore = 0;
fLevel = 0;
}
private void drawMap(Graphics g)
{
if(!fDrawMap)
return;
byte byte0 = 5;
int i = 100;
int j = byte0 + i / 2;
int k = fScreenHeight - (i + 5);
int l = i;
int i1 = (fScreenHeight - (i + 5)) + l / 2;
float f = ((float)i / (float)(ZWorld.fWidth * 4)) * (float)fMapScalingFactor;
g.setColor(Color.black);
g.fillRect(byte0, k, i, l);
g.setColor(Color.gray);
g.drawRect(byte0, k, i, l);
g.setColor(Color.green);
g.drawLine(byte0, k, j, i1);
g.drawLine(byte0 + i, k, j, i1);
g.setFont(fFont1);
g.setColor(Color.cyan);
g.drawString("X" + fMapScalingFactor, byte0 + 2, (k + l) - 2);
for(int l1 = 0; l1 < fWorld.fNumObjects; l1++)
{
if(fWorld.fObjects[l1].fType == 1)
g.setColor(Color.red);
else
if(fWorld.fObjects[l1].fType == 0)
g.setColor(Color.yellow);
else
if(fWorld.fObjects[l1].fType == 5)
g.setColor(Color.cyan);
else
g.setColor(Color.white);
int j1 = j + (int)((float)fWorld.fObjects[l1].fVertices[0].fAx * f);
int k1 = i1 - (int)((float)fWorld.fObjects[l1].fVertices[0].fAz * f);
if(j1 > byte0 && j1 < byte0 + i && k1 > k && k1 < k + l)
{
g.drawLine(j1, k1, j1 + 1, k1);
g.drawLine(j1, k1 + 1, j1 + 1, k1 + 1);
}
}
}
public Image loadImage(String s)
{
MediaTracker mediatracker = new MediaTracker(this);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -