今天学习的主要内容是制作一款简单的游戏,复习并运用之前学习的面向对象的知识。所以今天的笔记将围绕着游戏制作的过程来进行。
主要内容
- 绘出游戏窗口
- 在窗口中画东西
- 图片的加载与绘画
- 简易动画的制作
笔记详情
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);
}
});
}
网友评论