@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||||
|
<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>Javatank</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
@ -0,0 +1,2 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
encoding/<project>=UTF-8
|
@ -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
|
@ -0,0 +1,9 @@
|
|||||||
|
#设置坦克数量
|
||||||
|
initTanCount=5
|
||||||
|
tankSpeed=5
|
||||||
|
bulletSpeed=10
|
||||||
|
gameWidth=1080
|
||||||
|
gameHeight=720
|
||||||
|
#fire
|
||||||
|
goodFS=com.tank.FourDirFireStrategy
|
||||||
|
badFS=com.tank.DefaultFireStrategy
|
After Width: | Height: | Size: 824 B |
After Width: | Height: | Size: 868 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 936 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 8.0 KiB |
After Width: | Height: | Size: 8.0 KiB |
After Width: | Height: | Size: 8.2 KiB |
After Width: | Height: | Size: 8.2 KiB |
After Width: | Height: | Size: 855 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 852 B |
After Width: | Height: | Size: 847 B |
After Width: | Height: | Size: 312 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1022 B |
After Width: | Height: | Size: 814 B |
After Width: | Height: | Size: 460 B |
After Width: | Height: | Size: 280 B |
After Width: | Height: | Size: 565 B |
After Width: | Height: | Size: 846 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 864 B |
After Width: | Height: | Size: 863 B |
After Width: | Height: | Size: 861 B |
After Width: | Height: | Size: 863 B |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 670 B |
After Width: | Height: | Size: 680 B |
After Width: | Height: | Size: 677 B |
After Width: | Height: | Size: 660 B |
After Width: | Height: | Size: 691 B |
After Width: | Height: | Size: 674 B |
After Width: | Height: | Size: 271 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.3 KiB |
@ -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();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package com.tank;
|
||||||
|
|
||||||
|
public enum Dir {
|
||||||
|
//设置方向
|
||||||
|
LEFT,RIGHT,UP,DOWN
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package com.tank;
|
||||||
|
|
||||||
|
public interface FireStartegy {
|
||||||
|
|
||||||
|
public void fire(Tank t);
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|