首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

小弟我的多线程小游戏——坦克大战

2012-12-24 
我的多线程小游戏——坦克大战经过一段时间的小奋斗,终于做出了一个还能玩的多线程小游戏啦!?1:游戏介绍:游

我的多线程小游戏——坦克大战

经过一段时间的小奋斗,终于做出了一个还能玩的多线程小游戏啦!

?

1:游戏介绍:
游戏一共3关,每关的不同点是敌方坦克的强度不同,玩家坦克用键盘操控(按键说明已写在附件中),每隔一段时间还会出现道具,其余游戏说明也已经写在附件中。

(开始界面)


小弟我的多线程小游戏——坦克大战

(游戏运行界面)
?
小弟我的多线程小游戏——坦克大战

2:主要技术要点和学到的经验

????(1):技术要点:

???????????技术要点主要有两个:一是多线程的应用,二就是双缓冲技术。关于线程的使用,在这里,我并没有去考虑机器的承受能力(做的比较猥琐),每个坦克一个线程,每个子弹一个线程,每次出现的爆炸效果也是一个线程,同时还有一个局面的监控线程(主要是负责判断游戏是否结束,是否进入下一关,和道具出现),线程之间的关系是:坦克线程(坦克线程在运行过程中判断是否捡到道具,是否可移动)在运行过程中调用开火方法启动一个子弹线程,子弹线程在运行过程中判断是否应该爆炸(是否打中了东西),如果爆炸的话,这启动爆炸效果线程,同时结束自己的生命。下面是关键代码:

?

??????

?

?关于双缓冲技术的使用:双缓冲技术我理解也不能算十分深刻,在参见人家的代码以后,还算是能够做到吧。

?我自己的理解:双缓冲主要就是去重写update方法,在更新窗体时把下一个要显示的图片整体的画到窗体上去。

?下面是引用stchou博客中对闪屏的解释,和对双缓冲的解释:

paint闪烁的原因:

每一个paint的过后,程序会自行的调用repaint的方法,但是repaint方法中的绘制有的分配一个与原来窗口一样的的内存空间,但里面是没有存储东西的,所以一次次的paint,repaint的交替就会产生闪烁

?

解决方法:双缓冲技术的工作原理:先在内存中分配一个和窗口一样大的空间(在内存中的空间我门是看不到的),然后利用getGraphics()方法去获得该空间并将它全部一次性的显示到屏幕上.这样显示出来就非常的流畅了.避免了闪烁效果.

双缓冲的原理:
 1.建立一个Image对象DbBuffer,通过DbBuffer=createrImage(int width,int height)来在内存中开辟一个长为width 宽为heithr空间.次空间的大小可以和你动画窗口的大小保持一致,也可以利用getwidth()和getheight()来获得动画窗口的大小.
 2.建立一个Graphics 对象GraImage通过GraImage=DbBuffer.getGraphics();去把要绘制的对象并存放到分配好的内存空间中.
 3.利用paint(GraImage);将其全部绘制带内存之中,最后调用我门的paint(Graphics g)方法中的g.drawImage(DbBuffer,0,0,null)将DbBuffer全部一次性的绘制到我门的动画窗口,然后把我门内存中分配的空间窗口关闭调用dispose()方法.

下面是关键代码:

?


小弟我的多线程小游戏——坦克大战

(2):做软件的过程中难免会碰到瓶颈,这时候要主动查询资料,和请教别人。
(3):做软件并不是随随便便,三下五除二就搞定的,它需要我们长时间的琢磨,无论是我们的UI还是AI,打造一个精美的软件是很有挑战性的。


最后,在附件中附上我的这个小游戏和源代码(在jar包中解压即可)。 感谢大家~~~~

1 楼 yinger_fei 2011-11-04   赞一个!! 2 楼 igdnss 2012-05-09   static List<Home> symbol=new ArrayList<Home>();//司令部

//加入司令部

Home home = new Home(250,465);
  symbol.add(home);



//画司令部
   symbol.get(0).drawHome(g);
//击中司令部让司令部消失

private boolean shoot_home()
{  
          int symbol_x = TankClient.symbol.get(0).getX();
          int symbol_y = TankClient.symbol.get(0).getY();

          if(x>symbol_x&&x<symbol_x+75&&y>symbol_y&&y<symbol_y+50)
          {
           TankClient.symbol.remove(0);
           return true;
          }
          

return false;

}

我是学着你写的,自己会的不多,希望谅解。不知道为什么,总出现越界问题,却找不出错误来,谢谢你的帮助。链表里面只有一个司令部。用下标从0开始应该没有什么问题啊

热点排行