“飞机大战”是一款经典的街机游戏,玩家控制一架飞机,通过射击敌机来获得分数。本文将使用Java语言为基础,编写一个简单的“飞机大战”游戏。我们将利用Swing库来处理图形界面,使用线程来控制游戏的运行。
在这个游戏中,玩家可以通过键盘控制飞机的移动,射击敌机,并且会有敌机不断出现并向下移动。下面是实现的关键代码和思想。
1. 游戏窗口的初始化
首先,我们需要创建一个游戏窗口,并设定基本的游戏画布。
import javax.swing.*;
import java.awt.*;
public class PlaneGame extends JFrame {
public PlaneGame() {
this.setTitle("飞机大战");
this.setSize(800, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(new GamePanel());
this.setVisible(true);
this.setResizable(false);
}
public static void main(String[] args) {
new PlaneGame();
}
}
class GamePanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 在这里绘制游戏内容
}
}
2. 绘制飞机和敌机
我们需要在游戏面板中绘制玩家的飞机和敌机。我们可以使用Graphics
对象的drawImage
方法来绘制图像。
class GamePanel extends JPanel {
private Image playerImage;
private int playerX;
private int playerY;
public GamePanel() {
playerImage = new ImageIcon("player.png").getImage();
playerX = 400;
playerY = 500;
this.setFocusable(true);
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
playerX -= 10;
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
playerX += 10;
}
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(playerImage, playerX, playerY, null);
// 绘制敌机
}
}
3. 敌机的生成与移动
在此部分,我们需要创建敌机类,并使其随机出现以及向下移动。为了简化代码,敌机将在固定的位置生成并以固定速度下降。
class Enemy {
int x, y;
Image enemyImage;
public Enemy() {
this.enemyImage = new ImageIcon("enemy.png").getImage();
this.x = (int) (Math.random() * 750);
this.y = 0; // 起始位置
}
public void move() {
this.y += 5; // 向下移动
}
public void draw(Graphics g) {
g.drawImage(enemyImage, x, y, null);
}
}
class GamePanel extends JPanel {
private List<Enemy> enemies;
public GamePanel() {
enemies = new ArrayList<>();
// 定时生成敌机
new Timer(1000, e -> {
enemies.add(new Enemy());
repaint();
}).start();
new Timer(20, e -> {
for (Enemy enemy : enemies) {
enemy.move();
}
repaint();
}).start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(playerImage, playerX, playerY, null);
for (Enemy enemy : enemies) {
enemy.draw(g);
}
}
}
4. 射击功能
为了让玩家能够射击敌机,我们需要添加子弹的类,并在面板中处理子弹的移动和绘制。
class Bullet {
int x, y;
Image bulletImage;
public Bullet(int x, int y) {
this.x = x;
this.y = y;
this.bulletImage = new ImageIcon("bullet.png").getImage();
}
public void move() {
this.y -= 10; // 向上移动
}
public void draw(Graphics g) {
g.drawImage(bulletImage, x, y, null);
}
}
class GamePanel extends JPanel {
private List<Bullet> bullets;
public GamePanel() {
bullets = new ArrayList<>();
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
bullets.add(new Bullet(playerX + 20, playerY)); // 创建子弹
}
}
});
new Timer(20, e -> {
for (Bullet bullet : bullets) {
bullet.move();
}
repaint();
}).start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(playerImage, playerX, playerY, null);
for (Bullet bullet : bullets) {
bullet.draw(g);
}
for (Enemy enemy : enemies) {
enemy.draw(g);
}
}
}
5. 整体逻辑
整合所有组件,我们就构建了一个简易的“飞机大战”游戏框架。玩家可以控制飞机左右移动并发射子弹。我们可以后续增加碰撞检测、分数计算、游戏结束逻辑等功能,使游戏更加完整。
通过这段代码,玩家可以体验到一个基本的游戏框架,想要增强游戏的乐趣,还可以进一步美化界面、增加音效等。这些功能的添加会使游戏变得更加丰富多彩。希望通过这篇文章,能启发读者去深入学习游戏开发。