当前位置: 代码迷 >> J2SE >> java 坦克大战中炮弹击中敌人坦克,子弹会消失,但是子弹坐标却还会运动,咋回事
  详细解决方案

java 坦克大战中炮弹击中敌人坦克,子弹会消失,但是子弹坐标却还会运动,咋回事

热度:48   发布时间:2016-04-23 19:38:22.0
java 坦克大战中炮弹击中敌人坦克,子弹会消失,但是子弹坐标却还会运动,怎么回事?
本帖最后由 jxtaihe 于 2015-10-22 16:02:28 编辑
package tankeWarGame_1;

import java.awt.Rectangle;

public class Bomb implements Runnable{
private static final int BXspeed=7;
private static final int BYspeed=7;
int x,y;
TankeWarPanel tp;
MyTanke mp;

boolean isLive=true;//炮弹是否死亡,默认为存在状态
int direct=0;

public boolean isLive() {
return isLive;
}


public void setLive(boolean isLive) {
this.isLive = isLive;
}
public Bomb(int x, int y,int direct) {
super();
this.x = x;
this.y = y;
this.direct = direct;
}

//返回以炮弹(x,y)为坐标形成的矩形
public Rectangle getRect(){
return new Rectangle(x,y,10,10);
}
//当炮弹矩形与敌人坦克矩形碰撞的时候返回true,否则返回false
public boolean hitTanke(EnemyTanke et){
if(this.getRect().intersects(et.getRect())){


//mp.bombs.remove(this);
et.setLive(false);//当炮弹与敌人坦克碰撞了,敌人坦克设置成死亡状态
isLive=false;
return true;
}
    return false;
}


public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {

e.printStackTrace();
}

switch(direct)
//炮弹向上
{case 0:
y=y-BYspeed;
break;
//炮弹右上
case 1:
y=y-BYspeed;
x=x+BXspeed;

break;
//炮弹向右
case 2:
x=x+BXspeed;
//y=y+BYspeed;
break;
//炮弹右下
case 3:
x=x+BXspeed;
y=y+BYspeed;

break;
//炮弹向下
case 4:
y=y+BYspeed;
break;
//炮弹左下
case 5:
x=x-BXspeed;
y=y+BYspeed;
break;
//炮弹向左
case 6:
x=x-BXspeed;
break;
//炮弹左上
case 7:
x=x-BXspeed;
y=y-BYspeed;
break;
}
if(x<0||x>TankeWar.GAME_WIDTH||y<0||y>TankeWar.GAME_HIGHT){
isLive=false;
break;

}

System.out.println("x="+x+" "+"y="+y);
}
}
}

-----------------
public class MyTanke extends Tanke {

private static final int Xspeed=10;//坦克X方向速度
private static final int Yspeed=10;//坦克Y方向速度
//创建一个炮弹集合
Vector<Bomb> bombs=new Vector<Bomb>();
//定义坦克最多可以开多少发炮弹
int BmSize=7;
Bomb bm=null;
public MyTanke(int x, int y, int direct, int camp) {
super(x, y, direct, camp);
}

//向上移动
public void moveUp(){

if(y>0){
y=y-Yspeed;
}
}
//右上移动
public void moveRu(){

if(x<1140&&y>0){
y=y-Yspeed;
x=x+Xspeed;

}
}
//向右移动
public void moveRight(){

if(x<1140){
x=x+Xspeed;
}
}
//右下移动
   public void moveRd(){

if(x<1140&&y<540){
x=x+Xspeed;
y=y+Yspeed;
}
}
//向下移动
public void moveDown(){

if(y<510){
y=y+Yspeed;
}
}
//左下移动
public void moveLd(){
if(y<540&&x>0){
x=x-Xspeed;
y=y+Yspeed;
}
}
//向左移动
public void moveLeft(){
if(x>0){
x=x-Xspeed;
}
}
//左上移动
public void moveLu(){
if(x>0&&y<540&&y>0){
x=x-Xspeed;
y=y-Yspeed;
}
}

public void shoot(){
bm=new Bomb(x+30-5,y+30-5,direct);
//(x+30,y+30)是坦克的中心位置  (x+30-5,y+30-5)炮弹的中心位置
//创建一颗炮弹,并将炮弹添加到炮弹集合中去
bombs.add(bm);
Thread t=new Thread(bm);
t.start();
}


}
-------------------
public class EnemyTanke extends Tanke{

public EnemyTanke(int x, int y, int direct, int camp) {
super(x, y, direct, camp);

}

//返回以敌人坦克(x,y)为坐标形成的矩形
public Rectangle getRect(){
return new Rectangle(x,y,60,60);//Rectangle(x坐标,y坐标,长,高) 因为坦克是圆形,所以长=高=圆直径
}

}

-----------
public class TankeWarPanel extends JPanel implements Runnable,KeyListener{
MyTanke mp=null;
EnemyTanke et=null;
public TankeWarPanel(){
mp=new MyTanke(300,300,1,0);
et=new EnemyTanke(300,450,0,1);
}

public void paint(Graphics g){
super.paint(g);//少了这一行颜色会变成白色
mp.paint(g);
et.paint(g);

g.drawString("炮弹的数量:"+mp.bombs.size(), 10, 30);//在屏幕上显示坦克发射了多少颗炮弹
//从炮弹集合中取出炮弹,并画出炮弹
for(int i=0;i<mp.bombs.size();i++){
//从集合中取出的炮弹赋值给myMissile
Bomb myBomb=mp.bombs.get(i);

if(myBomb!=null&&myBomb.isLive==true){//假如炮弹不为空值并且炮弹还是活的时候,就画出炮弹

g.setColor(Color.black);
g.fillOval(myBomb.x, myBomb.y, 10, 10);
}
myBomb.hitTanke(et);
if(myBomb.isLive==false){
mp.bombs.remove(myBomb);
}

}

}





@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_W:
mp.bu=true;
break;
case KeyEvent.VK_D:
mp.br=true;
break;
case KeyEvent.VK_S:
mp.bd=true;
break;
case KeyEvent.VK_A:
mp.bl=true;
break;
}
   //只按向上键
if(mp.bu&&!mp.br&&!mp.bd&&!mp.bl){
mp.setDirect(0);
mp.moveUp();
}
//只按向右键
else if(!mp.bu&&mp.br&&!mp.bd&&!mp.bl){
mp.setDirect(2);
mp.moveRight();
}
//只按向下键
else if(!mp.bu&&!mp.br&&mp.bd&&!mp.bl){
mp.setDirect(4);
mp.moveDown();
}
//只按向左键
else if(!mp.bu&&!mp.br&&!mp.bd&&mp.bl){
mp.setDirect(6);
mp.moveLeft();
}
//同时按向上向右键
else if(mp.bu&&mp.br&&!mp.bd&&!mp.bl){
mp.setDirect(1);
mp.moveRu();
}
//同时按向下向右键
else if(!mp.bu&&mp.br&&mp.bd&&!mp.bl){
mp.setDirect(3);
mp.moveRd();
}
//同时按向下向左键
else if(!mp.bu&&!mp.br&&mp.bd&&mp.bl){
mp.setDirect(5);
mp.moveLd();
}
//同时按向上向左键
else if (mp.bu&&!mp.br&&!mp.bd&&mp.bl){
mp.setDirect(7);
mp.moveLu();
}

this.repaint();
}

@Override
public void keyReleased(KeyEvent e) {

switch(e.getKeyCode()){
case KeyEvent.VK_W:
mp.bu=false;
break;
case KeyEvent.VK_D:
mp.br=false;
break;
case KeyEvent.VK_S:
mp.bd=false;
break;
case KeyEvent.VK_A:
mp.bl=false;
break;
case KeyEvent.VK_ENTER:
//开火
mp.shoot();
break;
}
   //!mk.bu向上键为true,也就是向上键没有松开,其他三个键都松开,这时候方向设置为向上
if(!mp.bu&&mp.br&&mp.bd&&mp.bl){
mp.setDirect(0);
mp.moveUp();
}
//!mk.br向右键为true,也就是向右键没有松开,其他三个键都松开,这时候方向设置为向右
else if(mp.bu&&!mp.br&&mp.bd&&mp.bl){
mp.setDirect(1);
mp.moveRight();
}
//!mk.bd向下键为true,也就是向下键没有松开,其他三个键都松开,这时候方向设置为向下
else if(mp.bu&&mp.br&&!mp.bd&&mp.bl){
mp.setDirect(2);
mp.moveDown();
}
//!mk.bl向左键为true,也就是向左键没有松开,其他三个键都松开,这时候方向设置为向左
else if(mp.bu&&mp.br&&mp.bd&&!mp.bl){
mp.setDirect(3);
mp.moveLeft();
}
//!mk.bu向上键为true,!mk.br向右键为true,也就是向上向右键没有松开,其他2个键都松开,这时候方向设置为右上
else if(!mp.bu&&!mp.br&&mp.bd&&mp.bl){
mp.setDirect(4);
mp.moveRu();
}
//同时按向下向右键
else if(mp.bu&&!mp.br&&!mp.bd&&mp.bl){
mp.setDirect(5);
mp.moveRd();
}
//同时按向下向左键
else if(mp.bu&&mp.br&&!mp.bd&&!mp.bl){
mp.setDirect(6);
mp.moveLd();
}
//同时按向上向左键
else if (!mp.bu&&mp.br&&mp.bd&&!mp.bl){
mp.setDirect(7);
mp.moveLu();
}

this.repaint();

}

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}
@Override
//坦克也要做成线程炮弹才会跑起来
public void run() {

while(true){
try {
Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();
}
this.repaint();

}
}
}
----------------------------------------
public class TankeWar extends JFrame{

public static final int GAME_WIDTH=1200;
public static final int GAME_HIGHT=600;
TankeWarPanel tp=null;

public TankeWar(){
tp=new TankeWarPanel();
this.setName("坦克大战");
this.setLocation(100, 50);
this.setSize(GAME_WIDTH, GAME_HIGHT);
tp.setBackground(Color.gray);
this.add(tp);
Thread t=new Thread(tp);
t.start();
this.addKeyListener(tp);
this.setVisible(true);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

    public static void main(String[] args){
    
new TankeWar();
}


}
------解决思路----------------------
在炮弹类的那个函数中
run()函数中 没有判断当前的子弹是否存在  

 如果碰撞上之后炮弹只是没有绘画出来  但是坐标在run()同样运行着  因为没有当前子弹的限制条件,
所以你应该在这里加上判断条件:
run()函数中:

while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {

e.printStackTrace();
}
//增加的代码(这里life只是意思    具体代码你就应该能改了  没怎么细看  这种全篇的代码真的很让人烦。。。。)
if(true == this.life){

switch(direct)
//炮弹向上
{case 0:
y=y-BYspeed;
break;
。。。}

 }
  相关解决方案