比尔云BierYun--阿里云最新优惠活动
阿里云优惠码丨阿里云代金券

java游戏开发杂谈 – 游戏物体

java游戏开发杂谈 – 游戏物体

 

现实生活中,有很多物体,每个物体的长相、行为都不同。

物体存在于不同的空间内,它只在这个空间内发生作用。

物体没用了,空间就把它剔除,不然既占地方,又需要花精力管理。

需要它的时候,就把它造出来,不需要它的时候,就把它销毁。


按照面向对象的设计思想,游戏里的物体,我们也把它定义为一个类。

一个类就定义了一种物体的属性、行为。类是对象的模板,对象是类的实例。

我们用一个集合,把所有的游戏物体都放在里面,对它们进行统一的管理。

随着游戏线程的运行,集合里的物体,它们的逻辑和绘制也不断被调用执行。


我这里实现一个例子:游戏里,鼠标点击哪里,哪里就出现一个方块,方块先向上

运动,再往下,当掉落出屏幕后,方块就从游戏中消除。注意方块的加速度机制。

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
package game7;
import java.awt.Color;
import java.awt.Graphics;
/**
 * java游戏开发杂谈
 * ---demo7:游戏物体
 *
 * @author 台哥编程课堂
 * https://www.cnblogs.com/chaohi/
 *
 * @date 2019-04-25
 */
public class FangKuai extends GameObject{
    
    private GamePanel panel;
    
    public FangKuai(GamePanel panel){
        this.panel = panel;
    }
    
    //纵坐标超出多少,就销毁
    public int limit_y ;
    
    private int u = -10//速度
    private int a = 1//加速度
    
    @Override
    public void logic() {
        x = x + 1;
        y = y + u;
        u = u + a;
        if(y > limit_y){
            destory();
        }
    }
    
    @Override
    public void paint(Graphics g) {
        g.setColor(Color.red);
        g.fillRect(x, y, 3030);
    }
    
    /**
     * 自身销毁方法,即从游戏屏幕中消失
     */
    private void destory(){
        panel.remove(this);
    }
    
}
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
package game7;
import java.awt.Graphics;
/**
 * java游戏开发杂谈
 * ---demo7:游戏物体
 *
 * @author 台哥编程课堂
 * https://www.cnblogs.com/chaohi/
 *
 * @date 2019-04-26
 */
public class GameObject {
    
    //所在位置
    public int x, y;
    //自身逻辑
    public void logic(){
        
    }
    
    //自身绘制
    public void paint(Graphics g){
        
    }
    
}
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package game7;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JPanel;
/**
 * java游戏开发杂谈
 * ---demo7:游戏物体
 *
 * @author 台哥编程课堂
 * https://www.cnblogs.com/chaohi/
 *
 * @date 2019-04-25
 */
public class GamePanel extends JPanel implements MouseListener{
    /** 屏幕的宽和高 */
    private int width,height;
    
    public GamePanel(int width, int height) {
        this.width = width;
        this.height = height;
        this.setSize(width, height);
        
        //设置当前画布可以获得焦点。
        this.setFocusable(true);
        
        this.addMouseListener(this);
    }
    
    /**
     * 游戏物体所在的集合
     */
    private List<GameObject> objects = new LinkedList<GameObject>();
    
    
    /**
     * 画布的绘制
     */
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        //画绿色背景
        g.setColor(new Color(0x9391d6));
        g.fillRect(00, width, height);
        
        //绘制出所有游戏物体
        for (int i = 0; i < objects.size(); i++) {
            GameObject go = objects.get(i);
            go.paint(g);
        }
    }
    
    /**
     * 游戏逻辑,调用所有游戏物体的逻辑
     */
    public void logic()
    {
        for (int i = 0; i < objects.size(); i++) {
            GameObject g = objects.get(i);
            g.logic();
        }
    }
    
    
    public void remove(GameObject object){
        objects.remove(object);
    }
    @Override
    public void mouseClicked(MouseEvent e) {
    }
    @Override
    public void mousePressed(MouseEvent e) {
        FangKuai fk = new FangKuai(this);
        fk.x = e.getX() - 15;
        fk.y = e.getY() - 15;
        fk.limit_y = this.height;
        this.objects.add(fk);
    }
    @Override
    public void mouseReleased(MouseEvent e) {
    }
    @Override
    public void mouseEntered(MouseEvent e) {
    }
    @Override
    public void mouseExited(MouseEvent e) {
    }
    
}

另外的GameFrame和GameThread两个类,跟前面两篇博客的一样,这里就不重复贴出了。


游戏的运行截图也不发了,大家可以自己运行下代码,反正就是方块的生成、运动、销毁。

方块继承的是GameObject类,我们继续定义圆形、三角形、五角星等,都让它们继承GameObject,

也可以定义子弹、飞机、植物、地图、人物、怪物等等,只要有行为的物体,都可以继承GameObject。

然后用一个集合来统一管理它们。顺便说下为什么用LinkedList,因为这个链表列表,删除的效率高。


讲到这里,基本上一个游戏的雏形,已经建立起来了,剩下的就是在这个框架上,进行完善。

如同我们学绘画,先要临摹那些正方体、椎体,正是这些基础性的东西,构造出很复杂的图案。

游戏里那些很酷、很炫、很复杂的效果,也都是基于绘制、刷新、线程、事件、有限状态机。

万变不离其宗,掌握好基本的东西,剩下的都是些技巧,运用之妙,存乎一心也。

去开发自己的游戏,享受编程的乐趣吧。。

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

未经允许不得转载:阿里云代金券 » java游戏开发杂谈 – 游戏物体

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

强烈推荐

高性能SSD云服务器ECS抗攻击,高可用云数据库RDS