线程游戏
线程、进程与线程游戏
在编写线程游戏之前,我们首先要明白线程是什么、进程是什么,以及进程和线程之间的关系。线程:
进程内部并发执行的执行单元,CPU 调度的最小单位。特点:
- 同一个进程里所有线程共享内存资源;
- 一个进程至少包含 1 条主线程(Java 中的 main 主线程);
- 线程切换开销小,支持并发执行。1. 一个进程 ≥ 1 条线程,线程不能脱离进程单独存在;
- 进程是房子,线程是房子里同时干活的人:
- 进程 = 整套房子(独立空间、水电资源);
- 线程 = 屋里好几个人,共用客厅、家具(共享数据),各有自己小房间(私有栈);
- 进程之间互不打扰,同一进程的多条线程会抢共享数据,容易出错。
在线程游戏中如何运用
1. 进程在游戏中的作用
- 单机游戏:整个游戏是一个 JVM 进程,所有画面、怪物、音效都在这个进程里;
- 联机游戏:
- 游戏客户端 = 一个进程;
- 游戏服务器 = 另一个独立进程;
两个进程靠网络通信,内存完全不互通。
- 多开游戏:每开一次游戏,就新建一个独立进程,互不干扰。
2. 线程在游戏中的分工(同一游戏进程内多条线程)
同一个游戏进程里分开多条线程同时工作,避免一件事卡住全部:
- 主线程(UI 渲染线程):只负责刷新画面、窗口显示;
- 怪物 AI 线程:独立控制怪物移动、攻击;
- 音效线程:单独播放背景音乐、打击音效;
- 网络线程:联机收发其他玩家数据。
创建窗体 设置游戏窗口
编程线程游戏的第一步是创建窗体,设置游戏界面的大小和背景颜色。```java
public class GameUI {
public void initUI() {
JFrame jf = new JFrame(“游戏界面”);
// 设置窗体大小
jf.setSize(800, 800);
// 设置窗体居中
jf.setLocationRelativeTo(null);
// 关闭窗口时退出程序
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
```java JPanel gamePanel = new JPanel(); gamePanel.setBackground(Color.WHITE); //设置窗体居中 jf.add(gamePanel,BorderLayout.CENTER); //设置窗体背景颜色 jf.getContentPane().setBackground(Color.WHITE); //使窗体可见 jf.setVisible(true);这样便完成了简单的游戏窗口的设计,使得线程游戏有了呈现的载体,接下来便是通过键盘监听器与键盘相联系使得我们可以通过键盘来控制窗体和游戏。
//提取画笔Graphicsg=gamePanel.getGraphics();// 设立监听器对象GameListenerlistener=newGameListener(g);//添加监听器gamePanel.addMouseListener(listener);gamePanel.addKeyListener(listener);//获取焦点gamePanel.requestFocus();//开启双缓冲gamePanel.setDoubleBuffered(true);//初始化窗体publicstaticvoidmain(String[]args){GameUIui=newGameUI();ui.initUI();}键盘监听器 和各按键功能
当游戏的面板背景设立好后我们就可以着手监听器的编程了,在对监听器代码的编写前,我们要先思考我们所需要用到的有哪些,比如键盘中的空格键创造玩家对象,J键发射子弹,R键暂停等等按键所对应的功能,然后再去编码。
publicclassGameListenerextendsMouseAdapterimplementsKeyListener{publicGraphicsg;publicGameListener(Graphicsg){this.g=g;publicMPlanemp;}publicvoidmouseClicked(MouseEvente){System.out.println("点击!!!");intx=e.getX();inty=e.getY();}publicvoidkeyPressed(KeyEvente){intkey=e.getKeyCode();System.out.println("key="+key);switch(key){caseKeyEvent.VK_A:mp.speedx=-5;break;caseKeyEvent.VK_D:mp.speedx=5;break;}以上是控制玩家飞机移动的代码,我们需要创建一个类MPlane来写关于玩家飞机的运行代码,并且创建mp对象来表示玩家从而控制玩家的左右移动
以及设定玩家飞机的属性和形状大小和设定玩家飞机的移动方法
publicclassMPlane{publicintx,y,size;publicintspeedx,speedy;publicImageimage;publicImageObserverobserver;publicMPlane(intx,inty){this.x=x;this.y=y;size=100;ImageIconicon=newImageIcon("C:\\Users\\35053\\Pictures\\Saved Pictures\\plane.png.png");System.out.println(icon.getImageLoadStatus());image=icon.getImage();}publicvoiddrawPlane(Graphicsg){g.drawImage(image,x,y,observer);move();}publicvoidmove(){y+=speedy;x+=speedx;}}publicImageimage;publicImageObserverobserver;ImageIconicon=newImageIcon("C:\\Users\\35053\\Pictures\\Saved Pictures\\plane.png.png");System.out.println(icon.getImageLoadStatus());image=icon.getImage();}这几行代码的目的是从计算机中导出图片作为玩家飞机,当我们把玩家飞机的各属性设置好后,我们接下来就需要设置小游戏的各种线程,例如发射子弹,游戏暂停,自动发射子弹,敌机的自由落下等等。