首页>代码>java awt实现飞机小游戏>/PlaneGame/src/cn/sxt/game/MyGameFrame.java
package cn.sxt.game;

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

/**
 * 飞机游戏的主窗口
 * @author 
 *Frame是窗体
 */
public class MyGameFrame  extends  Frame {
	
	Image   planeImg  = GameUtil.getImage("images/plane.png");
	Image   bg  = GameUtil.getImage("images/bg.jpg");
	
	Plane   plane = new Plane(planeImg,250,250);//设置飞机初始位置
	Shell[]   shells = new Shell[50];//炮弹
	
	Explode   bao ;
	Date  startTime = new Date();
	Date  endTime;
	int period;   //游戏持续的时间
	
	@Override
	public void paint(Graphics g) {		//自动被调用。  g相当于一只画笔
		Color   c =  g.getColor();
		g.drawImage(bg, 0, 0, null);
		/**
		 * g.drawLine(100,100,300,300)画线
		 * g.drawRect()矩形
		 * g.drawOval()圆
		 * g.fillRect()实心矩形
		 * g.setColor()颜色
		 * g.drawString()字符串
		 * 
		 */
		plane.drawSelf(g);  //画飞机
		
		//画出所有的炮弹
		for(int i=0;i<shells.length;i++){
			shells[i].draw(g);//画出所有的炮弹
			
			//飞机和炮弹的碰撞检测!!!turn 就相碰
			boolean  peng = shells[i].getRect().intersects(plane.getRect());
			if(peng){
				plane.live = false;
				if(bao ==null){//只生成一次爆炸过程
					bao  = new Explode(plane.x, plane.y);
					
					endTime = new Date();
					period = (int)((endTime.getTime()-startTime.getTime())/1000);
				}
				bao.draw(g);
			}
			
			//计时功能,给出提示
			if(!plane.live){
				g.setColor(Color.red);
				Font   f  =  new Font("宋体", Font.BOLD, 50);
				g.setFont(f);
				g.drawString("时间:"+period+"秒", (int)plane.x, (int)plane.y);
			}
			
		}
		
		g.setColor(c);
	}
	
	
	//反复的重画窗口!
	class  PaintThread  extends  Thread  {
		@Override
		public void run() {
			//重写父类方法
			while(true){
				repaint();		//重画
				
				try {
					Thread.sleep(40);   	//1s=1000ms
				} catch (InterruptedException e) {
					e.printStackTrace();
				}		
			}
		}
		
	}
	
	//内部类。定义键盘监听的内部类。重写父类的两个方法
	class   KeyMonitor extends  KeyAdapter  {
		
		//按下按键
		@Override
		public void keyPressed(KeyEvent e) {
			plane.addDirection(e);
		}
		//抬起按键
		@Override
		public void keyReleased(KeyEvent e) {
			plane.minusDirection(e);
		}
		
		
	}
	
	
	/**
	 * 初始化窗口
	 */
	public  void  launchFrame(){
		this.setTitle("快乐风男_小游戏_飞机");//游戏标题
		this.setVisible(true);//窗口默认可见
		//设置窗口大小
		this.setSize(Constant.GAME_WIDTH	, Constant.GAME_HEIGHT);
		this.setLocation(300, 300);//设置位置
		
		this.addWindowListener(new WindowAdapter() {
			//匿名内部类,重写
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		
		new PaintThread().start();	//启动重画窗口的线程
		addKeyListener(new KeyMonitor());   //给窗口增加键盘的监听
		
		
		//初始化50个炮弹
		for(int i=0;i<shells.length;i++){
			shells[i] = new Shell();
		}
		
	}
	
	public static void main(String[] args) {
		MyGameFrame  f = new MyGameFrame();//创建窗口对象
		f.launchFrame();
	}
	
	//双缓存,解决闪烁问题
	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);
	}
	
}
最近下载更多
喃喵xxxx  LV6 2022年4月20日
嘎哈SV这次非常  LV1 2021年12月23日
anAdmin  LV5 2021年10月27日
啊啊啊啊小  LV1 2021年7月1日
pipichao  LV6 2021年6月24日
陈岁月  LV1 2021年6月24日
zqk123  LV2 2021年6月22日
 LV10 2021年6月12日
1983929223  LV1 2021年3月8日
BANMAA  LV4 2020年12月24日
最近浏览更多
ClydeSon  LV5 2023年12月27日
微信网友_6790966844739584  LV2 2023年12月27日
2871581741  LV1 2023年12月22日
bangyiyang  LV2 2023年12月21日
412836806 2023年10月13日
暂无贡献等级
yangxb2  LV10 2023年7月11日
2017143155  LV12 2023年6月26日
啊伟大伟大 2023年6月18日
暂无贡献等级
微信网友_6508798513811456  LV5 2023年6月7日
总有人间一两风  LV8 2022年12月12日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友