坦克大战(总章程)
本章内容:写出子弹,画出子弹以及坦克,还有背景。
----------
我们下先创建一个子弹类
public class Bullet implements Runnable{
private int x;
private int y;
private int direction;
private int speed =3;
private boolean life = true;
public boolean isLife(){
return life;
}
public void setLife(boolean life) {
this.life = life;
}
public void setDirection(int direction){
this.direction = direction;
}
public int getDirection(int direction){
return direction;
}
Bullet(int x,int y,int direction){
this.x=x;
this.y=y;
this.direction = direction;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
//重写run方法
@Override
public void run() {
while(true) {
try {
//抛出异常
Thread.sleep(16);
} catch (InterruptedException e) {
e.printStackTrace();
}
//方向
switch (this.direction){
case 0:
this.y -=speed;
break;
case 1:
this.x -=speed;
break;
case 2:
this.y +=speed;
break;
case 3:
this.x +=speed;
break;
}
//判断子弹是否出界
if(this.x<0 || this.x>1500 || this.y<0 ||this.y>800){
this.life = false;
break;
}
}
}
}
设置一些基本的内容,以及初始化。
MyTank mytank = null;
FriendTank friendtank = null;
private boolean Enemy=true;
private boolean my=true;
private int enemy=0;
// EnemyTank enemyTank = null;
//集合类存放敌方坦克
Vector<EnemyTank> enemyTankVetor = new Vector<>();
//存放炸弹图片
Vector<Bomb> bombs = new Vector<Bomb>();
//敌方坦克数量
int enemyTankNum = 3;
然后创建一个画布类(MyPanel)
MyPanel() {
mytank = new MyTank(100, 100); //初始化坦克位置
friendtank = new FriendTank(700,100);
for(int i=0;i<enemyTankNum;i++){
EnemyTank enemyTank = new EnemyTank(i*281+5,i*181+5);
enemyTank.setLife(true);
enemyTankVetor.add(enemyTank); //推到Vetor里
//创造地方线程后自己动
Thread thread = new Thread(enemyTank);
thread.start();
}
}
然后构造一个画笔函数(paint)
@Override
public void paint(Graphics graphics) {
int flag=0;
super.paint(graphics);
//背景画布
graphics.fillRect(0, 0, 1500, 800); //画布大小
if(prop.isLife()) { //判断道具被吃了没
graphics.drawImage(image9, prop.getX(), prop.getY(), null);
}
//画坦克
if (mytank.isLife()) { //判断是否存活
if(mytank.getX()>0&&mytank.getX()<1480&&mytank.getY()>0&&mytank.getY()<780)
drawTank(mytank.getX(), mytank.getY() , graphics, 0, mytank.getDirection());
}
if(friendtank.isLife()) //判断是否存活
if(friendtank.getX()>0&&friendtank.getX()<1480&&friendtank.getY()>0&&friendtank.getY()<780)
drawTank(friendtank.getX(),friendtank.getY(),graphics,2,friendtank.getDirection());
//画敌方坦克
// if(mytank.isLife()==false && friendtank.isLife()==false){
// JOptionPane.showMessageDialog(null, String.valueOf("你们输了"));
// return;
// }
flag=0;
for(int i=0;i<enemyTankVetor.size();i++){
//判断敌方死了没
if(enemyTankVetor.get(i).isLife()) {//坦克动的方向
if(prop.isLife()) {
drawTank(enemyTankVetor.get(i).getX(), enemyTankVetor.get(i).getY(), graphics, 1, enemyTankVetor.get(i).getDirection());
}
else {
drawTank(enemyTankVetor.get(i).getX(), enemyTankVetor.get(i).getY(), graphics, 0, enemyTankVetor.get(i).getDirection());
if(enemy==1){
prop.setLife(true);
prop.run();
}
enemy--;
}
flag++;
}
else enemyTankVetor.remove(i);
}
if((friendtank.isLife()==false && mytank.isLife()==false) ||(flag==0)){
graphics.drawImage(image10,400,300,null);
}
//画出我方Vector中的子弹
if(mytank.isLife()) {
for (int i = 0; i < mytank.bulletVector.size(); i++) {
if (mytank.bulletVector.get(i).isLife()) {
graphics.setColor(Color.BLUE);
//子弹大小
// graphics.fill3DRect(mytank.bulletVector.get(i).getX(), mytank.bulletVector.get(i).getY(), 5, 5, false);
graphics.fillOval(mytank.bulletVector.get(i).getX(), mytank.bulletVector.get(i).getY(), 8, 8);
} else {
mytank.bulletVector.remove(i);
}
}
}
//画出队友子弹
if(friendtank.isLife()) {
for (int i = 0; i < friendtank.bulletVector.size(); i++) {
if (friendtank.bulletVector.get(i).isLife()) {
graphics.setColor(Color.yellow);
//子弹大小
//graphics.fill3DRect(friendtank.bulletVector.get(i).getX(), friendtank.bulletVector.get(i).getY(), 5, 5, false);
graphics.fillOval(friendtank.bulletVector.get(i).getX(), friendtank.bulletVector.get(i).getY(), 8, 8);
} else {
friendtank.bulletVector.remove(i);
}
}
}
//画出敌方的子弹
for(int i=0;i< enemyTankVetor.size();i++){
EnemyTank enemyTank = enemyTankVetor.get(i);
for(int j=0;j <enemyTank.bulletVector.size();j++){
Bullet bullet = enemyTank.bulletVector.get(j);
if(bullet!=null) {
if (bullet.isLife()) {
graphics.setColor(Color.red);
//子弹
//graphics.fill3DRect(bullet.getX(), bullet.getY(), 3, 3, false);
//graphics.fillOval(bullet.getX(), bullet.getY(),8 ,8);
graphics.drawImage(image11,bullet.getX(),bullet.getY(),null);
} else {
enemyTank.bulletVector.remove(j);
}
}
}
}
里面有牵扯到一些后面的道具总体来说改动不大。
因为我们的内容都是在其他类中完成的,主函数只要完成调用就行了
主函数Main中添加(
MyPanel myPanel = new MyPanel(); this.addKeyListener(myPanel); this.add(myPanel); //继承画布 this.setSize(1500,800); //窗口初始大小 this.setLocation(200,130); //窗口初始位置 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); //创建线程 Thread thread = new Thread(myPanel); //线程启动 thread.start();