今天要分享的内容属于GUI图像中的游戏,类似于做一个的简单的游戏
接下来我们进入今天的正题
1、演示关于多线程工作的基本过程
public class test_1229 {
public static void main(String[] args) {
Thread_1 thread_1 = new Thread_1();
Thread t1 = new Thread(thread_1);
t1.start();
Thread_2 thread2 = new Thread_2();
Thread t2 = new Thread(thread2);
t2.start();
}
}
class Thread_1 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程1---->" + i);
}
}
}
class Thread_2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程2---->" +i);
}
}
}
会出现这种执行不太均匀的情况出现,下面我根据自己的情况,进行有限的说明,有不妥之处,请各位大佬批评指正
t1和t2的方式是相同的
在对Thread_1和Thread_2两个线程启动中,先启动的是Thread_1线程,后启动的是Thread_2线程
此时,会出现一个情况,抢占CPU资源不均匀的问题
(主要体现抢占的百分比不同,线程执行会出现执行了部分当前线程,又去执行其他线程的问题出现) start() ----- 启动线程
线程执行的步骤
main ---------> i<100 ---------------> i<100 由于此刻该程序就是多线程
从main方法进入 在进入第一个循环内(i<100)
当第一个循环结束,进入第二循环(i<100),当第二个程序执行完毕之后,main方法执行完毕,程序结束
程序执行顺序是有从上到下依次执行,在上一个程序没有执行完毕时,下一个程序需要进行等待,等待上个程序完成,方可进入下个程序(例:main方法)
总结:当前实验,main方法执行结束(线程中start()执行结束),程序结束。
多线程启动条件
硬性条件:都需要实现run方法
1、继承(extends) 被动 实现run方法(可能会忘记)
- 创建Thread类
- 创建线程对象
- 调用Thread中的start()方法
2、实现(implement) 主动 实现run方法(不实现会出现错误)
- 创建Thread类并创建对象
- 创建线程对象
- 把线程对象传入Thread对象中
- 调用start()方法
2、线程窗口实现
public class GameUI extends JFrame{
public void GameUI()
{
setTitle("线程小球Game1.0");//修改线程名 --- 窗口左上角名
setSize(800,1000);//窗口大小
setLocationRelativeTo(null);//窗口居中显示
// setResizable(false);//禁止修改GUI页面大小
setVisible(true);//窗口可视化
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//窗口关闭,停止当前执行程序
}
运行后会出现上图的内容
3、在窗口上画一个小球
在main方法的类当中重写paint方法
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.cyan);//给小球上颜色
g.fillOval(80,100,50,50);//在80,100的坐标上,画一个50*50的小球
}
4、小球"动"起来
//线程类的run方法
class Thread_1 extends Thread
{
int x,y;//横纵坐标
Graphics g;//画笔
public Thread_1(JFrame jf){
this.g = jf.getGraphics();//创建图形上下文
}
public void run()
{
for(int i = 0; ;i++)//注 中间是条件的,这样才能一直移动下去
{
try {
Thread.sleep(10);//延迟10s
} catch (InterruptedException e) {
e.printStackTrace();
}
g.setColor(Color.BLACK);
g.fillOval(x,y,50,50);
x++;
y++;
}
}
另外在main方法中的无参构造中需要添加 以下内容
Video_2022-12-30_151029 - Trim
5、两个小球相向而行
Thread_1不变
下面是Thread_2
class Thread_2 extends Thread {
int x,y;
Graphics g;
public Thread_2(JFrame jf){
this.g = jf.getGraphics();//创建图形上下文
}
@Override
public void run() {
x = 600;//小球初始位置
y = 600;
for (int i = 0; ; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
g.setColor(Color.black);
g.fillOval(x, y, 50, 50);
x--;//由于这是向上走,所以x,y的值是变小的
y--;
}
}
}
Video_2022-12-30_150525 - Trim
6、让小球弹起来1.0
class Thread_2 extends Thread {
int x,y;
Graphics g;
float speedX = -2.4f;//创建一个变量间接控制x
float speedY = -5.2f;//创建一个变量间接控制y
public Thread_2(JFrame jf){
this.g = jf.getGraphics();//创建图形上下文
}
@Override
public void run() {
x= 500;//起始点位
y =500;//起始点位
for (int i = 0; ; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
g.setColor(Color.black);
g.fillOval(x, y, 50, 50);
x+= speedX;
y+= speedY;
if(x<= 0 || x>= 750)//到达边界弹边
{
speedX = -speedX;
}if(y<= 0|| y >= 950)
{
speedY = -speedY;
}
}
}
}
jpg
弹边1 - Trim
7、让小球随机生成并弹边
Random random = new Random();
x = random.nextInt(800);//坐标x范围内值随机
y = random.nextInt(1000);//坐标y范围内值随机
speedX = random.nextInt(20)-5;//弹边的角度随机
speedY = random.nextInt(15)-8;
Color color = new Color(random.nextInt(Integer.MAX_VALUE));//颜色随机
//颜色需要修改为color,若按指定值无法随机颜色
g.setColor(color);
构造方法test_1229()中添加内容
for (int i = 0; i <10 ; i++) {
t2 = new Thread_2(this);
t2.start();
}
多个小球弹边1 - Trim
已上就是小球游戏1.0的内容了,后期还会接着更新哦~,这一期就到这里啦!