pr_qm 2021-05-18 23:57 采纳率: 100%
浏览 148
已采纳

学编飞机大战的代码,飞机撞到子弹后爆炸的效果出不来,别的地方都能正常运行,希望各位大佬给点建议

import java.awt.Graphics;
import java.awt.Image;
/*
 * 爆炸类
 */
public class Explode {
	//位置
	double x,y;
	//将一些只需要进行一次的初始化操作都放在static代码块中进行
	static Image[] imgs=new Image[14];
	
	int count=0;
	
	static {
		for(int i=1; i<15;i++) {
			imgs[i]=GameUtil.getImage("images/explode/"+ i +".gif");
			imgs[i].getWidth(null);  //解决懒加载问题,目前没有问题,加和不加都行
		}
	}
	
	//画爆炸图
	public void drawMyself(Graphics g) {
		if(count<14) {
			g.drawImage(imgs[count], (int)x, (int)y, null);
		    count++;
		}		
	}
	
	//构造方法
	public Explode() {		
	}
	//构造方法
	public Explode(double x, double y) {
		this.x=x;
		this.y=y;
	}	
}




import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;

import javax.swing.JFrame;

public class MyGameFrame extends JFrame{
	//两张图片	
	Image planeImg=GameUtil.getImage("images/plane.jpg");
	Image background=GameUtil.getImage("images/background.jpg");
	
	//飞机类对象p1,飞机图片,坐标,速度
	Plane p1=new Plane(planeImg,100,100,7);
	//炮弹数组
	Shell[] shells=new Shell[50]; 
	//爆炸
	Explode explode;
	//游戏开始时间
	Date start=new Date();  
	//游戏结束时间(飞机死的那一刻)
	Date end;
	//玩了多少秒
	long period=0;
	
	//画背景,画飞机	
	public void paint(Graphics g) {
		//画背景
		g.drawImage(background,0,0,500,500,null);
		//画时间
		drawTime(g);
		//画飞机
		p1.drawMyself(g);
		//画炮弹
		for(int i=0;i<shells.length;i++) {
			shells[i].drawMyself(g);
			
			//碰撞检查,将所有的炮弹和飞机进行检测,判断有没有碰撞
			boolean peng=shells[i].getRec().intersects(p1.getRec());
			if(peng) {
				System.out.println("飞机被击中了!");
		       p1.live=false;
				
		       //处理爆炸效果
		       if(explode==null) {
		    	   explode=new Explode(p1.x, p1.y);
		       }			   
			   explode.drawMyself(g);
			}			
		}		
	}
	
	//画时间
	public void drawTime(Graphics g) {
		Color c=g.getColor();
		Font f=g.getFont();
		
		g.setColor(Color.green);
		if(p1.live) {
			period=(System.currentTimeMillis()-start.getTime())/1000;
		    g.drawString("坚持:"+period, 30, 50);
		}else {
			if(end==null) {
				end=new Date();
				period=(end.getTime()-start.getTime())/1000;
			}
			g.setColor(Color.red);
			g.setFont(new Font("微软雅黑",Font.BOLD,30));
			g.drawString("最终时间:"+period, 200, 200);			
		}
		g.setColor(c);
		g.setFont(f);
	}
	
	//初始化窗口
	public void launchFrame() {
		//在游戏窗口打印标题
		setTitle("飞机大战");
		//窗口默认不可见,设为可见
		setVisible(true);
		//窗口大小:宽500,高500
		setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);
		//窗口左上角顶点的坐标位置
		setLocation(400,400);
		
		
		//增加关闭窗口监听,这样用户点击右上角关闭图标可以关闭游戏程序
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		
		//启动重画窗口的线程			
		new PaintThread().start();
		//启动键盘监听
		this.addKeyListener(new KeyMonitor());
		
		//初始化创建50个炮弹对象
		for(int i=0;i<shells.length;i++) {
			shells[i]=new Shell();			
		}

		

	}
	
	/*
	 * 定义了一个重画窗口的线程类
	 * 定义内部成员类是为了方便直接使用窗口类的相关方法
	 */
	class PaintThread extends Thread{
		public void run() {
			while(true) {
				repaint(); 
				//内部类可以直接使用外部类成员
				try {
					Thread.sleep(50);    //1s=1000ms,1s画20次(20*50=1000)
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	//内部类,实现键盘的监听处理
	class KeyMonitor extends KeyAdapter{
		//按下键盘
		public void keyPressed(KeyEvent e) {
			System.out.println("按下:"+e.getKeyCode());
			/*
			 * if(e.getKeyCode()==KeyEvent.VK_LEFT) {
				  left=true;
			    }
			   if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
				  left=true;
			   }
			 */
			p1.addDirection(e);
		}
		//释放键盘
		public void keyReleased(KeyEvent e) {
			System.out.println("抬起:"+e.getKeyCode());
			p1.minusDirection(e);
		}
	}
	
	//双缓冲技术
	private Image offScreenImage=null;
	
	public void update(Graphics g) {
		if(offScreenImage==null)
			offScreenImage=this.createImage(Constant.GAME_WIDTH,Constant. GAME_HEIGHT);  //这是游戏窗口的宽度和高度
		Graphics gOff=offScreenImage.getGraphics();
		paint(gOff);
		g.drawImage(offScreenImage, 0, 0, null);
	}
	
	public static void main(String[] args) {
		MyGameFrame gameFrame=new MyGameFrame();
		gameFrame.launchFrame();
	}
}



import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;

/*
 * 游戏物体的父类
 */
public class GameObject {
	Image img;  //图片
	double x,y;  //物体的坐标
	int speed;  //物体移动的速度
	int width,height;  //物体的宽度和高度
	
	public GameObject(Image img, double x, double y,int speed, int width, int height) {
		this.img=img;
		this.x=x;
		this.y=y;
		this.speed=speed;
		this.width=width;
		this.height=height;
	}
	
	public GameObject(Image img, double x, double y,int speed ) {
		this.img=img;
		this.x=x;
		this.y=y;
		this.speed=speed;
		
		this.width=img.getWidth(null);
		this.height=img.getHeight(null);
	}
	
	public GameObject() {
		
	}
	
	//drawMyself方法,画一个图片,横纵坐标,长宽
	public void drawMyself(Graphics g) {
		g.drawImage(img, (int)x, (int)y, width, height, null);
	}
	
	//所有物体都是矩形,当你获得对应的矩形的时候,我们就可以做一些相关的判断操作
	public Rectangle getRec() {
		return new Rectangle((int)x, (int)y, width, height);
		
	}
}




import java.awt.Image;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

//游戏的工具类
public class GameUtil {
	//构造私有方法,防止别人创建本类的对象
	private GameUtil() {
		
	}
	
	public static Image getImage(String path) {//images/plane.jpg
		Image img=null;
		URL u=GameUtil.class.getClassLoader().getResource(path);
		try {
			img=ImageIO.read(u);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return img;
	}
	
	public static void main(String[] args) {
		Image img=GameUtil.getImage("images/plane.jpg");
		System.out.println(img);
	}
}



import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;

public class Plane extends GameObject{
	//布尔类,四个方向
	boolean left,right,up,down;  //飞机的方向控制
	boolean live=true;  //活着
	
	//画一个飞机
	public void drawMyself(Graphics g) {
		if(live) {
			//继承父类的方法
		    super.drawMyself(g);
		
		    //飞机飞行的算法,可以自定义
		    //往左则x坐标减小
		    if(left) {
			    x -=speed;
		    }
		    //往右则x坐标增加
		    if(right) {
			    x +=speed;
		    }
		    //往上则y坐标减小
		    if(up) {
			    y -=speed;
		    }
		    //往下则y坐标增加
		    if(down) {
			    y +=speed;
		    }	
		}
			
	}
	
	public void addDirection(KeyEvent e) {
		switch(e.getKeyCode()) {
		case KeyEvent.VK_LEFT:
			left=true;
			break;
		case KeyEvent.VK_RIGHT:
			right=true;
			break;
		case KeyEvent.VK_UP:
			up=true;
			break;
		case KeyEvent.VK_DOWN:
			down=true;
			break;		
		}			
	}
	
	public void minusDirection(KeyEvent e) {
		switch(e.getKeyCode()) {
		case KeyEvent.VK_LEFT:
			left=false;
			break;
		case KeyEvent.VK_RIGHT:
			right=false;
			break;
		case KeyEvent.VK_UP:
			up=false;
			break;
		case KeyEvent.VK_DOWN:
			down=false;
			break;		
		}		
	}
	
	//构造方法(图片,坐标,速度)
	public Plane(Image img, double x, double y, int speed) {
		super(img,x,y,speed);
	}

}



import java.awt.Color;
import java.awt.Graphics;
/*
 * 炮弹类
 */

public class Shell extends GameObject{
	double degree;  //角度,炮弹沿着指定的角度飞行
	
	public Shell() {
		x=200;
		y=200;
		
		degree=Math.random()*Math.PI*2;
		
		width=5;
		height=5;
		
		speed=3;
	}
	
	public void drawMyself(Graphics g) {
		Color c=g.getColor();
		g.setColor(Color.yellow);
		g.fillOval((int)x, (int)y, width, height);
		g.setColor(c);

		
		//根据自己算法指定移动的路径
		x +=speed*Math.cos(degree);
		y +=speed*Math.sin(degree);
		
		//碰到边界改变方向
		if(y>Constant.GAME_HEIGHT-this.height || y<40) {  
			degree = -degree;
		}
		
		if(x<0 || x>Constant.GAME_WIDTH-this.width) {
			degree=Math.PI-degree;
		}
	}

}


/*
 * 存放相关的常量
 */
public class Constant {
	//游戏窗口的宽度
	public static final int GAME_WIDTH=500;
	//游戏窗口的高度
	public static final int GAME_HEIGHT=500;
}
  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2021-05-19 00:04
    关注

    MyGameFrame报错了,学会看错误信息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大