Java学习——day 08

今天学习的主要内容是制作一款简单的游戏,复习并运用之前学习的面向对象的知识。所以今天的笔记将围绕着游戏制作的过程来进行。

主要内容

  • 绘出游戏窗口
  • 在窗口中画东西
  • 图片的加载与绘画
  • 简易动画的制作

笔记详情

1. 绘出游戏窗口

Java中绘画窗口需要定义 Frame 类的子类,然后在子类中进行绘窗口,可以设置窗口的大小、位置、是否可见、窗口大小是否能更改等。具体实例如下:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyFrame extends Frame {

    public void launchFrame() {
        setSize(500, 500);      // 窗口的宽度和导读
        setLocation(100, 100);      // 窗口的位置
        setVisible(true);   // 窗口是否可见
        this.setResizable(false);       // 窗口大小不能更改

        // 窗口是否能点击关闭
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        MyFrame gf = new MyFrame();
        gf.launchFrame();
    }
}

2. 在窗口中画东西

我们将窗口绘出来之后,就可以在窗口中画出我们需要的东西,比如:直线、形状、图片等。我们需要重写一个 paint() 方法,在这个方法中,我们可以传入画笔对象,然后通过使用画笔进行绘画。下面给出实例:

package fengzhen;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyFrame extends Frame {

    /********************重写方法,进行绘画********************/
    @Override
    public void paint(Graphics g) {
        g.setColor(Color.blue);     // 设置画笔颜色
        g.drawLine(100, 100, 200, 200);     // 画出直线
        g.drawOval(100, 100, 200, 300);    // 画出椭圆
        g.drawRect(100, 100, 200, 300);    // 画出矩形
        g.fillOval(200, 200, 200, 300);    // 画出填充矩形
        g.fillRect(0, 0, 100, 100);    // 画出填充矩形

        // 画出文字
        Font f = new Font("微软雅黑", Font.BOLD, 50);   // 设置字体样式
        g.setFont(f);       // 应用字体样式
        g.drawString("字体内容", 200, 200);
    }

    /********************重写方法,进行绘画********************/


    public void launchFrame() {
        setSize(500, 500);      // 窗口的宽度和导读
        setLocation(100, 100);      // 窗口的位置
        setVisible(true);   // 窗口是否可见
        this.setResizable(false);       // 窗口大小不能更改

        // 窗口是否能点击关闭
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        MyFrame gf = new MyFrame();
        gf.launchFrame();
    }
}

3. 图片的加载与绘画

如果我们要在窗口中画出图片,我们首先应该从本地加载图片,然后再进行绘画。这个图片加载的方法还是很常用的,我们可以将它封装成一个工具方法,放在 myUtil 类中,实例如下:

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class myUtil{

    private myUtil() {
    }

    public static Image getImage(String path) {
        URL u = myUtil.class.getClassLoader().getResource(path);
        System.out.print(u);
        BufferedImage image = null;
        try {
            image = ImageIO.read(u);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return image;
    }
}

这样我们就可以先加载图片,然后进行绘出图片,实例如下:

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.blue);     // 设置画笔颜色
        g.drawLine(100, 100, 200, 200);     // 画出直线
        g.drawOval(100, 100, 200, 300);    // 画出椭圆
        g.drawRect(100, 100, 200, 300);    // 画出矩形
        g.fillOval(200, 200, 200, 300);    // 画出填充矩形
        g.fillRect(0, 0, 100, 100);    // 画出填充矩形

        // 画出文字
        Font f = new Font("微软雅黑", Font.BOLD, 50);   // 设置字体样式
        g.setFont(f);       // 应用字体样式
        g.drawString("字体内容", 200, 200);

        // 加载并绘出图片
        Image img = MyUtil.getImage("images/bg.png");
        g.drawImage(img, 200, 200, 100, 100, null);
    }

4. 简易动画的制作

在制作动画的时候,我们需要更改图片的位置,大小即可。但是在制作的时候,我们要是计算机不断地进行重绘我们的图片和其他的形状。我们可以定义一个内部类,通过这个内部类实例化出来的对象,来不断的进行重绘,实例如下:

/**
 * 定义一个重画窗口的线程类,是一个上面定义的Frame类的内部类
 */
class PaintThread extends Thread {
    @Override
    public void run() {
        while (true) {
            repaint();
            try {
                Thread.sleep(40);   // 每隔40毫秒进行重绘
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

定义好之后,我们就可以在Frame类中的launchFrame方法中,通过内部类实例化出来的对象,来进行不断的重绘,实例如下:

public void launchFrame() {
    setSize(500, 500);
    setLocation(100, 100);
    setVisible(true);

    // 通过内部类实例化出来对象的start方法,来不断进行重绘,start方法会调用内部类中重写的run方法
    new PaintThread().start();

    addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
}

猜你喜欢

转载自blog.csdn.net/fengzhen8023/article/details/85257678
今日推荐