如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
游戏资源是从HYPERLINK"http://my.csdn.net/cping1982"\t"_blank"cping1982的博客里下载的(HYPERLINK"http://blog.csdn.net/cping1982/article/details/6725015"\t"_blank"http://blog.csdn.net/cping1982/article/details/6725015)。下载下来的源码是反编译的,我按照自己的思路,尽量模拟跟它一样的功能效果,用自己的代码实现,并且自己写了一个地图编辑器。用到的技术大概有:swing基本控件,线程,XML读写,IO,反射的简单应用,2D绘图。最重要的一个自定义类:Canvas。每个canvas都有一个render方法和update方法,每个canvas又可以添加别的canvas,类似swing的component结构,每个canvas执行render和update的时候都会遍历所有子canvas执行render和update,从而实现所有canvas都执行渲染和更新。游戏的刷新机制:这个刷新机制是直接学的原代码里面的实现机制,看它没注释的代码着实蛋疼,还是请教了我师傅HYPERLINK"http://my.csdn.net/desolatecity"\t"_blank"desolatecity大神才理解的--!。最高层是一个继承JFrame的GameFrame,实现了Runnable,游戏启动后会单独运行不断循环刷新,每隔大概15ms就执行一次render,并将整个循环所用时间通过update方法传给canvas,最高层canvas再一层一层传递下去,实现所有canvas的渲染和更新。大致代码实现如下:[java]HYPERLINK"http://blog.csdn.net/jianglihui0330/article/details/7854555"\o"viewplain"viewplainHYPERLINK"http://blog.csdn.net/jianglihui0330/article/details/7854555"\o"copy"copywhile(gameOn){//获取开始时的系统时间longstartTime=System.currentTimeMillis();//标记时间所用变量longl1;longl2=System.currentTimeMillis();longl3=System.currentTimeMillis();//执行for循环,直到经过了step毫秒for(l1=l3-l2;l1<step;l1=l3-l2){l3=System.currentTimeMillis();}//for循环结束,开始渲染和更新l2=System.currentTimeMillis();//重置l2this.getCurrentCanvas().render(g2);//渲染this.getGraphics().drawImage(bufImg,0,0,null);//将缓冲图片画到JFramelongendTime=System.currentTimeMillis();//获取结束时的系统时间this.getCurrentCanvas().update(endTime-startTime);//获取当前循环刷新所用时间并更新try{Thread.sleep(sleep);}catch(Exceptione){e.printStackTrace();}}游戏结构:大致可分为三个层次:一是最高层的JFrame,二是JFrame里的主canvas,三是主canvas里面的各个子canvas(敌人,玩家,子弹,控件等)。每个canvas都有自己的render和update方法,所有的渲染和更新,都在各自重写的方法里实现,update里面接受一个long类型的时间参数l,表示经过了l毫秒,然后更新自己的位置,方向,速度,显示规则等,最后通过render显示出来,从而实现整个画面的运动。整个游戏还有一个比较重要的东西,就是地图的存储。游戏的地图信息是存储在xml文件里的,通过地图读取工具,将xml的信息提取,并按照“时间-元素”的映射关系将时间和对应元素存储到一个IdentityHashMap里,然后游戏的主canvas在update的时候遍历IdentityHashMap,若当前时间满足map里面的时间,则将对应的元素提取出来,添加到当前的子canvas列表里面,从而一个新的元素(或敌人,或提示消息等)就被添加到了界面上。这里我用到