Java如何实现飞机小游戏

发布时间:2022-06-06 17:21:09 作者:iii
来源:亿速云 阅读:246

Java如何实现飞机小游戏

飞机小游戏是一种经典的2D射击游戏,玩家通过控制飞机躲避敌机并发射子弹消灭敌人。本文将介绍如何使用Java语言实现一个简单的飞机小游戏。我们将使用Java的Swing库来创建图形用户界面(GUI),并通过多线程技术实现游戏的动态效果。

1. 游戏设计

1.1 游戏元素

1.2 游戏流程

  1. 游戏开始时,玩家飞机出现在屏幕底部。
  2. 敌机从屏幕上方随机位置出现,并向下移动。
  3. 玩家通过键盘控制飞机移动,并发射子弹。
  4. 子弹击中敌机后,敌机消失,玩家得分增加。
  5. 如果敌机碰到玩家飞机,游戏结束。

2. 实现步骤

2.1 创建游戏窗口

首先,我们需要创建一个游戏窗口,使用JFrame类来实现。

import javax.swing.JFrame;

public class GameWindow extends JFrame {
    public GameWindow() {
        setTitle("飞机小游戏");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
    }

    public static void main(String[] args) {
        GameWindow window = new GameWindow();
        window.setVisible(true);
    }
}

2.2 创建游戏面板

接下来,我们创建一个JPanel作为游戏的主面板,并在其中绘制游戏元素。

import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class GamePanel extends JPanel implements KeyListener {
    private PlayerPlane playerPlane;

    public GamePanel() {
        playerPlane = new PlayerPlane(400, 500);
        addKeyListener(this);
        setFocusable(true);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        playerPlane.draw(g);
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyPressed(KeyEvent e) {
        playerPlane.move(e.getKeyCode());
        repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {}
}

2.3 创建玩家飞机类

玩家飞机类负责飞机的绘制和移动。

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;

public class PlayerPlane {
    private int x, y;
    private Image image;

    public PlayerPlane(int x, int y) {
        this.x = x;
        this.y = y;
        image = new ImageIcon("player_plane.png").getImage();
    }

    public void draw(Graphics g) {
        g.drawImage(image, x, y, null);
    }

    public void move(int keyCode) {
        switch (keyCode) {
            case KeyEvent.VK_LEFT:
                x -= 5;
                break;
            case KeyEvent.VK_RIGHT:
                x += 5;
                break;
            case KeyEvent.VK_UP:
                y -= 5;
                break;
            case KeyEvent.VK_DOWN:
                y += 5;
                break;
        }
    }
}

2.4 添加敌机和子弹

接下来,我们需要添加敌机和子弹的逻辑。敌机从屏幕上方随机出现,并向下移动。玩家飞机可以发射子弹,子弹向上移动并检测是否击中敌机。

import java.util.ArrayList;
import java.util.List;

public class GamePanel extends JPanel implements KeyListener, Runnable {
    private PlayerPlane playerPlane;
    private List<EnemyPlane> enemyPlanes;
    private List<Bullet> bullets;
    private Thread gameThread;

    public GamePanel() {
        playerPlane = new PlayerPlane(400, 500);
        enemyPlanes = new ArrayList<>();
        bullets = new ArrayList<>();
        addKeyListener(this);
        setFocusable(true);

        gameThread = new Thread(this);
        gameThread.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        playerPlane.draw(g);
        for (EnemyPlane enemy : enemyPlanes) {
            enemy.draw(g);
        }
        for (Bullet bullet : bullets) {
            bullet.draw(g);
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyPressed(KeyEvent e) {
        playerPlane.move(e.getKeyCode());
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            bullets.add(new Bullet(playerPlane.getX() + 25, playerPlane.getY()));
        }
        repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {}

    @Override
    public void run() {
        while (true) {
            // 生成敌机
            if (Math.random() < 0.02) {
                enemyPlanes.add(new EnemyPlane((int) (Math.random() * 800), 0));
            }

            // 移动敌机
            for (EnemyPlane enemy : enemyPlanes) {
                enemy.move();
            }

            // 移动子弹
            for (Bullet bullet : bullets) {
                bullet.move();
            }

            // 检测碰撞
            checkCollisions();

            repaint();
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void checkCollisions() {
        // 检测子弹与敌机的碰撞
        for (Bullet bullet : bullets) {
            for (EnemyPlane enemy : enemyPlanes) {
                if (bullet.getX() > enemy.getX() && bullet.getX() < enemy.getX() + 50 &&
                    bullet.getY() > enemy.getY() && bullet.getY() < enemy.getY() + 50) {
                    enemyPlanes.remove(enemy);
                    bullets.remove(bullet);
                    break;
                }
            }
        }

        // 检测玩家飞机与敌机的碰撞
        for (EnemyPlane enemy : enemyPlanes) {
            if (playerPlane.getX() > enemy.getX() && playerPlane.getX() < enemy.getX() + 50 &&
                playerPlane.getY() > enemy.getY() && playerPlane.getY() < enemy.getY() + 50) {
                // 游戏结束
                System.exit(0);
            }
        }
    }
}

2.5 创建敌机和子弹类

敌机和子弹类分别负责敌机和子弹的绘制和移动。

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;

public class EnemyPlane {
    private int x, y;
    private Image image;

    public EnemyPlane(int x, int y) {
        this.x = x;
        this.y = y;
        image = new ImageIcon("enemy_plane.png").getImage();
    }

    public void draw(Graphics g) {
        g.drawImage(image, x, y, null);
    }

    public void move() {
        y += 3;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

public class Bullet {
    private int x, y;
    private Image image;

    public Bullet(int x, int y) {
        this.x = x;
        this.y = y;
        image = new ImageIcon("bullet.png").getImage();
    }

    public void draw(Graphics g) {
        g.drawImage(image, x, y, null);
    }

    public void move() {
        y -= 5;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

3. 总结

通过以上步骤,我们实现了一个简单的飞机小游戏。玩家可以通过键盘控制飞机的移动,并发射子弹消灭敌机。游戏通过多线程技术实现了动态效果,并检测了子弹与敌机、玩家飞机与敌机的碰撞。

这个游戏还可以进一步扩展,例如增加更多的敌机类型、添加背景音乐、实现计分系统等。希望本文能够帮助你理解如何使用Java实现一个简单的2D游戏。

推荐阅读:
  1. python实现飞机大战小游戏
  2. python实现飞机大战微信小游戏

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:C#如何使用日志组件log4net

下一篇:pycharm终端解释器与Python解释器怎么配置

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》