commit 99a61ede8e08b9f442cf812d8dfde28c6157ee97 Author: msb_64243 <940710867@qq.com> Date: Wed Aug 10 21:25:14 2022 +0800 坦克抽象工厂类代码提交 diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..21c30ab --- /dev/null +++ b/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..bbdf205 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + Javatank + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3a21537 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/bin/audio/explode.wav b/bin/audio/explode.wav new file mode 100644 index 0000000..dc72ab1 Binary files /dev/null and b/bin/audio/explode.wav differ diff --git a/bin/audio/tank_fire.wav b/bin/audio/tank_fire.wav new file mode 100644 index 0000000..85279eb Binary files /dev/null and b/bin/audio/tank_fire.wav differ diff --git a/bin/audio/tank_move.wav b/bin/audio/tank_move.wav new file mode 100644 index 0000000..959b998 Binary files /dev/null and b/bin/audio/tank_move.wav differ diff --git a/bin/audio/war1.wav b/bin/audio/war1.wav new file mode 100644 index 0000000..099a31e Binary files /dev/null and b/bin/audio/war1.wav differ diff --git a/bin/com/tank/Audio.class b/bin/com/tank/Audio.class new file mode 100644 index 0000000..3a4b2a5 Binary files /dev/null and b/bin/com/tank/Audio.class differ diff --git a/bin/com/tank/Bullet.class b/bin/com/tank/Bullet.class new file mode 100644 index 0000000..3c3c8dd Binary files /dev/null and b/bin/com/tank/Bullet.class differ diff --git a/bin/com/tank/DefaultFireStrategy.class b/bin/com/tank/DefaultFireStrategy.class new file mode 100644 index 0000000..d67db61 Binary files /dev/null and b/bin/com/tank/DefaultFireStrategy.class differ diff --git a/bin/com/tank/Dir.class b/bin/com/tank/Dir.class new file mode 100644 index 0000000..f8960c6 Binary files /dev/null and b/bin/com/tank/Dir.class differ diff --git a/bin/com/tank/Explode.class b/bin/com/tank/Explode.class new file mode 100644 index 0000000..b730b70 Binary files /dev/null and b/bin/com/tank/Explode.class differ diff --git a/bin/com/tank/FireStartegy.class b/bin/com/tank/FireStartegy.class new file mode 100644 index 0000000..487733c Binary files /dev/null and b/bin/com/tank/FireStartegy.class differ diff --git a/bin/com/tank/FourDirFireStrategy.class b/bin/com/tank/FourDirFireStrategy.class new file mode 100644 index 0000000..8bda125 Binary files /dev/null and b/bin/com/tank/FourDirFireStrategy.class differ diff --git a/bin/com/tank/ImageUtil.class b/bin/com/tank/ImageUtil.class new file mode 100644 index 0000000..1ec6820 Binary files /dev/null and b/bin/com/tank/ImageUtil.class differ diff --git a/bin/com/tank/Main.class b/bin/com/tank/Main.class new file mode 100644 index 0000000..2c87f83 Binary files /dev/null and b/bin/com/tank/Main.class differ diff --git a/bin/com/tank/PropertyMrg.class b/bin/com/tank/PropertyMrg.class new file mode 100644 index 0000000..8ed0557 Binary files /dev/null and b/bin/com/tank/PropertyMrg.class differ diff --git a/bin/com/tank/ResouceMgr.class b/bin/com/tank/ResouceMgr.class new file mode 100644 index 0000000..96c0461 Binary files /dev/null and b/bin/com/tank/ResouceMgr.class differ diff --git a/bin/com/tank/Tank.class b/bin/com/tank/Tank.class new file mode 100644 index 0000000..15bbbaf Binary files /dev/null and b/bin/com/tank/Tank.class differ diff --git a/bin/com/tank/TankFrame$1.class b/bin/com/tank/TankFrame$1.class new file mode 100644 index 0000000..baa79c2 Binary files /dev/null and b/bin/com/tank/TankFrame$1.class differ diff --git a/bin/com/tank/TankFrame$MyKeyListener.class b/bin/com/tank/TankFrame$MyKeyListener.class new file mode 100644 index 0000000..c604aa3 Binary files /dev/null and b/bin/com/tank/TankFrame$MyKeyListener.class differ diff --git a/bin/com/tank/TankFrame.class b/bin/com/tank/TankFrame.class new file mode 100644 index 0000000..cf8dc28 Binary files /dev/null and b/bin/com/tank/TankFrame.class differ diff --git a/bin/com/tank/TankGroup.class b/bin/com/tank/TankGroup.class new file mode 100644 index 0000000..56d8037 Binary files /dev/null and b/bin/com/tank/TankGroup.class differ diff --git a/bin/com/tank/TestTank$1.class b/bin/com/tank/TestTank$1.class new file mode 100644 index 0000000..5f2b7fb Binary files /dev/null and b/bin/com/tank/TestTank$1.class differ diff --git a/bin/com/tank/TestTank.class b/bin/com/tank/TestTank.class new file mode 100644 index 0000000..18852c5 Binary files /dev/null and b/bin/com/tank/TestTank.class differ diff --git a/bin/com/tank/abstractfactory/BaseBullet.class b/bin/com/tank/abstractfactory/BaseBullet.class new file mode 100644 index 0000000..d14fe75 Binary files /dev/null and b/bin/com/tank/abstractfactory/BaseBullet.class differ diff --git a/bin/com/tank/abstractfactory/BaseExplode.class b/bin/com/tank/abstractfactory/BaseExplode.class new file mode 100644 index 0000000..2230a46 Binary files /dev/null and b/bin/com/tank/abstractfactory/BaseExplode.class differ diff --git a/bin/com/tank/abstractfactory/BaseTank.class b/bin/com/tank/abstractfactory/BaseTank.class new file mode 100644 index 0000000..570a365 Binary files /dev/null and b/bin/com/tank/abstractfactory/BaseTank.class differ diff --git a/bin/com/tank/abstractfactory/DefaultFactory.class b/bin/com/tank/abstractfactory/DefaultFactory.class new file mode 100644 index 0000000..66098b3 Binary files /dev/null and b/bin/com/tank/abstractfactory/DefaultFactory.class differ diff --git a/bin/com/tank/abstractfactory/GameFactory.class b/bin/com/tank/abstractfactory/GameFactory.class new file mode 100644 index 0000000..ad6dbef Binary files /dev/null and b/bin/com/tank/abstractfactory/GameFactory.class differ diff --git a/bin/config b/bin/config new file mode 100644 index 0000000..8e033f0 --- /dev/null +++ b/bin/config @@ -0,0 +1,9 @@ +#设置坦克数量 +initTanCount=5 +tankSpeed=5 +bulletSpeed=10 +gameWidth=1080 +gameHeight=720 +#fire +goodFS=com.tank.FourDirFireStrategy +badFS=com.tank.DefaultFireStrategy diff --git a/bin/images/0.gif b/bin/images/0.gif new file mode 100644 index 0000000..79c5218 Binary files /dev/null and b/bin/images/0.gif differ diff --git a/bin/images/1.gif b/bin/images/1.gif new file mode 100644 index 0000000..eface51 Binary files /dev/null and b/bin/images/1.gif differ diff --git a/bin/images/10.gif b/bin/images/10.gif new file mode 100644 index 0000000..ffd49b8 Binary files /dev/null and b/bin/images/10.gif differ diff --git a/bin/images/2.gif b/bin/images/2.gif new file mode 100644 index 0000000..b88b47e Binary files /dev/null and b/bin/images/2.gif differ diff --git a/bin/images/3.gif b/bin/images/3.gif new file mode 100644 index 0000000..88e81e8 Binary files /dev/null and b/bin/images/3.gif differ diff --git a/bin/images/4.gif b/bin/images/4.gif new file mode 100644 index 0000000..4cc91ab Binary files /dev/null and b/bin/images/4.gif differ diff --git a/bin/images/5.gif b/bin/images/5.gif new file mode 100644 index 0000000..c1cc5d7 Binary files /dev/null and b/bin/images/5.gif differ diff --git a/bin/images/6.gif b/bin/images/6.gif new file mode 100644 index 0000000..4f43fc7 Binary files /dev/null and b/bin/images/6.gif differ diff --git a/bin/images/7.gif b/bin/images/7.gif new file mode 100644 index 0000000..20358ba Binary files /dev/null and b/bin/images/7.gif differ diff --git a/bin/images/8.gif b/bin/images/8.gif new file mode 100644 index 0000000..ae410c9 Binary files /dev/null and b/bin/images/8.gif differ diff --git a/bin/images/9.gif b/bin/images/9.gif new file mode 100644 index 0000000..11efedd Binary files /dev/null and b/bin/images/9.gif differ diff --git a/bin/images/BadTank1.png b/bin/images/BadTank1.png new file mode 100644 index 0000000..d661b80 Binary files /dev/null and b/bin/images/BadTank1.png differ diff --git a/bin/images/BadTank2.png b/bin/images/BadTank2.png new file mode 100644 index 0000000..c2a2b01 Binary files /dev/null and b/bin/images/BadTank2.png differ diff --git a/bin/images/GoodTank1.png b/bin/images/GoodTank1.png new file mode 100644 index 0000000..8afb8b0 Binary files /dev/null and b/bin/images/GoodTank1.png differ diff --git a/bin/images/GoodTank2.png b/bin/images/GoodTank2.png new file mode 100644 index 0000000..a1b131a Binary files /dev/null and b/bin/images/GoodTank2.png differ diff --git a/bin/images/bulletD.gif b/bin/images/bulletD.gif new file mode 100644 index 0000000..be33e5f Binary files /dev/null and b/bin/images/bulletD.gif differ diff --git a/bin/images/bulletL.gif b/bin/images/bulletL.gif new file mode 100644 index 0000000..1ab986a Binary files /dev/null and b/bin/images/bulletL.gif differ diff --git a/bin/images/bulletR.gif b/bin/images/bulletR.gif new file mode 100644 index 0000000..514e982 Binary files /dev/null and b/bin/images/bulletR.gif differ diff --git a/bin/images/bulletU.gif b/bin/images/bulletU.gif new file mode 100644 index 0000000..274c570 Binary files /dev/null and b/bin/images/bulletU.gif differ diff --git a/bin/images/bulletU.png b/bin/images/bulletU.png new file mode 100644 index 0000000..f6f7203 Binary files /dev/null and b/bin/images/bulletU.png differ diff --git a/bin/images/e1.gif b/bin/images/e1.gif new file mode 100644 index 0000000..4ba0e92 Binary files /dev/null and b/bin/images/e1.gif differ diff --git a/bin/images/e10.gif b/bin/images/e10.gif new file mode 100644 index 0000000..5667574 Binary files /dev/null and b/bin/images/e10.gif differ diff --git a/bin/images/e11.gif b/bin/images/e11.gif new file mode 100644 index 0000000..7d6747c Binary files /dev/null and b/bin/images/e11.gif differ diff --git a/bin/images/e12.gif b/bin/images/e12.gif new file mode 100644 index 0000000..97f85df Binary files /dev/null and b/bin/images/e12.gif differ diff --git a/bin/images/e13.gif b/bin/images/e13.gif new file mode 100644 index 0000000..473cab1 Binary files /dev/null and b/bin/images/e13.gif differ diff --git a/bin/images/e14.gif b/bin/images/e14.gif new file mode 100644 index 0000000..676fa2a Binary files /dev/null and b/bin/images/e14.gif differ diff --git a/bin/images/e15.gif b/bin/images/e15.gif new file mode 100644 index 0000000..d3795f8 Binary files /dev/null and b/bin/images/e15.gif differ diff --git a/bin/images/e16.gif b/bin/images/e16.gif new file mode 100644 index 0000000..4a913c3 Binary files /dev/null and b/bin/images/e16.gif differ diff --git a/bin/images/e2.gif b/bin/images/e2.gif new file mode 100644 index 0000000..f22cbb8 Binary files /dev/null and b/bin/images/e2.gif differ diff --git a/bin/images/e3.gif b/bin/images/e3.gif new file mode 100644 index 0000000..58c1e2a Binary files /dev/null and b/bin/images/e3.gif differ diff --git a/bin/images/e4.gif b/bin/images/e4.gif new file mode 100644 index 0000000..981e9e2 Binary files /dev/null and b/bin/images/e4.gif differ diff --git a/bin/images/e5.gif b/bin/images/e5.gif new file mode 100644 index 0000000..fc93522 Binary files /dev/null and b/bin/images/e5.gif differ diff --git a/bin/images/e6.gif b/bin/images/e6.gif new file mode 100644 index 0000000..1bba69a Binary files /dev/null and b/bin/images/e6.gif differ diff --git a/bin/images/e7.gif b/bin/images/e7.gif new file mode 100644 index 0000000..9719061 Binary files /dev/null and b/bin/images/e7.gif differ diff --git a/bin/images/e8.gif b/bin/images/e8.gif new file mode 100644 index 0000000..710d7ea Binary files /dev/null and b/bin/images/e8.gif differ diff --git a/bin/images/e9.gif b/bin/images/e9.gif new file mode 100644 index 0000000..0535c88 Binary files /dev/null and b/bin/images/e9.gif differ diff --git a/bin/images/missileLD.gif b/bin/images/missileLD.gif new file mode 100644 index 0000000..4a1d311 Binary files /dev/null and b/bin/images/missileLD.gif differ diff --git a/bin/images/missileLU.gif b/bin/images/missileLU.gif new file mode 100644 index 0000000..e1fb913 Binary files /dev/null and b/bin/images/missileLU.gif differ diff --git a/bin/images/missileRD.gif b/bin/images/missileRD.gif new file mode 100644 index 0000000..d58cc9c Binary files /dev/null and b/bin/images/missileRD.gif differ diff --git a/bin/images/missileRU.gif b/bin/images/missileRU.gif new file mode 100644 index 0000000..1eed195 Binary files /dev/null and b/bin/images/missileRU.gif differ diff --git a/bin/images/square0.jpg b/bin/images/square0.jpg new file mode 100644 index 0000000..5b80bf0 Binary files /dev/null and b/bin/images/square0.jpg differ diff --git a/bin/images/square1.jpg b/bin/images/square1.jpg new file mode 100644 index 0000000..324341d Binary files /dev/null and b/bin/images/square1.jpg differ diff --git a/bin/images/square2.jpg b/bin/images/square2.jpg new file mode 100644 index 0000000..be66ad8 Binary files /dev/null and b/bin/images/square2.jpg differ diff --git a/bin/images/square3.jpg b/bin/images/square3.jpg new file mode 100644 index 0000000..109430b Binary files /dev/null and b/bin/images/square3.jpg differ diff --git a/bin/images/square4.jpg b/bin/images/square4.jpg new file mode 100644 index 0000000..ba00d68 Binary files /dev/null and b/bin/images/square4.jpg differ diff --git a/bin/images/square5.jpg b/bin/images/square5.jpg new file mode 100644 index 0000000..56198aa Binary files /dev/null and b/bin/images/square5.jpg differ diff --git a/bin/images/square6.jpg b/bin/images/square6.jpg new file mode 100644 index 0000000..2923b9a Binary files /dev/null and b/bin/images/square6.jpg differ diff --git a/bin/images/tank.png b/bin/images/tank.png new file mode 100644 index 0000000..54c82ba Binary files /dev/null and b/bin/images/tank.png differ diff --git a/bin/images/tankD.gif b/bin/images/tankD.gif new file mode 100644 index 0000000..4c29adf Binary files /dev/null and b/bin/images/tankD.gif differ diff --git a/bin/images/tankL.gif b/bin/images/tankL.gif new file mode 100644 index 0000000..af51e88 Binary files /dev/null and b/bin/images/tankL.gif differ diff --git a/bin/images/tankLD.gif b/bin/images/tankLD.gif new file mode 100644 index 0000000..2f6bca7 Binary files /dev/null and b/bin/images/tankLD.gif differ diff --git a/bin/images/tankLU.gif b/bin/images/tankLU.gif new file mode 100644 index 0000000..1e1a514 Binary files /dev/null and b/bin/images/tankLU.gif differ diff --git a/bin/images/tankR.gif b/bin/images/tankR.gif new file mode 100644 index 0000000..a83f583 Binary files /dev/null and b/bin/images/tankR.gif differ diff --git a/bin/images/tankRD.gif b/bin/images/tankRD.gif new file mode 100644 index 0000000..60e2e81 Binary files /dev/null and b/bin/images/tankRD.gif differ diff --git a/bin/images/tankRU.gif b/bin/images/tankRU.gif new file mode 100644 index 0000000..d66ef25 Binary files /dev/null and b/bin/images/tankRU.gif differ diff --git a/bin/images/tankU.gif b/bin/images/tankU.gif new file mode 100644 index 0000000..8825a23 Binary files /dev/null and b/bin/images/tankU.gif differ diff --git a/bin/test/ImageTest.class b/bin/test/ImageTest.class new file mode 100644 index 0000000..b229c2c Binary files /dev/null and b/bin/test/ImageTest.class differ diff --git a/src/audio/explode.wav b/src/audio/explode.wav new file mode 100644 index 0000000..dc72ab1 Binary files /dev/null and b/src/audio/explode.wav differ diff --git a/src/audio/tank_fire.wav b/src/audio/tank_fire.wav new file mode 100644 index 0000000..85279eb Binary files /dev/null and b/src/audio/tank_fire.wav differ diff --git a/src/audio/tank_move.wav b/src/audio/tank_move.wav new file mode 100644 index 0000000..959b998 Binary files /dev/null and b/src/audio/tank_move.wav differ diff --git a/src/audio/war1.wav b/src/audio/war1.wav new file mode 100644 index 0000000..099a31e Binary files /dev/null and b/src/audio/war1.wav differ diff --git a/src/com/tank/Audio.java b/src/com/tank/Audio.java new file mode 100644 index 0000000..efcb8d6 --- /dev/null +++ b/src/com/tank/Audio.java @@ -0,0 +1,101 @@ + +package com.tank; + +import java.io.IOException; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.FloatControl; +import javax.sound.sampled.SourceDataLine; + +public class Audio { + + byte[] b = new byte[1024 * 1024 * 15]; + + + public void loop() { + try { + + while (true) { + int len = 0; + sourceDataLine.open(audioFormat, 1024 * 1024 * 15); + sourceDataLine.start(); + //System.out.println(audioInputStream.markSupported()); + audioInputStream.mark(12358946); + while ((len = audioInputStream.read(b)) > 0) { + sourceDataLine.write(b, 0, len); + } + audioInputStream.reset(); + + sourceDataLine.drain(); + sourceDataLine.close(); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + private AudioFormat audioFormat = null; + private SourceDataLine sourceDataLine = null; + private DataLine.Info dataLine_info = null; + + private AudioInputStream audioInputStream = null; + + public Audio(String fileName) { + try { + audioInputStream = AudioSystem.getAudioInputStream(Audio.class.getClassLoader().getResource(fileName)); + audioFormat = audioInputStream.getFormat(); + dataLine_info = new DataLine.Info(SourceDataLine.class, audioFormat); + sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLine_info); + //FloatControl volctrl=(FloatControl)sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN); + //volctrl.setValue(-40);// + + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void play() { + try { + byte[] b = new byte[1024*5]; + int len = 0; + sourceDataLine.open(audioFormat, 1024*5); + sourceDataLine.start(); + //System.out.println(audioInputStream.markSupported()); + audioInputStream.mark(12358946); + while ((len = audioInputStream.read(b)) > 0) { + sourceDataLine.write(b, 0, len); + } + // audioInputStream.reset(); + + sourceDataLine.drain(); + sourceDataLine.close(); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + + + public void close() { + try { + audioInputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + //Audio a = new Audio("audio/explode.wav"); + //Audio a = new Audio("audio/war1.wav"); + Audio a = new Audio("audio/tank_fire.wav"); + a.loop(); + // a.play(); + + } + +} diff --git a/src/com/tank/Bullet.java b/src/com/tank/Bullet.java new file mode 100644 index 0000000..2160b69 --- /dev/null +++ b/src/com/tank/Bullet.java @@ -0,0 +1,147 @@ +package com.tank; + +import java.awt.Graphics; +import java.awt.Rectangle; + +import com.tank.abstractfactory.BaseBullet; + +/** + * 定义子弹类 + * @author leiwei + * + */ +public class Bullet extends BaseBullet{ + + //子弹位置 + private int x; + private int y; + //子弹方向 + private Dir dir; + + //子弹速度 + private static final int SPEED = PropertyMrg.getInt("bulletSpeed"); + + //设置子弹的大小width,height + public static int width = ResouceMgr.bulletD.getWidth(); + + public static int height = ResouceMgr.bulletD.getHeight(); + //定义子弹是否存活 + private boolean living = true; + + TankFrame tf=null; + + private TankGroup group = TankGroup.BAD; + + + Rectangle rect = new Rectangle(); + + + + + public Dir getDir() { + return dir; + } + + public void setDir(Dir dir) { + this.dir = dir; + } + + public Bullet(int x, int y, Dir dir,TankGroup group,TankFrame tf) { + super(); + this.x = x; + this.y = y; + this.dir = dir; + this.tf = tf; + this.group = group; + rect.x = this.x; + rect.y = this.y; + rect.width = width; + rect.height = height; + //将子弹添加子弹队列中 + tf.bullets.add(this); + } + //子弹显示出来 + @Override + public void paint(Graphics p){ + if(!this.living){ + tf.bullets.remove(this); + } + /*//获取画笔原来颜色 + Color color = p.getColor(); + //设置将要画出的子弹颜色 + p.setColor(Color.red); + p.fillOval(x,y,width,height); + //画完子弹后将画笔颜色还原 + p.setColor(color);*/ + //将子弹根据方向画出来 + switch (dir) { + case LEFT: + p.drawImage(ResouceMgr.bulletL, x, y, null); + break; + case UP: + p.drawImage(ResouceMgr.bulletU, x, y, null); + break; + case RIGHT: + p.drawImage(ResouceMgr.bulletR, x, y, null); + break; + case DOWN: + p.drawImage(ResouceMgr.bulletD, x, y, null); + break; + } + + moving(); + } + + + public void moving(){ + //通过判断方向进行子弹的移动。 + switch(dir){ + case LEFT: + x-=SPEED; + break; + case UP: + y-=SPEED; + break; + case RIGHT: + x+=SPEED; + break; + case DOWN: + y+=SPEED; + break; + default: + break; + } + if(x<0 || y<0 || x > TankFrame.GAME_WIDTH || y>TankFrame.GAME_HEIGHT){ + this.living =false; + } + rect.x = this.x; + rect.y = this.y; + } + + @Override + public void collideWith(Tank t) { + if(this.group.equals(t.getGroup())){ + return; + } + + if(this.rect.intersects(t.rect)){ + t.die(); + this.die(); + int eX = t.getX() + Tank.width/2 - Explode.width/2; + int eY = t.getY() + Tank.height/2 - Explode.height/2; + tf.explodes.add(tf.gf.createExplode(eX, eY, tf)); + } + } + + public TankGroup getGroup() { + return group; + } + + public void setGroup(TankGroup group) { + this.group = group; + } + + private void die() { + this.living =false; + } +} diff --git a/src/com/tank/DefaultFireStrategy.java b/src/com/tank/DefaultFireStrategy.java new file mode 100644 index 0000000..2ebfc9e --- /dev/null +++ b/src/com/tank/DefaultFireStrategy.java @@ -0,0 +1,29 @@ +package com.tank; + +public class DefaultFireStrategy implements FireStartegy { +/* + private static final DefaultFireStrategy defaultFireStrategy = new DefaultFireStrategy(); + + private DefaultFireStrategy() { + } + + public static DefaultFireStrategy getDefualtFireStrategy(){ + return defaultFireStrategy; + } + */ + @Override + public void fire(Tank t) { + + //计算子弹的坐标 + int bX = t.x + Tank.width/2-Bullet.width/3; + int bY = t.y + Tank.width/2-Bullet.height/3; + + //可以添加多个子弹 + new Bullet(bX,bY,t.dir,t.group,t.tf); + /*if(t.group == TankGroup.GOOD){ + Audio a = new Audio("audio/tank_fire.wav"); + a.play(); + }*/ + } + +} diff --git a/src/com/tank/Dir.java b/src/com/tank/Dir.java new file mode 100644 index 0000000..93ea5b6 --- /dev/null +++ b/src/com/tank/Dir.java @@ -0,0 +1,6 @@ +package com.tank; + +public enum Dir { + //设置方向 + LEFT,RIGHT,UP,DOWN +} diff --git a/src/com/tank/Explode.java b/src/com/tank/Explode.java new file mode 100644 index 0000000..6d57261 --- /dev/null +++ b/src/com/tank/Explode.java @@ -0,0 +1,42 @@ +package com.tank; + +import java.awt.Graphics; +import java.awt.Rectangle; + +import com.tank.abstractfactory.BaseExplode; + +/** + * 爆炸 + * @author leiwei + * + */ +public class Explode extends BaseExplode{ + + private int x; + private int y; + + public static int width = ResouceMgr.explodes[0].getWidth(); + + public static int height = ResouceMgr.explodes[0].getHeight(); + + TankFrame tf=null; + + private int step = 0; + + public Explode(int x, int y,TankFrame tf) { + super(); + this.x = x; + this.y = y; + this.tf = tf; + } + //显示爆炸 + @Override + public void paint(Graphics p){ + int eX = this.x+Tank.width/2-Explode.width/2; + int eY = this.y+Tank.width/2-Explode.height/2; + p.drawImage(ResouceMgr.explodes[step++], eX, eY, null); + if(step >= ResouceMgr.explodes.length){ + tf.explodes.remove(this); + } + } +} diff --git a/src/com/tank/FireStartegy.java b/src/com/tank/FireStartegy.java new file mode 100644 index 0000000..413259d --- /dev/null +++ b/src/com/tank/FireStartegy.java @@ -0,0 +1,6 @@ +package com.tank; + +public interface FireStartegy { + + public void fire(Tank t); +} diff --git a/src/com/tank/FourDirFireStrategy.java b/src/com/tank/FourDirFireStrategy.java new file mode 100644 index 0000000..4688c97 --- /dev/null +++ b/src/com/tank/FourDirFireStrategy.java @@ -0,0 +1,38 @@ +package com.tank; + +import java.util.ArrayList; + +public class FourDirFireStrategy implements FireStartegy{ + /*private static FourDirFireStrategy fourDirFireStrategy ; + + private FourDirFireStrategy() { + } + + public static FourDirFireStrategy getFourDirFir(){ + + if(fourDirFireStrategy == null){ + synchronized (FourDirFireStrategy.class) { + if(fourDirFireStrategy == null){ + fourDirFireStrategy = new FourDirFireStrategy(); + } + } + } + return fourDirFireStrategy; + }*/ + + @Override + public void fire(Tank t) { + + //计算子弹的坐标 + int bX = t.x + Tank.width/2-Bullet.width/3; + int bY = t.y + Tank.width/2-Bullet.height/3; + Dir[] dirs = Dir.values(); + //可以添加多个子弹 + for(Dir dir : dirs){ + new Bullet(bX,bY,dir,t.group,t.tf); + } + + } + + +} diff --git a/src/com/tank/ImageUtil.java b/src/com/tank/ImageUtil.java new file mode 100644 index 0000000..f5d73c6 --- /dev/null +++ b/src/com/tank/ImageUtil.java @@ -0,0 +1,24 @@ +package com.tank; + +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; + +public class ImageUtil { + public static BufferedImage rotateImage(final BufferedImage bufferedimage, + final int degree) { + int w = bufferedimage.getWidth(); + int h = bufferedimage.getHeight(); + int type = bufferedimage.getColorModel().getTransparency(); + BufferedImage img; + Graphics2D graphics2d; + (graphics2d = (img = new BufferedImage(w, h, type)) + .createGraphics()).setRenderingHint( + RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_BILINEAR); + graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2); + graphics2d.drawImage(bufferedimage, 0, 0, null); + graphics2d.dispose(); + return img; + } +} diff --git a/src/com/tank/Main.java b/src/com/tank/Main.java new file mode 100644 index 0000000..b99b361 --- /dev/null +++ b/src/com/tank/Main.java @@ -0,0 +1,22 @@ +package com.tank; + +public class Main { + + public static void main(String[] args) throws InterruptedException { + TankFrame tf = new TankFrame(); + + int initTankCount = PropertyMrg.getInt("initTanCount"); + + //敌方坦克 + for(int i=0;i95){ + this.fire(); + randomDir(); + } + + //添加边界检测 + boundCheck(); + rect.x = this.x; + rect.y = this.y; + } + //碰撞边界方法 + private void boundCheck() { + if (this.x <2){ x = 2;} + if (this.y <28){ y = 28;} + if (this.x > (tf.getWidth() - Tank.width - 2)){ x = (tf.getWidth() - Tank.width - 2);} + if (this.y > (tf.getHeight() - Tank.height - 2)){ y = (tf.getHeight() - Tank.height - 2);} + } + + //随机给坦克一个方向 + private void randomDir() { + this.dir = Dir.values()[random.nextInt(4)]; + } + + @Override + public void paint(Graphics p){ + /*Color tankc = p.getColor(); + p.setColor(Color.BLUE); + //fillRect 绘制矩形 x,y是矩形相对弹窗原点坐标距离; windth 矩形的宽、height:矩形的高 + p.fillRect(x, y, 50, 50); + p.setColor(tankc);*/ + if(!this.living){ + tf.enemyTanks.remove(this); + } + //根据不同的方向显示不同方向的坦克 + switch (dir) { + case LEFT: + //将坦克的图片画出来 + p.drawImage(this.group == TankGroup.GOOD ? ResouceMgr.goodTankL:ResouceMgr.badTankL, x, y, null); + break; + case RIGHT: + //将坦克的图片画出来 + p.drawImage(this.group == TankGroup.GOOD ? ResouceMgr.goodTankR:ResouceMgr.badTankR, x, y, null); + break; + case UP: + //将坦克的图片画出来 + p.drawImage(this.group == TankGroup.GOOD ? ResouceMgr.goodTankU:ResouceMgr.badTankU, x, y, null); + break; + case DOWN: + //将坦克的图片画出来 + p.drawImage(this.group == TankGroup.GOOD ? ResouceMgr.goodTankD:ResouceMgr.badTankD, x, y, null); + break; + } + + + + moving(); + } + public void setDir(Dir dir) { + this.dir = dir; + } + + public void setMoving(boolean moving) { + this.moving = moving; + } + + + public void setX(int x) { + this.x = x; + } + + public void setY(int y) { + this.y = y; + } + + public void die() { + this.living =false; + } + +} diff --git a/src/com/tank/TankFrame.java b/src/com/tank/TankFrame.java new file mode 100644 index 0000000..ee07653 --- /dev/null +++ b/src/com/tank/TankFrame.java @@ -0,0 +1,207 @@ +package com.tank; + +import java.awt.Color; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; + +import com.tank.abstractfactory.BaseBullet; +import com.tank.abstractfactory.BaseExplode; +import com.tank.abstractfactory.DefaultFactory; +import com.tank.abstractfactory.GameFactory; +//TankFrame 继承Frame是为了重新Frame中的方法 +public class TankFrame extends Frame{ + //Tank + Tank myTank = new Tank(400,730,Dir.UP,TankGroup.GOOD,this); + //子弹 + public List bullets = new ArrayList(); +// Bullet bullet = new Bullet(600,600,Dir.UP); + static final int GAME_WIDTH = PropertyMrg.getInt("gameWidth") , GAME_HEIGHT = PropertyMrg.getInt("gameHeight"); + + //将敌人的坦克画出 + List enemyTanks = new ArrayList(); + + //爆炸 + List explodes = new ArrayList<>(); + + public GameFactory gf = new DefaultFactory(); + //构造方法 + public TankFrame(){ + this.setSize(GAME_WIDTH, GAME_HEIGHT); + this.setResizable(false); + this.setTitle("TankFrame继承Frame"); + this.setVisible(true); + this.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + System.exit(0); + } + }); + //设置键盘监听 + this.addKeyListener(new MyKeyListener()); + } + + //定义图片 + Image offScreenImage = null; + /** + * 屏幕中闪烁是因为屏幕刷新速度非常快,而内存加载 数据跟不上导致出现闪烁现象 + * 先在内存中将图片画出来,然后在将内存的图片显示在屏幕上(这样就可以消除闪烁的现象) + */ + @Override + public void update(Graphics p){ + //先在内存中设置图片大小 + if(null == offScreenImage){ + offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT); + } + //获取内存图片的画笔 + Graphics goffScreen = offScreenImage.getGraphics(); + //获取原来画笔的颜色 + Color c = goffScreen.getColor(); + //设置图片颜色 + goffScreen.setColor(Color.BLACK); + //将图片在内存中画出来 + goffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT); + //将原来的内存图片画笔颜色还原 + goffScreen.setColor(c); + paint(goffScreen); + //调用屏幕的画笔将图片在屏幕中一次性画出来(将内存中的内容复制到显存中) + p.drawImage(offScreenImage,0,0,null); + } + + //重写窗口重写绘制的时候自动执行的方法 + //Graphics 类似画笔 + @Override + public void paint(Graphics p){ + Color c = p.getColor(); + p.setColor(Color.WHITE); + p.drawString("子弹的数量:"+bullets.size(), 10, 60); + p.drawString("敌方坦克的数量:"+enemyTanks.size(), 10, 80); + p.setColor(c); + + myTank.paint(p); + + //将多个子弹画出 + //这种遍历方式在子弹类中进行删除子弹会报错,因为迭代器中不能再循环体外删除对象 + /*for(Bullet bullet : bullets){ + //子弹显示出来 + bullet.paint(p); + }*/ + for(int i=0;i