1.首先创建所有物体类及其所有物体定义类,在分别建立坦克类,水类,
铁,墙等障碍物类及其定义类,分别继承物体类和物体定义类,之后在
物体类和物体定义物类里添加共有属性,物体定义是用来说名物体的,
每个物体都有对应的定义属性
2.其次建立一个画板类Scene,用来画物体,同时创建一个窗口添加按钮
控制暂停,继续游戏与退出游戏,新游戏在,Scene中添加一个键盘监听,用来控制我方坦克移动和发射子弹
3.坦克移动和子弹移动的方向都就是x,y的加与减,可以用枚主类型来解决
4.总体思想是:一个线程控制所有物体的移动,画物体,一个集合将所有物体一起遍历,xml用来存每一关的障碍物。
package text.tanke;
import text.tanke.frame.MyFrame;
import text.tanke.objectscene.define.ObjectDefineHelper;
public class Start {
public static void main(String[] args) {
ObjectDefineHelper.INSTANCE.init();
new MyFrame();
}
}
package text.tanke.peizhi;
public class Config {
public static final int JFRAME_SIZE_X = 500;
public static final int JFRAME_SIZE_Y = 500;
public static final int SCENE_SIZE_X = 390;
public static final int SCENE_SIZE_Y = 390;
public static final int MYTANK_START_X = 120;
public static final int MYTANK_START_Y = 360;
public static final int TANK_TYPE1_YUAN_R = 10;
public static final int TANK_TYPE2_YUAN_R = 30;
public static final int DITANK_NUMBER = 4;
public static final int DITANK_START_Y = 0;
public static final int DITANK_ZHI_JIAN_JU_LI = 110;
public static final int FONT_SIZE = 25;
public static final int FONT_START_X = 100;
public static final int FONT_START_Y = 200;
public static final int OVAL_R = 10;
public static final int PAO_TONG_X = 15;
public static final int PAO_TONG_Y = 15;
public static final int PAO_TONG_CHANG_DU = 30;
public static final int GAME_ZUO_BORDER_X = 0;
public static final int GAME_YOU_BORDER_X = 360;
public static final int GAME_SHANG_BORDER_Y = 0;
public static final int GAME_XIA_BORDER_Y = 360;
public static final int ZIDAN_ZUO_BORDER_X = 0;
public static final int ZIDAN_YOU_BORDER_X = 390;
public static final int ZIDAN_SHANG_BORDER_Y = 0;
public static final int ZIDAN_XIA_BORDER_Y = 390;
public static final int DITANK_GUAI_WAN_STEEP = 30;
public static final int RUN_SLEEP_TIME = 40;
public static final int GAME_FONT_SIZE = 10;
public static final int MYGAME_ZI_START_X = 90;
public static final int DIGAME_ZI_START_X = 180;
public static final int MYGAME_LIFE_START_X = 170;
public static final int DIGAME_LIFE_START_X = 260;
public static final int LIFE_START_Y = 410;
public static final int MYTANK_START_LIFE = 3;
public static final int DITANK_START_LIFE = 30;
public static final int MAX_QIANG_NUMBER = 100;
public static final int MAX_TIE_NUMBER = 50;
public static final int MAX_WATER_NUMBER = 10;
public static final int PASS_TIME = 50;
public static final int TANKUPGRADE_FONT_SIZE = 15;
public static final int TANKUPGRADE_SIZE_WIDE = 30;
public static final int TANKUPGRADE_SIZE_HEIGHT = 30;
public static final int TANKUPGRADE_LIFE = 1;
}
package text.tanke.peizhi;
/**
*坦克,子弹方向
*/
public enum Fangxiang {
Shang(0, 0, -1), Xia(1, 0, 1), Zuo(2, -1, 0), You(3, 1, 0);
public int dirction;
public int xsudu;
public int ysudu;
Fangxiang(int dirction, int xsudu, int ysudu) {
this.dirction = dirction;
this.xsudu = xsudu;
this.ysudu = ysudu;
}
/**
*用于给敌方坦克变换方向
*/
public static Fangxiang parse(int id) {
for (Fangxiang f : values()) {
if (f.dirction == id) {
return f;
}
}
return null;
}
}
package text.tanke.peizhi;
/**
*用于计算敌我方坦克的生命
*/
public class Life {
public static int diLife = Config.DITANK_START_LIFE;
public static int myLife = Config.MYTANK_START_LIFE;
public static int getMyLife() {
return myLife;
}
public static void setMyLife(int myLife) {
Life.myLife = myLife;
}
public static void jianMyLife() {
myLife--;
}
public static int getDiLife() {
return diLife;
}
public static void setDiLife(int diLife) {
Life.diLife = diLife;
}
public static void jianDiLife() {
diLife--;
}
}
package text.tanke.peizhi;
/**
*所有物体的位置
*/
public class Position {
private int x;
private int y;
public Position(int x, int y) {
this.x = x;
this.y = y;
}
public void setX(int x) {
this.x = x;
}
public int getX() {
return x;
}
public void setY(int y) {
this.y = y;
}
public int getY() {
return y;
}
}
package text.tanke.util;
import java.util.Random;
/**
*敌方坦克每走一步多大概率改变方向
*/
public class RandomUtil {
private static final Random rand = new Random();
public static boolean randomjd(double time) {
return rand.nextDouble() <= time;
}
}
package text.tanke.util;
/**
*睡眠时间
*/
public class SleepUtil {
public static void sleep(int time) {
try {
Thread.sleep(time);
} catch (Exception e) {
}
}
}
package text.tanke.util;
/**
*用于判别敌我方的队伍
*/
public enum TeamUtil {
MyTeam(), DiTeam(), QianTeam(), TieTeam(), JidiTeam(), Water(),;
}
package text.tanke.util;
/**
*判断物体的类别
*/
public class TypeUtil {
public static final int TANK = 1;
public static final int BULLET = 2;
public static final int TIE = 3;
public static final int QIANG = 4;
public static final int JIDI = 5;
public static final int WATER = 6;
}
package text.tanke.frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import text.tanke.Scene.Scene;
import text.tanke.peizhi.Config;
import text.tanke.peizhi.Life;
public class MyFrame extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
Scene scene = null;
JMenuBar jb = null;
JMenu cd = null;
JMenuItem cdx1 = null;
JMenuItem cdx2 = null;
JMenuItem cdx3 = null;
JMenuItem cdx4 = null;
public MyFrame() {
scene = new Scene();
this.add(scene);
Thread xc = new Thread(scene);
xc.start();
this.addKeyListener(scene);
jb = new JMenuBar();
cd = new JMenu("菜单(G)");
cd.setMnemonic('G');
cdx1 = new JMenuItem("新游戏");
cdx2 = new JMenuItem("退出游戏");
cdx3 = new JMenuItem("继续游戏");
cdx4 = new JMenuItem("暂停");
cdx1.addActionListener(this);
cdx1.setActionCommand("X");
cdx2.addActionListener(this);
cdx2.setActionCommand("T");
cdx3.addActionListener(this);
cdx3.setActionCommand("J");
cdx4.addActionListener(this);
cdx4.setActionCommand("Z");
cd.add(cdx1);
cd.add(cdx2);
cd.add(cdx3);
cd.add(cdx4);
jb.add(cd);
this.setJMenuBar(jb);
this.setTitle("坦克大战");
this.setLocation(500,140);
this.setSize(Config.JFRAME_SIZE_X, Config.JFRAME_SIZE_Y);
this.setVisible(true);
this.setDefaultCloseOperation(3);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("X")) {
scene.init();//此方法是出始化
scene.setIsmyGame(true);
scene.setIsdiGame(true);
Life.setDiLife(Config.DITANK_START_LIFE);
Life.setMyLife(Config.MYTANK_START_LIFE);
scene.pause = false;//pase暂停
}
if (e.getActionCommand().equals("T")) {
System.exit(0);//退出系统
}
if (e.getActionCommand().equals("J")) {
scene.pause = false;
}
if (e.getActionCommand().equals("Z")) {
scene.pause = true;
}
}
}
package text.tanke.Scene;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.JPanel;
import text.tanke.objectscene.define.JidiDefine;
import text.tanke.objectscene.define.JidiDefineHelper;
import text.tanke.objectscene.define.QiangCheckpointDefine;
import text.tanke.objectscene.define.QiangDefine;
import text.tanke.objectscene.define.QiangDefineHelper;
import text.tanke.objectscene.define.TankDefine;
import text.tanke.objectscene.define.TankDefineHelper;
import text.tanke.objectscene.define.TankTypeDefine;
import text.tanke.objectscene.define.TieCheckpointDefine;
import text.tanke.objectscene.define.TieDefine;
import text.tanke.objectscene.define.TieDefineHelper;
import text.tanke.objectscene.define.WaterCheckpointDefine;
import text.tanke.objectscene.define.WaterDefine;
import text.tanke.objectscene.define.WaterDefineHelper;
import text.tanke.peizhi.Config;
import text.tanke.peizhi.Fangxiang;
import text.tanke.peizhi.Life;
import text.tanke.peizhi.Position;
import text.tanke.util.SleepUtil;
import text.tanke.util.TeamUtil;
import text.tanke.util.TypeUtil;
public class Scene extends JPanel implements Runnable, KeyListener {
private static final long serialVersionUID = 1L;
public Vector<ObjectScene> list = new Vector<ObjectScene>();
private boolean isGame = true;
public boolean pause = false;
private boolean ismyGame = true;
private boolean isdiGame = true;
private boolean ismytankMove = false;
private boolean ismytankBullet = false;
public static int gateNumber = 1;//关卡数
private int step = 0;
private Tank mytank;
private int Passtime = 1;
public void init() {
isGame = false;
list = new Vector<ObjectScene>();
TankTypeDefine define = TankDefineHelper.INSTANCE.tank_define.get(4);
TankDefine mydefine = define.level_define.get(1);
mytank = new Tank(new Position(Config.MYTANK_START_X, Config.MYTANK_START_Y), mydefine, Fangxiang.Shang, this,
TeamUtil.MyTeam);
list.add(mytank);
JidiDefine jidefine = JidiDefineHelper.INSTANCE.type_define.get(5);
Jidi jidi = new Jidi(new Position(jidefine.startx, jidefine.starty), jidefine, Fangxiang.Shang, this);
list.add(jidi);
for (int i = 0; i < Config.DITANK_NUMBER; i++) {
int ditype = (int) (Math.random() * 3 + 1);
TankTypeDefine definedi = TankDefineHelper.INSTANCE.tank_define.get(ditype);
TankDefine didefine = definedi.level_define.get(1);
Tank ditank = new Tank(new Position(Config.DITANK_ZHI_JIAN_JU_LI * i, Config.DITANK_START_Y), didefine,
Fangxiang.Xia, this, TeamUtil.DiTeam);
list.add(ditank);
}
addJidiQiang();
addObjectScene();
}
public void addJidiQiang() {
for (int i = 1; i < Config.MAX_QIANG_NUMBER; i++) {
QiangCheckpointDefine qiangdefine = QiangDefineHelper.INSTANCE.qiang_define.get(gateNumber);
QiangDefine qiangdefinei = qiangdefine.id_define.get(i);
if (qiangdefinei != null) {
Qiang qiang = new Qiang(new Position(qiangdefinei.startx, qiangdefinei.starty), qiangdefinei,
Fangxiang.Shang, this);
list.add(qiang);
}
}
}
public void addObjectScene() {
for (int i = 1; i < Config.MAX_TIE_NUMBER; i++) {
TieCheckpointDefine tiedefine = TieDefineHelper.INSTANCE.Tie_define.get(gateNumber);
TieDefine tiedefinei = tiedefine.id_define.get(i);
if (tiedefinei != null) {
Tie tie = new Tie(new Position(tiedefinei.startx, tiedefinei.starty), tiedefinei, Fangxiang.Shang,
this);
list.add(tie);
}
}
for (int i = 0; i < Config.MAX_WATER_NUMBER; i++) {
WaterCheckpointDefine waterdefine = WaterDefineHelper.INSTANCE.water_define.get(gateNumber);
WaterDefine waterdefinei = waterdefine.id_define.get(i);
if (waterdefinei != null) {
Water water = new Water(new Position(waterdefinei.startx, waterdefinei.starty), waterdefinei,
Fangxiang.Shang, this);
list.add(water);
}
}
}
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, Config.SCENE_SIZE_X, Config.SCENE_SIZE_Y);
if (isGame) {//没有新游戏之前的面板
Font font = new Font("楷书", Font.BOLD, Config.FONT_SIZE);
g.setFont(font);
g.setColor(Color.RED);
g.drawString("第零关,准备开始", Config.FONT_START_X, Config.FONT_START_Y);
} else if (!isGame) {
TankShuLiang(g);
judeWinOrLose(g);
for (int i = 0; i < list.size(); i++) {
ObjectScene object = list.get(i);
object.drawColor(g);
object.drawMySelf(g);
}
}
}
public void judeWinOrLose(Graphics g) {
if (!ismyGame) {
Font font = new Font("楷书", Font.BOLD, Config.FONT_SIZE);
g.setFont(font);
g.setColor(Color.RED);
g.drawString("很遗憾!你输了", Config.FONT_START_X, Config.FONT_START_Y);
} else if (!isdiGame) {
Font font = new Font("楷书", Font.BOLD, Config.FONT_SIZE);
g.setFont(font);
g.setColor(Color.RED);
g.drawString("你赢了,进入下一关", Config.FONT_START_X, Config.FONT_START_Y);
if (gateNumber < 2) {
gateNumber++;
} else if (gateNumber > 2) {
gateNumber = 1;
}
pause = true;
}
}
/**
*记录敌我双方坦克生命
*/
public void TankShuLiang(Graphics g) {
Font font = new Font(“楷书”, Font.BOLD, Config.GAME_FONT_SIZE);
g.setFont(font);
g.setColor(Color.RED);
g.drawString(“红方生命数量:”, Config.MYGAME_ZI_START_X, Config.LIFE_START_Y);
g.drawString(Life.myLife + “”, Config.MYGAME_LIFE_START_X, Config.LIFE_START_Y);
g.setColor(Color.BLUE);
g.drawString(“敌方生命数量:”, Config.DIGAME_ZI_START_X, Config.LIFE_START_Y);
g.drawString(Life.diLife + “”, Config.DIGAME_LIFE_START_X, Config.LIFE_START_Y);
}
@Override
public void run() {
while (true) {
passSuspend();
while (!pause && ismyGame && isdiGame) {
SleepUtil.sleep(Config.RUN_SLEEP_TIME);
for (int i = 0; i < list.size(); i++) {
step = 0;
ObjectScene objecti = list.get(i);
objecti.launchBullet();
ArrayList<ObjectScene> colision = new ArrayList<ObjectScene>();
for (int j = 0; j < list.size(); j++) {
ObjectScene objecctj = list.get(j);
if (objecti != objecctj && judecolision(objecti, objecctj)) {
if (objecti.type == TypeUtil.TANK && objecctj.type == TypeUtil.TANK) {
objecti.move();
}
}
}
objecti.move();
for (int j = 0; j < list.size(); j++) {
ObjectScene objecctj = list.get(j);
if (objecti != objecctj && judecolision(objecti, objecctj)) {
colision.add(objecctj);
}
}
colision(objecti, colision);
addNewTank(objecti, colision);
}
anJianSet();
this.repaint();
}
SleepUtil.sleep(Config.RUN_SLEEP_TIME);
}
}
/**
*通关后进入下一关的停顿时间
*/
public void passSuspend() {
if (!isdiGame) {
if (Passtime < Config.PASS_TIME) {
Passtime++;
} else if (Passtime >= Config.PASS_TIME) {
init();
Life.setDiLife(Config.DITANK_START_LIFE);
setIsmyGame(true);
setIsdiGame(true);
Passtime = 1;
pause = false;
}
}
if (ismyGame && isdiGame) {
anJianSet();
}
}
/**
*判断是否碰撞
*/
public boolean judecolision(ObjectScene objecti, ObjectScene objectj) {
if (Math.abs(objecti.position.getX() + objecti.define.width / 2 - objectj.position.getX()
- objectj.define.width / 2) <= (objecti.define.width + objectj.define.width) / 2) {
if (Math.abs(objecti.position.getY() + objecti.define.height / 2 - objectj.position.getY()
- objectj.define.height / 2) <= (objecti.define.height + objectj.define.height) / 2) {
return true;
}
}
return false;
}
/**
*碰撞处理
*/
public void colision(ObjectScene objecti, ArrayList colision) {
for (ObjectScene so : colision) {
switch (objecti.type) {
case TypeUtil.TANK:
switch (so.type) {
case TypeUtil.TANK:
objecti.back();
break;
case TypeUtil.TIE:
case TypeUtil.QIANG:
case TypeUtil.WATER:
if (step == 0) {//碰到个障碍物或坦克只让退一步
objecti.back();
step++;
}
break;
case TypeUtil.BULLET:
if (objecti.team != so.team) {
objecti.life–;
so.life–;
if (objecti.life == 0) {
list.remove(objecti);
}
if (so.life == 0) {
list.remove(so);
}
}
break;
}
break;
case TypeUtil.BULLET:
if (objecti.team != so.team && so.type != TypeUtil.WATER) {
objecti.life–;
if (so.type != TypeUtil.TIE && so.type != TypeUtil.WATER) {
so.life–;
if (so.type == TypeUtil.JIDI) {
ismyGame = false;
}
}
if (objecti.life == 0) {
list.remove(objecti);
}
if (so.life == 0) {
list.remove(so);
}
}
break;
}
}
}
/**
*死一个坦克后判断是否添加新坦克
*/
public void addNewTank(ObjectScene objecti, ArrayList colision) {
for (ObjectScene so : colision) {
if (objecti.type == TypeUtil.TANK && so.type == TypeUtil.BULLET && objecti.life == 0) {
if (objecti.team == TeamUtil.MyTeam && so.team == TeamUtil.DiTeam) {
Life.jianMyLife();
if (Life.getMyLife() == 0) {
ismyGame = false;
}
if (Life.getMyLife() > 0) {
TankTypeDefine define = TankDefineHelper.INSTANCE.tank_define.get(4);
TankDefine mydefine = define.level_define.get(1);
mytank = new Tank(new Position(Config.MYTANK_START_X, Config.MYTANK_START_Y), mydefine,
Fangxiang.Shang, this, TeamUtil.MyTeam);
list.add(mytank);
}
} else if (objecti.team == TeamUtil.DiTeam && so.team == TeamUtil.MyTeam) {
Life.jianDiLife();
if (Life.getDiLife() == 0) {
isdiGame = false;
}
if (Life.getDiLife() > 3) {
int ditype = (int) (Math.random() * 3 + 1);
int i = (int) (Math.random() * 4);
TankTypeDefine definedi = TankDefineHelper.INSTANCE.tank_define.get(ditype);
TankDefine didefine = definedi.level_define.get(1);
Tank ditank = new Tank(new Position(Config.DITANK_ZHI_JIAN_JU_LI * i, Config.DITANK_START_Y),
didefine, Fangxiang.Xia, this, TeamUtil.DiTeam);
list.add(ditank);
}
}
} else if (objecti.type == TypeUtil.BULLET && so.type == TypeUtil.TANK && so.life == 0) {
if (objecti.team == TeamUtil.DiTeam && so.team == TeamUtil.MyTeam) {
Life.jianMyLife();
if (Life.getMyLife() == 0) {
ismyGame = false;
}
if (Life.getMyLife() > 0) {
TankTypeDefine define = TankDefineHelper.INSTANCE.tank_define.get(4);
TankDefine mydefine = define.level_define.get(1);
mytank = new Tank(new Position(Config.MYTANK_START_X, Config.MYTANK_START_Y), mydefine,
Fangxiang.Shang, this, TeamUtil.MyTeam);
list.add(mytank);
}
} else if (objecti.team == TeamUtil.MyTeam && so.team == TeamUtil.DiTeam) {
Life.jianDiLife();
if (Life.getDiLife() == 0) {
isdiGame = false;
}
if (Life.getDiLife() > 3) {
int ditype = (int) (Math.random() * 3 + 1);
int i = (int) (Math.random() * 4);
TankTypeDefine definedi = TankDefineHelper.INSTANCE.tank_define.get(ditype);
TankDefine didefine = definedi.level_define.get(1);
Tank ditank = new Tank(new Position(Config.DITANK_ZHI_JIAN_JU_LI * i, Config.DITANK_START_Y),
didefine, Fangxiang.Xia, this, TeamUtil.DiTeam);
list.add(ditank);
}
}
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
ArrayList<String> set = new ArrayList<>();
//根据键盘是否按下来控制集合删减
@Override
public void keyReleased(KeyEvent e) {
set.remove(e.getKeyCode() + "");
}
@Override
public void keyPressed(KeyEvent e) {
String str = e.getKeyCode() + "";
if (!set.contains(str)) {
set.add(str);
}
}
private void anJianSet() {
String pausex = null;
String fangxiang = null;
String zidan = null;
for (String s : set) {
switch (s) {
case KeyEvent.VK_A + "":
case KeyEvent.VK_W + "":
case KeyEvent.VK_S + "":
case KeyEvent.VK_D + "":
fangxiang = s;
case KeyEvent.VK_J + "":
zidan = s;
case KeyEvent.VK_P + "":
pausex = s;
}
}
if (zidan != null && !pause) {
anJianZhiXin(zidan);
}
if (fangxiang != null && !pause) {
anJianZhiXin(fangxiang);
} else if (fangxiang == null) {
ismytankMove = false;
}
if (pausex != null) {
anJianZhiXin(pausex);
}
}
/**
*在我方坦克的move中是否可以发子弹与移动,并暂停
*/
private void anJianZhiXin(String s) {
int code = Integer.parseInt(s);
switch (code) {
case KeyEvent.VK_W:
mytank.fx = Fangxiang.Shang;
ismytankMove = true;
break;
case KeyEvent.VK_S:
mytank.fx = Fangxiang.Xia;
ismytankMove = true;
break;
case KeyEvent.VK_A:
mytank.fx = Fangxiang.Zuo;
ismytankMove = true;
break;
case KeyEvent.VK_D:
mytank.fx = Fangxiang.You;
ismytankMove = true;
break;
case KeyEvent.VK_J:
ismytankBullet = true;
break;
case KeyEvent.VK_P:
pause = !pause;
}
}
public void setIsmyGame(boolean ismyGame) {
this.ismyGame = ismyGame;
}
public void setIsdiGame(boolean isdiGame) {
this.isdiGame = isdiGame;
}
public boolean getIsmytankMove() {
return ismytankMove;
}
public void setIsmytankBullet(boolean ismytankBullet) {
this.ismytankBullet = ismytankBullet;
}
public boolean getIsmytankBullet() {
return ismytankBullet;
}
}
package text.tanke.Scene;
import java.awt.Graphics;
import text.tanke.objectscene.define.ObjectDefine;
import text.tanke.peizhi.Fangxiang;
import text.tanke.peizhi.Position;
import text.tanke.util.TeamUtil;
public abstract class ObjectScene {
protected ObjectDefine define;
protected Position position;
protected Fangxiang fx;
protected Scene scene;
protected boolean shengming = true;
protected int type;
protected int life;
protected TeamUtil team;
public ObjectScene(Position position, ObjectDefine define, Fangxiang fx, Scene scene, TeamUtil team) {
this.position = position;
this.define = define;
this.fx = fx;
this.scene = scene;
this.team = team;
}
public abstract ObjectDefine getDefine();
public abstract void move();
public abstract void back();
public abstract void drawColor(Graphics g);
public abstract void drawMySelf(Graphics g);
public abstract void launchBullet();
}
package text.tanke.Scene;
import java.awt.Color;
import java.awt.Graphics;
import text.tanke.objectscene.define.BulletDefine;
import text.tanke.objectscene.define.BulletDefineHelper;
import text.tanke.objectscene.define.TankDefine;
import text.tanke.peizhi.Config;
import text.tanke.peizhi.Fangxiang;
import text.tanke.peizhi.Position;
import text.tanke.util.RandomUtil;
import text.tanke.util.TeamUtil;
import text.tanke.util.TypeUtil;
public class Tank extends ObjectScene {
public Tank(Position position, TankDefine define, Fangxiang fx, Scene scene, TeamUtil team) {
super(position, define, fx, scene, team);
this.type = TypeUtil.TANK;
this.life = define.life;
}
private int steep = 0;
private int time = 0;
Bullet bullet = null;
@Override
public void move() {
if (getDefine().color != 4) {
if (RandomUtil.randomjd(0.155) && steep > Config.DITANK_GUAI_WAN_STEEP) {
int r = (int) (Math.random() * 4);
fx = Fangxiang.parse(r);
steep = 0;
}
steep++;
moveCoordinate();
} else if (getDefine().color == 4) {
if (scene.getIsmytankMove()) {
moveCoordinate();
}
}
}
public void moveCoordinate() {
position.setX(position.getX() + getDefine().speed * fx.xsudu);
if (position.getX() < Config.GAME_ZUO_BORDER_X) {
position.setX(Config.GAME_ZUO_BORDER_X);
}
if (position.getX() > Config.GAME_YOU_BORDER_X) {
position.setX(Config.GAME_YOU_BORDER_X);
}
position.setY(position.getY() + getDefine().speed * fx.ysudu);
if (position.getY() < Config.GAME_SHANG_BORDER_Y) {
position.setY(Config.GAME_SHANG_BORDER_Y);
}
if (position.getY() > Config.GAME_XIA_BORDER_Y) {
position.setY(Config.GAME_XIA_BORDER_Y);
}
}
@Override
public void drawColor(Graphics g) {
if (getDefine().color >= 4) {
g.setColor(Color.RED);
} else {
if (this.life == 1) {
g.setColor(Color.BLUE);
} else if (this.life == 2) {
g.setColor(Color.WHITE);
} else if (this.life == 3) {
g.setColor(Color.GREEN);
}
}
}
@Override
public void drawMySelf(Graphics g) {
g.drawLine(position.getX() + Config.PAO_TONG_X, position.getY() + Config.PAO_TONG_Y,
position.getX() + Config.PAO_TONG_X + Config.PAO_TONG_CHANG_DU * fx.xsudu,
position.getY() + Config.PAO_TONG_Y + Config.PAO_TONG_CHANG_DU * fx.ysudu);
if (getDefine().color == 1) {
g.drawRect(position.getX(), position.getY(), getDefine().width, getDefine().height);
g.fillOval(position.getX() + Config.TANK_TYPE1_YUAN_R, position.getY() + Config.TANK_TYPE1_YUAN_R,
Config.TANK_TYPE1_YUAN_R, Config.TANK_TYPE1_YUAN_R);
} else if (getDefine().color == 2) {
g.fillOval(position.getX(), position.getY(), Config.TANK_TYPE2_YUAN_R, Config.TANK_TYPE2_YUAN_R);
} else if (getDefine().color == 3) {
g.drawRect(position.getX(), position.getY(), getDefine().width, getDefine().height);
g.fillRect(position.getX() + getDefine().width / 6, position.getY() + getDefine().height / 6,
getDefine().width * 2 / 3, getDefine().height * 2 / 3);
} else if (getDefine().color == 4) {
if (getDefine().level == 1) {
g.drawRect(position.getX(), position.getY(), getDefine().width, getDefine().height);
g.fillOval(position.getX() + Config.TANK_TYPE1_YUAN_R, position.getY() + Config.TANK_TYPE1_YUAN_R,
Config.TANK_TYPE1_YUAN_R, Config.TANK_TYPE1_YUAN_R);
} else if (getDefine().level == 2) {
g.drawRect(position.getX(), position.getY(), getDefine().width, getDefine().height);
g.fillRect(position.getX() + getDefine().width / 3, position.getY() + getDefine().height / 3,
getDefine().width / 3, getDefine().height / 3);
} else if (getDefine().level == 3) {
g.drawRect(position.getX(), position.getY(), getDefine().width, getDefine().height);
g.fillRect(position.getX() + getDefine().width / 3, position.getY() + getDefine().height / 3,
getDefine().width / 3, getDefine().height / 3);
g.drawOval(position.getX(), position.getY(), getDefine().width, getDefine().height);
}
}
}
@Override
public void launchBullet() {
if (getDefine().color < 4) {
time++;
if (time >= 45) {
time = 0;
BulletDefine bulletdefine = BulletDefineHelper.INSTANCE.type_define.get(1);
bullet = new Bullet(
new Position(position.getX() + getDefine().width / 2, position.getY() + getDefine().height / 2),
bulletdefine, fx, scene, TeamUtil.DiTeam);
scene.list.add(bullet);
}
} else {
if (scene.getIsmytankBullet()) {
if (bullet == null || !bullet.shengming || bullet.life <= 0) {
BulletDefine bulletdefine = BulletDefineHelper.INSTANCE.type_define.get(1);
bullet = new Bullet(
new Position(position.getX() + getDefine().width / 2,
position.getY() + getDefine().height / 2),
bulletdefine, fx, scene, TeamUtil.MyTeam);
scene.list.add(bullet);
}
}
scene.setIsmytankBullet(false);
}
}
@Override
public void back() {
position.setX(position.getX() - getDefine().speed * fx.xsudu);
if (position.getX() < Config.GAME_ZUO_BORDER_X) {
position.setX(Config.GAME_ZUO_BORDER_X);
}
if (position.getX() > Config.GAME_YOU_BORDER_X) {
position.setX(Config.GAME_YOU_BORDER_X);
}
position.setY(position.getY() - getDefine().speed * fx.ysudu);
if (position.getY() < Config.GAME_SHANG_BORDER_Y) {
position.setY(Config.GAME_SHANG_BORDER_Y);
}
if (position.getY() > Config.GAME_XIA_BORDER_Y) {
position.setY(Config.GAME_XIA_BORDER_Y);
}
}
@Override
public TankDefine getDefine() {
return (TankDefine) define;
}
}
package text.tanke.Scene;
import java.awt.Color;
import java.awt.Graphics;
import text.tanke.objectscene.define.BulletDefine;
import text.tanke.peizhi.Config;
import text.tanke.peizhi.Fangxiang;
import text.tanke.peizhi.Position;
import text.tanke.util.TeamUtil;
import text.tanke.util.TypeUtil;
public class Bullet extends ObjectScene {
public Bullet(Position position, BulletDefine define, Fangxiang fx, Scene scene, TeamUtil team) {
super(position, define, fx, scene, team);
this.type = TypeUtil.BULLET;
this.life = define.life;
}
@Override
public void move() {
position.setX(position.getX() + getDefine().speed * fx.xsudu);
position.setY(position.getY() + getDefine().speed * fx.ysudu);
if (position.getX() < Config.ZIDAN_ZUO_BORDER_X || position.getX() > Config.ZIDAN_YOU_BORDER_X
|| position.getY() < Config.ZIDAN_SHANG_BORDER_Y || position.getY() > Config.ZIDAN_XIA_BORDER_Y) {
shengming = false;
}
}
@Override
public void drawColor(Graphics g) {
g.setColor(Color.WHITE);
}
@Override
public void drawMySelf(Graphics g) {
if (getDefine().type == 1) {
g.fillRect(position.getX(), position.getY(), getDefine().height, getDefine().width);
} else if (getDefine().type == 2) {
g.fillOval(position.getX(), position.getY(), getDefine().height, getDefine().width);
} else if (getDefine().type == 3) {
g.drawRect(position.getX(), position.getY(), getDefine().height, getDefine().width);
g.fillOval(position.getX(), position.getY(), getDefine().height, getDefine().width);
}
}
@Override
public void back() {
}
@Override
public BulletDefine getDefine() {
return (BulletDefine) define;
}
@Override
public void launchBullet() {
// TODO Auto-generated method stub
}
}
package text.tanke.Scene;
import java.awt.Color;
import java.awt.Graphics;
import text.tanke.objectscene.define.QiangDefine;
import text.tanke.peizhi.Fangxiang;
import text.tanke.peizhi.Position;
import text.tanke.util.TeamUtil;
import text.tanke.util.TypeUtil;
public class Qiang extends ObjectScene {
public Qiang(Position position, QiangDefine define, Fangxiang fx, Scene scene) {
super(position, define, fx, scene, TeamUtil.QianTeam);
this.type = TypeUtil.QIANG;
this.life = getDefine().life;
}
@Override
public void drawColor(Graphics g) {
g.setColor(Color.RED);
}
@Override
public void drawMySelf(Graphics g) {
g.drawRect(position.getX(), position.getY(), getDefine().width, getDefine().height);
}
@Override
public QiangDefine getDefine() {
return (QiangDefine) define;
}
@Override
public void move() {
}
@Override
public void back() {
}
@Override
public void launchBullet() {
}
}
package text.tanke.Scene;
import java.awt.Color;
import java.awt.Graphics;
import text.tanke.objectscene.define.TieDefine;
import text.tanke.peizhi.Fangxiang;
import text.tanke.peizhi.Position;
import text.tanke.util.TeamUtil;
import text.tanke.util.TypeUtil;
public class Tie extends ObjectScene {
public Tie(Position position, TieDefine define, Fangxiang fx, Scene scene) {
super(position, define, fx, scene, TeamUtil.TieTeam);
this.type = TypeUtil.TIE;
this.life = getDefine().life;
}
@Override
public void drawColor(Graphics g) {
g.setColor(Color.WHITE);
}
@Override
public void drawMySelf(Graphics g) {
g.drawRect(position.getX(), position.getY(), getDefine().width, getDefine().height);
}
@Override
public TieDefine getDefine() {
return (TieDefine) define;
}
@Override
public void move() {
}
@Override
public void back() {
}
@Override
public void launchBullet() {
}
}
package text.tanke.Scene;
import java.awt.Color;
import java.awt.Graphics;
import text.tanke.objectscene.define.JidiDefine;
import text.tanke.peizhi.Fangxiang;
import text.tanke.peizhi.Position;
import text.tanke.util.TeamUtil;
import text.tanke.util.TypeUtil;
public class Jidi extends ObjectScene {
public Jidi(Position position, JidiDefine define, Fangxiang fx, Scene scene) {
super(position, define, fx, scene, TeamUtil.JidiTeam);
this.type = TypeUtil.JIDI;
this.life = getDefine().life;
}
@Override
public void drawColor(Graphics g) {
g.setColor(Color.BLACK);
}
@Override
public void drawMySelf(Graphics g) {
g.fillRect(position.getX(), position.getY(), getDefine().width, getDefine().height);
}
@Override
public JidiDefine getDefine() {
return (JidiDefine) define;
}
@Override
public void move() {
}
@Override
public void back() {
}
@Override
public void launchBullet() {
}
}
package text.tanke.Scene;
import java.awt.Color;
import java.awt.Graphics;
import text.tanke.objectscene.define.WaterDefine;
import text.tanke.peizhi.Fangxiang;
import text.tanke.peizhi.Position;
import text.tanke.util.TeamUtil;
import text.tanke.util.TypeUtil;
public class Water extends ObjectScene {
public Water(Position position, WaterDefine define, Fangxiang fx, Scene scene) {
super(position, define, fx, scene, TeamUtil.Water);
this.type = TypeUtil.WATER;
this.life = getDefine().life;
}
@Override
public void drawColor(Graphics g) {
g.setColor(Color.BLUE);
}
@Override
public void drawMySelf(Graphics g) {
g.fillRect(position.getX(), position.getY(), getDefine().width, getDefine().height);
}
@Override
public WaterDefine getDefine() {
return (WaterDefine) define;
}
@Override
public void move() {
}
@Override
public void back() {
}
@Override
public void launchBullet() {
}
}
package text.tanke.util;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
*读取xml的基本工具
*/
public class XmlReader {
public static Element getRootElement(String path) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 获取生成 DOM 对象树的解析器
DocumentBuilder docBuilder = factory.newDocumentBuilder();
// 应用程序员可以从 XML 获取一个 Document
Document doc = docBuilder.parse(path);// 将给定文件的内容解析为一个 XML 文档,并且返回一个新的 DOM Document
doc.normalize();
NodeList nodeList = doc.getElementsByTagName("config");// 按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList
return (Element) nodeList.item(0);// 返回集合中的第 index 个项
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static ArrayList<Element> parseElements(Element root, String tagName) {
NodeList nodeList = root.getElementsByTagName(tagName);
ArrayList<Element> list = new ArrayList<>();
for (int i = 0; i < nodeList.getLength(); i++) {
list.add((Element) nodeList.item(i));
}
return list;
}
public static Element parseElement(Element root, String tagName) {
NodeList nodeList = root.getElementsByTagName(tagName);
return (Element) nodeList.item(0);
}
}
package text.tanke.objectscene.define;
public class ObjectDefine {
public int life;
public final int width;
public final int height;
public ObjectDefine(int life, int width, int height) {
this.life = life;
this.width = width;
this.height = height;
}
}
package text.tanke.objectscene.define;
import org.w3c.dom.Element;
import text.tanke.util.XmlReader;
public class ObjectDefineHelper {
public static final ObjectDefineHelper INSTANCE = new ObjectDefineHelper();
private ObjectDefineHelper() {
}
public void init() {
String path = System.getProperty("user.dir");
Element root = XmlReader.getRootElement(path + "/config/define.xml");
TankDefineHelper.INSTANCE.init(root);
BulletDefineHelper.INSTANCE.init(root);
TieDefineHelper.INSTANCE.init(root);
QiangDefineHelper.INSTANCE.init(root);
JidiDefineHelper.INSTANCE.init(root);
WaterDefineHelper.INSTANCE.init(root);
}
}
package text.tanke.util;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class XmlReader {
public static Element getRootElement(String path) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document doc = docBuilder.parse(path);
doc.normalize();
NodeList nodeList = doc.getElementsByTagName("config");
return (Element) nodeList.item(0);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static ArrayList<Element> parseElements(Element root, String tagName) {
NodeList nodeList = root.getElementsByTagName(tagName);
ArrayList<Element> list = new ArrayList<>();
for (int i = 0; i < nodeList.getLength(); i++) {
list.add((Element) nodeList.item(i));
}
return list;
}
public static Element parseElement(Element root, String tagName) {
NodeList nodeList = root.getElementsByTagName(tagName);
return (Element) nodeList.item(0);
}
}
package text.tanke.objectscene.define;
import org.w3c.dom.Element;
public class BulletDefine extends ObjectDefine {
public final int speed;
public final int type;
public BulletDefine(int life, int width, int height, int speed, int type) {
super(life, width, height);
this.speed = speed;
this.type = type;
}
public static BulletDefine init(Element root) {
int life = Integer.parseInt(root.getAttribute("life"));
int width = Integer.parseInt(root.getAttribute("width"));
int height = Integer.parseInt(root.getAttribute("height"));
int sudu = Integer.parseInt(root.getAttribute("speed"));
int type = Integer.parseInt(root.getAttribute("type"));
return new BulletDefine(life, width, height, sudu, type);
}
}
package text.tanke.objectscene.define;
import java.util.ArrayList;
import java.util.HashMap;
import org.w3c.dom.Element;
import text.tanke.util.XmlReader;
public class BulletDefineHelper {
public static final BulletDefineHelper INSTANCE = new BulletDefineHelper();
public final HashMap