java--飞机大战1

1.需求分析

1 新建工程  导入图片,导入的图片在工程目录下
2 新建窗体,窗体大小400,600,新建画布,在画布类中实现三个接口
3 在画布中声明线程,以及在run方法中搭建线程样例代码
4 加载开始图片,声明Image变量,并在静态代码块中加载,在paint方法中画
5 鼠标移动到开始框中的变化

6 在点击的方法中切换背景,重画,开始线程.解决变小手问题.背景图片下滑完以后的处理
7 声明数组存放飞机,在静态代码块中加载飞机图片,在paint方法中使用三目运算切换画飞机,飞机跟随鼠标移动,飞机靠近边框问题
8 右键暂停,声明两方法,一个是控制执行wait方法的方法,一个是唤醒等待的方法的并别改suspend值.在点击的方法中获取鼠标状态来控制两个方法的执行
9 新建子弹类(int bx,by;Image bImg; int bSpeed;),在画布中新建集合存放子弹,在run方法中新建子弹对象并加到集合中,在paint方法中使用for循环从集合中取出对象并执行每一个对象的画的方法,在run方法中使用for执行移动方法
10 三个子弹,添加子弹方向,在新建子弹对象时传3个方法标识,在子弹类中添加三个子弹移动的方法,在创建子弹的时候创建三种子弹
11 创建奖励类,在画布类中创建数组存放加载进来的奖励图片,在惊天代码块中加载图片,创建存放奖励的集合,在run方法中创建奖励并添加到集合中,在paint方法中画奖励,在run方法中调用奖励移动的方法.
12 画血量,在奖励的类中写碰撞,在碰时注意种类区别,各个奖励的实现.
13 敌机的出现和奖励一样
14 敌机和子弹撞击的实现
15 敌机和飞机撞击的实现
 

2.坐标前缀知识

计算机中的坐标轴与我们学的数学的坐标轴是不相同的,在计算机中,原点(O点)在屏幕的最左上角,从该点往有是X轴,从该点往下是Y轴。每个坐标点的数值单位为像素(px)。例如(100,200)坐标点代表 X = 100 像素 ,Y = 200 像素

 3.画框类PlaneJFrame代码

public class PlaneJFrame extends JFrame{
	public PlaneJFrame(){
		//画框标题
		this.setTitle("飞机大战");
		//画框大小
		this.setSize(420,640);
		//设置窗口相对于指定组件的位置,如果组件当前未显示或者 c 为 null,则此窗口将置于屏幕的中央
		this.setLocationRelativeTo(null);
		//关联关闭按钮
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//创建画布对象
		PlaneJPanel jpanel = new PlaneJPanel();
		//将画布添加到画框内
		this.add(jpanel);
		//让窗体显示
		this.setVisible(true);
	}
	public static void main(String[] args) {
		new PlaneJFrame();
	}
}

4.画布类PlaneJPanel代码


public class PlaneJPanel extends JPanel implements Runnable,MouseListener,MouseMotionListener{
	Thread t = null;
	static Image startImg;//游戏背景图
	int x = 0,y = 0; //背景图坐标
	
	static {//使用静态代码块的作用:第一时间加载该资源
		try {
			startImg = ImageIO.read(new File("image/GameInterface/interface_1.png"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public PlaneJPanel() {
		t = new Thread(this);
		// 添加鼠标监听
		addMouseListener(this);
		addMouseMotionListener(this);
	}
	
	//绘制游戏背景
	public void paint(Graphics g) {
		//			图片	   X坐标    Y坐标      
        //绘制指定图像中已缩放到适合指定矩形内部的图像
		g.drawImage(startImg, x, y, null);
	}
	
	@Override
	public void mouseDragged(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseMoved(MouseEvent e) {
		// TODO Auto-generated method stub
		// 鼠标移动到这个范围内改变状态
		if (e.getX() >= 132 && e.getX() <= 259 && e.getY() >= 392 && e.getY() <= 432) {
			setCursor(new Cursor(Cursor.HAND_CURSOR));// 将鼠标的状态变成小手
		}else {
			setCursor(new Cursor(Cursor.DEFAULT_CURSOR));// 将鼠标状态变成箭头
		}
	}
	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
			int x = e.getX();
			System.out.println("x="+x);
			System.out.println("y="+e.getY());
		
	}
	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		
	}
}

 5.实现细节

鼠标移动到开始按钮处变成小手

(1)在PlaneJPanel 类的构造方法中添加鼠标监听,并创建线程池

	public PlaneJPanel() {
		t = new Thread(this);
		// 添加鼠标监听
		addMouseListener(this);
		addMouseMotionListener(this);
	}

 (2)通过鼠标点击方法获取坐标点

PlaneJPanel 类的 mouseClicked(MouseEvent) 方法中写如下代码

	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
			int x = e.getX();
			System.out.println("x="+x);
			System.out.println("y="+e.getY());
		
	}

(3)在指定范围实现小手功能

PlaneJPanel 类的 mouseMoved 方法中写如下代码

	public void mouseMoved(MouseEvent e) {
		// TODO Auto-generated method stub
		// 鼠标移动到这个范围内改变状态
		if (e.getX() >= 132 && e.getX() <= 259 && e.getY() >= 392 && e.getY() <= 432) {
			setCursor(new Cursor(Cursor.HAND_CURSOR));// 将鼠标的状态变成小手
		}else {
			setCursor(new Cursor(Cursor.DEFAULT_CURSOR));// 将鼠标状态变成箭头
		}
	}

6.效果展示 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值