游戏资源是从cping1982的博客里下载的(blog.csdn/cping1982/article/details/6725015)。
下载下来的源码是反编译的,我按照自己的思路,尽量模拟跟它一样的功能效果,用自己的代码实现,并且自己写了一个地图编辑器。
用到的技术大概有:swing基本控件,线程,XML读写,IO,反射的简单应用,2D绘图。
最重要的一个自定义类:Canvas
每个canvas都有一个render方法和update方法,每个canvas又可以添加别的canvas,类似swingcomponent结构,每个canvas执行renderupdate的时候都会遍历所有子canvas执行renderupdate,从而实现所有canvas都执行渲染和更新。
游戏的刷新机制:
这个刷新机制是直接学的原代码里面的实现机制,看它没注释的代码着实蛋疼,还是请教了我师傅desolatecity大神才理解的- -!。
最高层是一个继承JFrameGameFrame,实现了Runnable,游戏启动后会单独运行不断循环刷新,每隔大概15ms就执行一次render,并将整个循环所用时间通过update方法传给canvas,最高层canvas再一层一层传递下去,实现所有canvas的渲染和更新。大致代码实现如下:
[java] view plaincopy
1. while (gameOn) { 
2.             // 获取开始时的系统时间 
3.             long startTime = System.currentTimeMillis(); 
4.  
5.             // 标记时间所用变量 
6.             long l1; 
7.             long l2 = System.currentTimeMillis(); 
8.             long l3 = System.currentTimeMillis(); 
9.  
10.             // 执行for循环,直到经过了step毫秒 
11.             for (l1 = l3 - l2; l1 < step; l1 = l3 - l2) { 
12.                 l3 = System.currentTimeMillis(); 
13.             } 
14.             // for循环结束,开始渲染和更新 
15.             l2 = System.currentTimeMillis(); // 重置l2 
16.  
17.             this.getCurrentCanvas().render(g2); // 渲染 
18.  
19.             this.getGraphics().drawImage(bufImg, 00null); // 将缓冲图片画到JFrame 
20.  
21.             long endTime = System.currentTimeMillis(); // 获取结束时的系统时间 
22.  
23.             this.getCurrentCanvas().update(endTime - startTime); // 获取当前循环刷新所用时间并更新 
24.  
25.             try { 
26.                 Thread.sleep(sleep); 
27.             } catch (Exception e) { 
28.                 e.printStackTrace(); 
简单的java游戏代码
29.             } 
30.  
31.         } 

游戏结构:
大致可分为三个层次:一是最高层的JFrame,二是JFrame里的主canvas,三是主canvas里面的各个子canvas(敌人,玩家,子弹,控件等)。每个canvas都有自己的renderupdate方法,所有的渲染和更新,都在各自重写的方法里实现,update里面接受一个long类型的时间参数l,表示经过了l毫秒,然后更新自己的位置,方向,速度,显示规则等,最后通过render显示出来,从而实现整个画面的运动。
整个游戏还有一个比较重要的东西,就是地图的存储。游戏的地图信息是存储在xml文件里的,通过地图读取工具,将xml的信息提取,并按照时间元素的映射关系将时间和对应
元素存储到一个IdentityHashMap里,然后游戏的主canvasupdate的时候遍历IdentityHashMap,若当前时间满足map里面的时间,则将对应的元素提取出来,添加到当前的子canvas列表里面,从而一个新的元素(或敌人,或提示消息等)就被添加到了界面上。这里我用到了一个比较少用的IdentityHashMap,原本直接用的是HashMap,后来发现一个时间有时候要对应多个元素,然后上网查到了这个东东,但是由于键是按照对象来存储的,所以要把时间用String对象来存储, 搞得读取和存储的时候各种麻烦。结果后来师傅一指点才知道,可以直接用HashMap来存储时间--ArrayList” ,这样又方便又直接。- -!后来嫌麻烦也不去改了。。。
地图编辑器:
地图编辑器没有什么特别费脑袋的地方,就是各种swing控件的运用,还有xml的读写,简单的反射应用等。
由于整个游戏基本上都是在边学变写,所以很多地方写的很粗糙,以至于后来去整理的时候发现前面的代码结构简直丑死了- -,改都该了半天。
最后附上源码下载地址,如果有兴趣的话可以互相探讨学习。
下载地址:download.csdn/download/jianglihui0330/4493082
游戏截图:
地图编辑器截图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。