原文: https://zetcode.com/tutorials/javagamestutorial/basics/

在 Java 2D 游戏教程的这一部分中,我们将介绍创建游戏所需的一些基础知识。 我们创建一个基本应用,绘制一个甜甜圈,并显示图片。

关于

这是 Java 2D 游戏教程。 它是针对初学者的。 本教程将教您使用 Java 编程语言和 Swing GUI 工具箱进行 2D 游戏编程的基础。 可以在此处下载本教程中使用的图像。

应用

在本教程中,我们将显示每个游戏的框架。

Board.java

  1. package com.zetcode;
  2. import javax.swing.JPanel;
  3. public class Board extends JPanel {
  4. public Board() {}
  5. }

Board是进行游戏的面板。

Application.java

  1. package com.zetcode;
  2. import java.awt.EventQueue;
  3. import javax.swing.JFrame;
  4. public class Application extends JFrame {
  5. public Application() {
  6. initUI();
  7. }
  8. private void initUI() {
  9. add(new Board());
  10. setSize(250, 200);
  11. setTitle("Application");
  12. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. setLocationRelativeTo(null);
  14. }
  15. public static void main(String[] args) {
  16. EventQueue.invokeLater(() -> {
  17. Application ex = new Application();
  18. ex.setVisible(true);
  19. });
  20. }
  21. }

这是游戏的切入点。 这里我们有main方法。

  1. add(new Board());

在这里,我们将Board放置在JFrame容器的中心。

  1. setSize(250, 200);

此行设置窗口的大小。

  1. setDefaultCloseOperation(EXIT_ON_CLOSE);

当我们单击关闭按钮时,这将关闭应用。 这不是默认行为。

  1. setLocationRelativeTo(null);

null传递给setLocationRelativeTo()方法时,窗口将在屏幕上居中。

  1. public static void main(String[] args) {
  2. EventQueue.invokeLater(() -> {
  3. Application ex = new Application();
  4. ex.setVisible(true);
  5. });
  6. }

我们创建代码示例的实例,并使它在屏幕上可见。

甜甜圈

板上的对象可以是图像,也可以使用 Java 2D API 提供的绘画工具绘制。 在下一个示例中,我们绘制一个甜甜圈形状。

Board.java

  1. package com.zetcode;
  2. import java.awt.BasicStroke;
  3. import java.awt.Color;
  4. import java.awt.Dimension;
  5. import java.awt.Graphics;
  6. import java.awt.Graphics2D;
  7. import java.awt.RenderingHints;
  8. import java.awt.geom.AffineTransform;
  9. import java.awt.geom.Ellipse2D;
  10. import javax.swing.JPanel;
  11. public class Board extends JPanel {
  12. @Override
  13. public void paintComponent(Graphics g) {
  14. super.paintComponent(g);
  15. drawDonut(g);
  16. }
  17. private void drawDonut(Graphics g) {
  18. Graphics2D g2d = (Graphics2D) g;
  19. RenderingHints rh
  20. = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
  21. RenderingHints.VALUE_ANTIALIAS_ON);
  22. rh.put(RenderingHints.KEY_RENDERING,
  23. RenderingHints.VALUE_RENDER_QUALITY);
  24. g2d.setRenderingHints(rh);
  25. Dimension size = getSize();
  26. double w = size.getWidth();
  27. double h = size.getHeight();
  28. Ellipse2D e = new Ellipse2D.Double(0, 0, 80, 130);
  29. g2d.setStroke(new BasicStroke(1));
  30. g2d.setColor(Color.gray);
  31. for (double deg = 0; deg < 360; deg += 5) {
  32. AffineTransform at
  33. = AffineTransform.getTranslateInstance(w/2, h/2);
  34. at.rotate(Math.toRadians(deg));
  35. g2d.draw(at.createTransformedShape(e));
  36. }
  37. }
  38. }

绘画是在paintComponent()方法内完成的。

  1. private void drawDonut(Graphics g) {
  2. ...
  3. }

将实际绘画委派给特定方法是一种很好的编程习惯。

  1. Graphics2D g2d = (Graphics2D) g;

Graphics2D类扩展了Graphics类。 它提供了对几何图形,坐标转换,颜色管理和文本布局的更复杂的控制。

  1. RenderingHints rh
  2. = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
  3. RenderingHints.VALUE_ANTIALIAS_ON);
  4. rh.put(RenderingHints.KEY_RENDERING,
  5. RenderingHints.VALUE_RENDER_QUALITY);
  6. g2d.setRenderingHints(rh);

渲染提示用于使绘图平滑。

  1. Dimension size = getSize();
  2. double w = size.getWidth();
  3. double h = size.getHeight();

我们得到窗口的高度和宽度。 我们需要它们将甜甜圈形状在窗口上居中。

  1. Ellipse2D e = new Ellipse2D.Double(0, 0, 80, 130);
  2. g2d.setStroke(new BasicStroke(1));
  3. g2d.setColor(Color.gray);

在这里,我们创建椭圆。

  1. for (double deg = 0; deg < 360; deg += 5) {
  2. AffineTransform at
  3. = AffineTransform.getTranslateInstance(w/2, h/2);
  4. at.rotate(Math.toRadians(deg));
  5. g2d.draw(at.createTransformedShape(e));
  6. }

在此,椭圆旋转 72 次以创建一个甜甜圈形状。

Donut.java

  1. package com.zetcode;
  2. import java.awt.EventQueue;
  3. import javax.swing.JFrame;
  4. public class DonutExample extends JFrame {
  5. public DonutExample() {
  6. initUI();
  7. }
  8. private void initUI() {
  9. add(new Board());
  10. setSize(330, 330);
  11. setTitle("Donut");
  12. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. setLocationRelativeTo(null);
  14. }
  15. public static void main(String[] args) {
  16. EventQueue.invokeLater(() -> {
  17. DonutExample ex = new DonutExample();
  18. ex.setVisible(true);
  19. });
  20. }
  21. }

这是主要的类。

绘制图像

当我们创建计算机游戏时,我们经常使用图像。 在下一个示例中,我们加载图像并将其绘制在板上。 如果找不到图像文件,请查看 Java 教程中的显示图像

Board.java

  1. package com.zetcode;
  2. import java.awt.Dimension;
  3. import java.awt.Graphics;
  4. import java.awt.Image;
  5. import javax.swing.ImageIcon;
  6. import javax.swing.JPanel;
  7. public class Board extends JPanel {
  8. private Image bardejov;
  9. public Board() {
  10. initBoard();
  11. }
  12. private void initBoard() {
  13. loadImage();
  14. int w = bardejov.getWidth(this);
  15. int h = bardejov.getHeight(this);
  16. setPreferredSize(new Dimension(w, h));
  17. }
  18. private void loadImage() {
  19. ImageIcon ii = new ImageIcon("src/resources/bardejov.png");
  20. bardejov = ii.getImage();
  21. }
  22. @Override
  23. public void paintComponent(Graphics g) {
  24. g.drawImage(bardejov, 0, 0, null);
  25. }
  26. }

我们为董事会制作了一个城镇形象。 图像绘制在paintComponent()方法内部。

  1. ImageIcon ii = new ImageIcon("src/resources/bardejov.png");

我们创建一个ImageIcon

  1. bardejov = ii.getImage();

我们从ImageIcon中得到一个Image

  1. g.drawImage(bardejov, 0, 0, null);

我们在窗口上绘制图像。

  1. int w = bardejov.getWidth(this);
  2. int h = bardejov.getHeight(this);
  3. setPreferredSize(new Dimension(w, h));

我们确定图像的宽度和高度。 面板的首选大小设置为图像大小。 与JFramepack()方法配合使用时,窗口正好足以显示图像。

ImageExample.java

  1. package com.zetcode;
  2. import java.awt.EventQueue;
  3. import javax.swing.JFrame;
  4. public class ImageExample extends JFrame {
  5. public ImageExample() {
  6. initUI();
  7. }
  8. private void initUI() {
  9. add(new Board());
  10. pack();
  11. setTitle("Bardejov");
  12. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. setLocationRelativeTo(null);
  14. }
  15. public static void main(String[] args) {
  16. EventQueue.invokeLater(() -> {
  17. ImageExample ex = new ImageExample();
  18. ex.setVisible(true);
  19. });
  20. }
  21. }

这是示例的主要类。

Java 游戏基础 - 图1

图:图像

在本章中,我们介绍了 Java 游戏编程的一些基础知识。