在游戏中完成一条静止不动的鱼
方法一:
画一条静止不动的鱼 --不考虑面向对象
效果图:
方法二:
画一条静止不动的鱼 --考虑面向对象
如何实现一条静止不动的鱼?
- step1:新建一个类为Fish,表示鱼对象
- step2:在Fish类的特征处,定义鱼的种类,大小和位置
- step3:在Fish类中添加构造方法,在构造方法中完成对种类、大小和位置的赋值
- step4:在Pool的特征处,定义了一条鱼 Fish f;
- step5:在Pool的构造方法中,创建一条鱼,给f赋值
f=new Fish();
- step6:在Pool类的行为处,在paint方法中,使用画笔g将鱼f画在了池塘中
代码部分:
Fish.java --鱼对象
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* 鱼对象
* @author Katrina
*/
public class Fish {
//特征 -- 属性
//1、鱼的种类 --不同的鱼的图片
BufferedImage type;
//2、鱼的大小
int width;
int height;
//3、鱼的位置
int x;
int y;
/*
* 构造方法 --对特征第一次赋值(初始化)
*/
public Fish() throws IOException{
type = ImageIO.read(new File("images/fish07_00.png"));
//获取图片的原始大小(宽度,高度) --动态获取【相比直接写数值】
width = type.getWidth();
height = type.getHeight();
//说明:临时给x和y赋值,不超出池塘的范围就可以,后期等鱼移动以后,改成随机数实现
x = 400;
y = 300;
}
//行为 -- 方法
}
Pool.java --池塘对象
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
/**
* 池塘对象
* - 让Pool类继承JPanel,JPanel看成是一个带画笔的画板,让Pool类继承之后,就可以在Pool类绘画了
* @author Katrina
*/
public class Pool extends JPanel {
//特征 --属性
//1、池塘的环境(水、水草、岩石) --一张背景图片
//int表示整数类型、double表示小数类型 ;BufferedImage是Java提供的一个类,主要用于表示图片的类型
BufferedImage bg;
//2、多条鱼
//一条鱼 --不考虑面向对象 --鱼就是图片
// BufferedImage wugui;
//一条鱼 --考虑面向对象 --类 --Class --Fish
Fish f;
//3、渔网
//4、大炮
//5、子弹
/**
* 构造方法 --构造器
* 功能:对特征进行赋值
* 语法:以public开始,构造方法的方法名和类名一致,构造方法没有返回值,连void也没有
* 执行时机:当创建池塘对象new Pool(),底层自动调用该构造方法
* @throws IOException
*/
public Pool() throws IOException {
//从images文件夹中读取bg.jpg图片,然后对特征bg的赋值
bg = ImageIO.read(new File("images/bg.jpg"));
//从images文件夹中读取乌龟的图片,然后给wugui赋值
// wugui = ImageIO.read(new File("images/fish08_00.png"));
//创建一条鱼,然后给特征f赋值
f = new Fish();
}
/**
* 行为 --方法(普通方法)
* 调出paint方法 -- 绘画的行为 Alt+/
*/
public void paint(Graphics g) {
//使用画笔g将特征bg画在池塘中
//参数1:所画的哪张图片
//参数2和3:所画图片左上角的坐标(x和y)
//参数4和5:所画图片的大小(宽度和高度)
//参数6:无意义null值
g.drawImage(bg, 0, 0, 1000, 700, null);
//使用画笔g将wugui画在池塘中
// g.drawImage(wugui, 500, 300, 99, 103, null);
//使用画笔g将鱼f画在池塘中
//f.type:表示鱼的种类
//f.x和f.y:表示鱼的位置
//f.width和f.height:表示鱼的大小
g.drawImage(f.type, f.x, f.y, f.width, f.height, null);
}
}
Start.java --启动捕鱼达人主类
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* 启动捕鱼达人游戏的主类
* @author Katrina
*/
public class Start {
//main方法 -- 主方法
public static void main(String[] args) throws IOException {
//创建捕鱼达人游戏界面的窗体 JFrame
JFrame w = new JFrame();
//创建池塘对象 -newPool,在把创建的池塘添加到窗体中
Pool pl = new Pool();
w.add(pl);
//创建面板 --小板子
// JPanel p = new JPanel();
//创建标签JLabel --显示文字
// JLabel label = new JLabel("Hello World!");
//创建标签JLabel --显示图片,图片放到图标(ImageIcon)上
// JLabel label1 = new JLabel(new ImageIcon("images/bg.jpg"));
// p.add(label); //将带有文字的标签放到面板中
// p.add(label1); //将带有图片的标签放到面板中
// w.add(p); //将面板放到窗体中
w.setVisible(true); //设置窗体可见【true可见;false不可见(默认)】
w.setSize(1000, 700); //设置窗体的大小 (宽度,高度)
w.setLocation(400, 100); //设置窗体的位置(距离左边的长度,距离顶部的长度)
w.setTitle("我的捕鱼达人"); //设置窗体的标题
w.setResizable(false); //设置窗体的大小不可改变【true可以改变(默认);false不可以改变】
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭窗体的运行后台
//使用ImageIO类中的read方法读取图片,图片的读取要以File文件的方式读
w.setIconImage(ImageIO.read(new File("images/5.png"))); //设置窗体的图标
}
}
效果图:
练习:
雪花飘落的程序:在天空中画出一个雪花
com.bzxy.snow包
- Snow.java --雪花对象
- Sky.java --天空对象
- Start.java --启动雪花飘落程序的主类
要求:不准复制代码
代码部分:
Sky.java
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
/**
* 天空对象
* @author Katrina
*/
public class Sky extends JPanel { // 先继承,继承之后可以在Sky类绘画
//特征 --属性
//1、蓝天白云 --背景图片
BufferedImage bg;
//2、多个雪花
//一个雪花 --对象
Snow s;
/**
* 构造方法 --对特征赋值
* @throws IOException
*/
public Sky() throws IOException {
bg = ImageIO.read(new File("images/sky.jpg"));
//创建一个雪花,对s进行赋值
s = new Snow();
}
/**
* 行为 --方法
* paint方法 --绘画的行为
*/
public void paint(Graphics g) {
//使用画笔g将背景bg画在天空中
g.drawImage(bg, 0, 0, 1000, 700, null);
//使用画笔g将雪花s画在天空中
g.drawImage(s.img, s.x, s.y, s.width, s.height, null);
}
}
Snow.java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* 雪花对象
* @author Katrina
*/
public class Snow {
//特征 --属性
//1、雪花的图片
BufferedImage img;
//2、雪花的大小
int width;
int height;
//3、雪花的位置
int x;
int y;
/**
* 构造方法 --对特征赋值
* @throws IOException
*/
public Snow() throws IOException {
img = ImageIO.read(new File("images/snow.png"));
width = img.getWidth();
height = img.getHeight();
x = 400;
y = 200;
}
//行为 --方法
}
Start.java
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
/**
* 启动雪花飘落程序的主类
* @author Katrina
*/
public class Start {
public static void main(String[] args) throws IOException {
//创建雪花飘落程序的界面 --JFrame
JFrame w = new JFrame();
//创建天空对象,并添加到窗体中
Sky s = new Sky();
w.add(s);
//设置窗体的相关属性(可见、大小、位置、关闭后台...)
w.setVisible(true);
w.setSize(1000, 700);
w.setLocation(400, 100);
w.setTitle("下雪啦");
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
w.setResizable(false);
w.setIconImage(ImageIO.read(new File("images/sky.jpg")));
}
}
效果图:
多线程
概念:
- a 程序:能安装在电脑上的都叫程序(微信 qq 钉钉…)
- b 进程:运行中的程序,会在计算机内存中多出进程
- c 多线程:在进程的内部,出现的一种并发执行的现象叫做多线程
如何使用多线程?【Thread类、Runnable接口】
- ① 让一个类去继承Thread
- ② 在该类中调出run方法,在run方法中实现多线程要做的事请
- ③ 创建该类,然后调用start方法启动多线程
顺序执行(从上往下依次执行) --不使用多线程
并发执行(各自执行互补干扰) --使用多线程
举例:
同学A,1000问:你是谁啊
同学B,1000答:我是B同学
代码部分:
FirstThread.java
/**
* 第一个线程类 --执行1000遍问:你是谁啊
* @author Katrina
*/
public class FirstThread extends Thread {
/**
* 调出run方法 --在run方法中实现多线程要做的事情
*/
public void run() {
for (int i = 1; i <= 1000; i++) {
System.out.println("你是谁啊" + i);
}
}
}
SecondThread.java
/**
* 第二个线程类 --执行1000遍答:我是B同学
* @author Katrina
*/
public class SecondThread extends Thread {
/**
* 调出run方法 --实现多线程要做的事情
*/
public void run() {
for (int i = 1; i <= 1000; i++) {
System.out.println("我是B同学啊" + i);
}
}
}
Test.java
/**
* 演示多线程的使用语法
* @author Katrina
*/
public class Test {
public static void main(String[] args) {
//顺序执行 -- 从上往下,依次执行
// for (int i = 1; i <= 1000; i++) {
// System.out.println("你是谁啊" + i);
// }
// for (int i = 1; i <= 1000; i++) {
// System.out.println("我是B同学" + i);
// }
//并发执行 --各自执行,互补干扰
//创建第一个线程类,然后调用start方法启动线程
FirstThread first = new FirstThread();
first.start(); //start()方法底层会执行run()方法
//创建第二个线程类,然后调用start方法启动线程
SecondThread second = new SecondThread();
second.start();
}
}
效果图:
并发执行理解:
并发执行并不是真正意义上的同时执行,同时执行只能在现实中做到,在计算机中,只能做到并发执行,是计算机中CPU分配时间片给不同的线程,获得时间片的线程执行,其它线程等待,而且CPU分配时间片是不可控制的,还有CPU分配时间片的速度非常快,快到已经无法识别线程有停止现象,CPU的快可以认为是又做到了同时执行。