JAVA学习之路:简单的飞机大战游戏(控制主飞机篇)

本文介绍了一种实现飞机游戏键盘控制的方法,通过监听键盘输入并使用标记位来实现斜飞,同时详细解释了如何在飞行中发射子弹,包括子弹类的创建和坐标更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们需要明白,在控制一架飞机的时候,需要通过对键盘的监听。上下左右比较简单,因为是对单一按键的监听,在这里我们可以通过switch语句,通过读取键盘上每个按键的ASCII值。但是如果想要实现边飞行边发射子弹,又或者是实现斜飞怎么办?这里就需要通过对多个按键的监听。
解决的方法是:单一的方向控制我们还是使用switch语句,但是如果牵扯到2个或2个以上的按键监听,我们需要将按键设置一下标记位。即按下为真,释放为假。并且这些处理都是在switch case语句以外,就可以实现斜飞。然后再对窗体进行重绘,我们就可以看到飞机的坐标在不断的发生改变。
如以下代码所示:

public class MovePlaneListener extends KeyAdapter implements KeyListener {
	public int x, y, flag = 0;
	public JFrame frame;
	public boolean left = false, right = false, up = false, down = false;
	public Graphics g;
	public Image image;
	public int x1, y1, vy = 16;
	public Vector<Bullet> vector;
	ImageIcon icon = new ImageIcon("plane/myplane.png");
	public BulletAI ba;

	public void setmove(int x, int y, JFrame frame) {
		this.x = x;
		this.y = y;
		this.frame = frame;
	}

	public MovePlaneListener() {
		vector = new Vector<Bullet>();

	}

	public void keyPressed(KeyEvent e) {

		switch (e.getKeyCode()) {

		case 87: //W-> 上
			if (y > 0) {

				y = y - 3;
				up = true;
			}

			break;
		case 65: //A-> 左
			if (x > 0) {
				x = x - 3;
				left = true;
			}
			break;
		case 83: //S-> 下

			if (y + icon.getIconHeight() < frame.getHeight()) {
				y = y + 3;
				down = true;
			}
			break;
		case 68: //D-> 右

			if (x + icon.getIconWidth() < frame.getWidth()) {
				x = x + 3;
				right = true;
			}

			break;

		case 32: // 空格->发射子弹

			Bullet bu = new Bullet(vector, frame, x, y, vy);
			vector.add(bu);
			ba = new BulletAI(vector, frame, x, y, vy);
			if (flag == 0) {
				ba.start();
				flag = 1;
			}

			break;
		}

		if (x > 0 && y > 0 && x + icon.getIconWidth() < frame.getWidth()
				&& y + icon.getIconHeight() < frame.getHeight())

		{
			if (left == true && up == true) {
				x = x - 3;
				y = y - 3;
			} else if (left == true && down == true) {
				x = x - 3;
				y = y + 3;
			} else if (right == true && up == true) {
				x = x + 3;
				y = y - 3;
			} else if (right == true && down == true) {
				x = x + 3;
				y = y + 3;
			}
		}
		// System.out.println(x + ">>>>>" + y);
		//窗体重绘
		frame.repaint();

	}

	public void keyReleased(KeyEvent e) {
		switch (e.getKeyCode()) {
		case 87: // 上
			up = false;
			break;

		case 65: // 左

			left = false;
			break;

		case 83: // 下

			down = false;
			break;

		case 68: // 右

			right = false;
			break;
		}
	}
}

之后就是关于子弹的发射,这里的处理方法和我的上一篇文章差不多,通过新建一个子弹类,每生成一个子弹后就将其添加到vector向量里,然后利用线程不断的改变子弹的坐标。在这里我就不赘述了,有兴趣的小伙伴可以看看我的(飞机下落篇)具体是如何处理的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值