📄 tankgame2007.java
字号:
package tankgame2007;
import java.awt.MediaTracker;
import java.awt.Image;
import java.awt.Color;
import java.applet.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.Graphics;
import java.util.Random;
public class TankGame2007 extends Applet{
final int EnemyNum =4;
int tempy=50;
int myTankWidth, myTankHeight;
int enemyTankWidth, enemyTankHeight;
int myTankX, myTankY;
int enemyTankX, enemyTankY;
int destroyEnemyNum = 0;
static int Blood=100;
private final int Tile_width=32;
private final int Tile_height=32;
private final int Tile_rows=2;
private final int Tile_cols=13;
private final int MAP_ROWS = 18;
private final int MAP_COLS = 22;
DrawMap drawmap;
Image myTankSrcImg;
Image enemyTankSrcImg;
Image shellSrcImg;
Image myTankImg[]; //装载我方坦克的图像数组
Image enemyTankImg[]; //装载地方坦克的图像数组
Image mapSource;
Image mapImg;
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; //缓冲画面图形对象
Font f;
Random rand;
public void init() {
f=new Font("宋体",Font.PLAIN,20);
this.setFont(f);
System.out.println("grass length"+MapArray.grass.length);
System.out.println("wall length"+MapArray.wall.length);
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");
mapSource =getImage(getDocumentBase(),"pic/Walls.png");
MT.addImage(mapSource,0);
MT.addImage(explosionSrcImg, 0);
MT.addImage(myTankSrcImg, 0);
MT.addImage(enemyTankSrcImg, 0);
MT.addImage(shellSrcImg, 0);
drawmap=new DrawMap(mapSource,32,32,2,13,18,22,this);
try {
MT.waitForAll();
}
catch (InterruptedException E) { }//没有进行异常处理
//处理爆炸动画
explosionImg = GetCuttingImage.getImages(explosionSrcImg, 1, 8, 34, 33);
myTankImg = GetCuttingImage.getImages(myTankSrcImg, 1, 4,45, 45);
enemyTankImg = GetCuttingImage.getImages(enemyTankSrcImg,1, 4, 45, 45);
shellImg = GetCuttingImage.getImages(shellSrcImg, 1,2, 10, 10);
myTankWidth = myTankSrcImg.getWidth(this)/4;
myTankHeight = myTankSrcImg.getHeight(this);
enemyTankWidth = enemyTankSrcImg.getWidth(this)/4;
enemyTankHeight = enemyTankSrcImg.getHeight(this);
myTankX = 490;
myTankY = this.getHeight() - myTankHeight;
//建立缓冲画面
bufferImage = this.createImage(this.getWidth(), this.getHeight());
bufferGraphic = bufferImage.getGraphics();
this.setFocusable(true);
this.setSize(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) % (704 - enemyTankWidth);
enemyTankY = rand.nextInt(10000) % (576 - 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) {
System.out.println("Applet width,height"+this.getWidth());
//bufferGraphic.clearRect(0, 0, this.getWidth(), this.getHeight());
bufferGraphic.setColor(new Color(0X88f1f5));
bufferGraphic.fillRect(0, 0, 804,576);
drawmap.paintMap(bufferGraphic);
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;
Blood=Blood-5;
}
if(enemyTank[i].isCollided(myTankSprite)){
setExplosionPosition(myTankSprite);
explosion.setVisible(true);
explAudio.play();
enemyTank[i].setMove(false);
enemyTank[i].setVisible(false);
destroyEnemyNum = destroyEnemyNum +1;
Blood=Blood-5;
}
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);
Blood=Blood-5;
}
if (enemyShell[i].isCollide(Tile_width,Tile_height,MAP_COLS,enemyTank[i].getTankDirection()) && enemyShell[i].visible==true){
explosion.setLocation(enemyShell[i].collisionX,enemyShell[i].collisionY);
explosion.setVisible(true);
enemyShell[i].setMove(false);
enemyShell[i].setVisible(false);
}
}
}
myTankSprite.paintSprite(bufferGraphic, myTankSprite.getTankDirection());
if (destroyEnemyNum == EnemyNum) {
bufferGraphic.drawString(" 你赢了", (this.getWidth() - 100) / 2,
(this.getHeight() - 100) / 2);
threadTank.stop();
destroyEnemyNum = 0;
}
explosion.paintSprite(bufferGraphic);
MyShell.paintSprite(bufferGraphic);
bufferGraphic.setColor(Color.BLACK);
bufferGraphic.drawString("生命值",704,10);
bufferGraphic.drawRect(704,20,101,21);
bufferGraphic.setColor(Color.blue);
if(Blood<=0){
bufferGraphic.drawString("游戏结束",(this.getWidth()-100)/2,(this.getHeight()-100)/2);
threadTank.stop();
}
System.out.println("destroyEnemyNum"+destroyEnemyNum);
bufferGraphic.fillRect(705,21,Blood,20);
for(int i=0;i<4-destroyEnemyNum;i++){
bufferGraphic.drawImage(enemyTankImg[0],704,tempy,this);
tempy=tempy+50;
System.out.println(tempy);
}
tempy=50;
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 + -