📄 tankgame2007.java~1~
字号:
package tankgame2007;
import java.awt.MediaTracker;
import java.awt.Image;
import java.awt.Color;
import java.applet.*;
import java.applet.Applet;
import java.awt.Graphics;
import java.util.Random;
public class TankGame2007 extends Applet{
final int EnemyNum = 8;
int myTankWidth, myTankHeight;
int enemyTankWidth, enemyTankHeight;
int myTankX, myTankY;
int enemyTankX, enemyTankY;
int destroyEnemyNum = 0;
Image myTankSrcImg;
Image enemyTankSrcImg;
Image shellSrcImg;
Image myTankImg[]; //装载我方坦克的图像数组
Image enemyTankImg[]; //装载地方坦克的图像数组
MediaTracker MT; //定义追踪器
PlayerTankSprite myTankSprite; //定义我方坦克实例
EnemyTankSprite[] enemyTank; //定义地方坦克实例
TankThread threadTank;
ShellSprite MyShell; //我方炮弹
ShellSprite[] enemyShell; //敌方炮弹
public Image shellImg[];
Explosion explosion; //爆炸效果管理类对象
Image explosionImg[]; //爆炸效果图片分割后的存储数组
Image explosionSrcImg;//爆炸效果原始图片
private AudioClip explAudio,bkMusicAudio, gameOverAudio;//声音文件
Image bufferImage; //缓冲画面
Graphics bufferGraphic; //缓冲画面图形对象
Random rand;
public void init() {
MT = new MediaTracker(this);
myTankImg = new Image[4];
enemyTankImg = new Image[4];
shellImg = new Image[2];
bkMusicAudio = getAudioClip(getDocumentBase(), "audio/Music.mid");
explAudio = getAudioClip(getDocumentBase(), "audio/Explosion.wav");
gameOverAudio = getAudioClip(getDocumentBase(), "audio/GameOver.wav");
explosionSrcImg = getImage(getDocumentBase(), "pic/explosion.gif");
myTankSrcImg = getImage(getDocumentBase(), "pic/Tank.png");
enemyTankSrcImg = getImage(getDocumentBase(), "pic/ETank.png");
shellSrcImg = getImage(getDocumentBase(), "pic/Shell.png");
MT.addImage(explosionSrcImg, 0);
MT.addImage(myTankSrcImg, 0);
MT.addImage(enemyTankSrcImg, 0);
MT.addImage(shellSrcImg, 0);
try {
MT.waitForAll();
}
catch (InterruptedException E) { }//没有进行异常处理
//处理爆炸动画
explosionImg = GetCuttingImage.getImages(explosionSrcImg, 8, 34, 33);
myTankImg = GetCuttingImage.getImages(myTankSrcImg, 4, 45, 45);
enemyTankImg = GetCuttingImage.getImages(enemyTankSrcImg, 4, 45, 45);
shellImg = GetCuttingImage.getImages(shellSrcImg, 2, 10, 10);
myTankWidth = myTankSrcImg.getWidth(this)/4;
myTankHeight = myTankSrcImg.getHeight(this);
enemyTankWidth = enemyTankSrcImg.getWidth(this)/4;
enemyTankHeight = enemyTankSrcImg.getHeight(this);
myTankX = (this.getWidth() - myTankWidth) / 2;
myTankY = this.getHeight() - myTankHeight;
//建立缓冲画面
bufferImage = this.createImage(this.getWidth(), this.getHeight());
bufferGraphic = bufferImage.getGraphics();
this.setFocusable(true);
this.resize(this.getWidth(), this.getHeight());
rand = new Random();
MyShell = new ShellSprite(shellImg[0],0,20,this);
MyShell.setSize(shellSrcImg.getWidth(this)/2,shellSrcImg.getHeight(this));
explosion = new Explosion(explosionImg, this);
myTankSprite = new PlayerTankSprite(myTankImg, myTankX, myTankY,MyShell,this);
//注意:要及时更新myTankSprite的宽和高,否则碰撞测试不能正确检测
myTankSprite.setSize(myTankWidth,myTankHeight);
enemyTank = new EnemyTankSprite[EnemyNum];
enemyShell = new ShellSprite[EnemyNum];
createNewEnemyTank();
//bkMusicAudio.loop();
}
public void start() {
threadTank = new TankThread(this,
myTankSprite,enemyTank,
MyShell,enemyShell,
explosion);
threadTank.start();
}
public void stop() {
threadTank = null;
}
public void createNewEnemyTank() {
for (int i = 0; i < EnemyNum; i++) {
enemyTankX = rand.nextInt(10000) % (this.getWidth() - enemyTankWidth);
enemyTankY = rand.nextInt(10000) % (this.getHeight() - enemyTankHeight);
enemyShell[i] = new ShellSprite(shellImg[1], 0, 5,this);
enemyShell[i].setSize(shellSrcImg.getWidth(this) / 2,
shellSrcImg.getHeight(this) / 2);
enemyShell[i].setVisible(true);
enemyShell[i].setMove(true);
enemyTank[i] = new EnemyTankSprite(enemyTankImg, enemyTankX, enemyTankY,enemyShell[i], this);
//注意:要及时更新enemyTank的宽和高,否则碰撞测试不能正确检测
enemyTank[i].setSize(enemyTankWidth, enemyTankHeight);
enemyTank[i].setTankDirection(rand.nextInt(12) % 4);
enemyTank[i].setVisible(true);
enemyTank[i].setMove(true);
}
}
public void recreateEnemyTank(){
if(destroyEnemyNum == EnemyNum){
destroyEnemyNum = 0;
createNewEnemyTank();
}
}
public void paint(Graphics g) {
//bufferGraphic.clearRect(0, 0, this.getWidth(), this.getHeight());
bufferGraphic.setColor(new Color(0X88f1f5));
bufferGraphic.fillRect(0, 0, this.getWidth(), this.getHeight());
recreateEnemyTank();
for (int i = 0; i < EnemyNum; i++) {
if(enemyTank[i].visible == true){
enemyTank[i].paintSprite(bufferGraphic, enemyTank[i].getTankDirection());
enemyShell[i].paintSprite(bufferGraphic);
//间隔一定时间后随机抽取坦克的方向==================
int k = rand.nextInt(10000);
int d = rand.nextInt(12) % 4; //抽取坦克的随机方向;
if (k % 2 != 0 && k < 30) {
enemyTank[i].setTankDirection(d);
}
//==============================================
if (myTankSprite.isCollided(enemyTank[i])) {
setExplosionPosition(enemyTank[i]);
explosion.setVisible(true);
explAudio.play();
enemyTank[i].setMove(false);
enemyTank[i].setVisible(false);
destroyEnemyNum = destroyEnemyNum +1;
}
if (MyShell.isCollided(enemyTank[i])) {
setExplosionPosition(enemyTank[i]);
explosion.setVisible(true);
explAudio.play();
enemyTank[i].setMove(false);
enemyTank[i].setVisible(false);
MyShell.setMove(false);
MyShell.setVisible(false);
destroyEnemyNum = destroyEnemyNum +1;
}
if (enemyShell[i].isCollided(myTankSprite)) {
setExplosionPosition(myTankSprite);
explosion.setVisible(true);
}
}
}
myTankSprite.paintSprite(bufferGraphic, myTankSprite.getTankDirection());
explosion.paintSprite(bufferGraphic);
MyShell.paintSprite(bufferGraphic);
g.drawImage(bufferImage, 0, 0, this);
}
public void setExplosionPosition(AbstractSprite sprite){
int dir = 0;
if(sprite instanceof EnemyTankSprite){
dir = ((EnemyTankSprite)sprite).getTankDirection();
}
if(sprite instanceof PlayerTankSprite){
dir = ((PlayerTankSprite)sprite).getTankDirection();
}
switch (dir) {
case 0:
case 1:
explosion.setLocation(sprite.getX() +
sprite.getWidth() / 2,
sprite.getY() +
sprite.getHeight() / 2);
break;
case 2:
case 3:
explosion.setLocation(sprite.getX() +
sprite.getHeight() / 2,
sprite.getY() +
sprite.getWidth() / 2);
}
}
public void update(Graphics g) { //update()方法
paint(g); //只单纯调用paint()方法
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -