java游戏开发杂谈 - 线程

  1. 云栖社区>
  2. 博客>
  3. 正文

java游戏开发杂谈 - 线程

推荐码发放 2019-04-25 15:06:24 浏览655
展开阅读全文

java游戏开发杂谈 - 线程
线程,让游戏拥有了动态变化的能力。

java的图形界面,在启动的时候,就开始了一个线程。

这个线程负责处理:JFrame、JPanel等的绘制、事件处理。

它是由操作系统调用的,在程序启动时开启,程序关闭时消亡。

这个线程里执行的逻辑,支撑着图形框架的基础逻辑,我们无法控制它。

想一下,游戏里那些动画效果、呼啸而出的子弹、飘来飘去的云朵。。

这些行为都不是我们用按键和鼠标来控制的,是随着时间自己在动的。

它们在动,说明它们的坐标发生了变化,那么谁来控制这些坐标变化的呢?

答案是:另一个线程!

先看一段线程的代码吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package game5;
/**

public class GameThread extends Thread{

 
private GamePanel panel;
 
public GameThread(GamePanel panel){
    this.panel = panel;
}
 
public void run() {
    while(true){
        try {
            //程序运行暂停 0.01秒
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
         
        //循环逻辑的执行
        panel.logic();
         
        //页面刷新
        panel.repaint();
    }
}
 

}
这就是我们定义的、用来控制游戏动态逻辑的、每隔0.01秒就运行一次的线程!

可以把它想成一个定时器,每隔一段时间,就运行一次某个动作。

运行什么动作呢? 游戏的动态逻辑、游戏界面的刷新!

再贴出剩下的两块代码,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package game5;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;
/**

public class GamePanel extends JPanel{

/** 屏幕的宽和高 */
private int width,height;
 
public GamePanel(int width, int height) {
    this.width = width;
    this.height = height;
    this.setSize(width, height);
     
    //设置当前画布可以获得焦点。
    this.setFocusable(true);
}
 
/**方块的位置*/
private int fk_x = 60;
private int fk_y = 60;
 
 
/**
 * 画布的绘制
 */
public void paintComponent(Graphics g) {
    super.paintComponent(g);
     
    //画绿色背景
    g.setColor(new Color(0x9391d6));
    g.fillRect(0, 0, width, height);
     
    //绘制方块
    g.setColor(Color.red);
    g.fillRect(fk_x, fk_y, 80, 80);
}

 
/**
 * 游戏逻辑,处理方块的运动,每次横纵坐标都移动1个像素
 */
public void logic()
{
    if(fk_x < 260){
        fk_x = fk_x + 1;
    }else{
        fk_x = 60;
    }
     
    if(fk_y < 260){
        fk_y = fk_y + 1;
    }else{
        fk_y = 60;
    }
}
 
 

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package game5;

import javax.swing.JFrame;
/**

public class GameFrame extends JFrame{

 
private int width = 600, height = 400;
 
public GameFrame() {
    //设置窗体标题
    this.setTitle("java游戏开发杂谈-台哥出品");
     
    //创建一个画布
    GamePanel panel = new GamePanel(width, height);
    //把画布加入到窗体中
    getContentPane().add(panel, "Center");
     
    //设置窗体大小
    this.setSize(width, height);
    //设置能否调整窗体大小
    this.setResizable(false);
    //这句会使得在屏幕上居中显示
    this.setLocationRelativeTo(null);
    //当关闭窗体的时候退出程序
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    //把窗体显示出来
    this.setVisible(true);
     
    //开始游戏线程的循环
    GameThread gt = new GameThread(panel);
    gt.start();
}

/**
 * 主方法
 */
public static void main(String[] args) {
    GameFrame frame = new GameFrame();
}

}
在游戏界面创建时,我们就创建了游戏线程。游戏界面显示后,游戏线程也随之启动了,然后就不断的调用游戏逻辑、刷新游戏界面。

我们就可以在逻辑方法里进行物体的坐标修改、动画的帧数切换、人物的行为变化、地图的移动等等,游戏线程里这一刻运行的逻辑,影响着下一刻游戏界面上的变化。

上面的三段代码,执行后出现的是,一个方块从屏幕左上角往右下角运动,运动一段后再回到左上角。

最好的学习方法,是实践! 眼过千遍,不如手过一遍!

老老实实的把代码放进Eclipse,执行一遍,看看效果。改改代码,再看看执行效果。

用手写,用眼看,用脑想,缺一不可。

台哥编程课堂,用最口语化的表达,介绍编程如何入门。

为什么这么口语化呢,因为台哥的表达能力太差啦,实在写不出书面语来。。

 原文地址https://www.cnblogs.com/chaohi/p/10766790.html

网友评论

作者关闭了评论