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

基于多线程的简略小游戏的制作

2012-10-31 
基于多线程的简单小游戏的制作最近学习了多线程的相关知识,并基于多线程制作了一个2人对战的小游戏。在做这

基于多线程的简单小游戏的制作
  最近学习了多线程的相关知识,并基于多线程制作了一个2人对战的小游戏。在做这个的过程中对线程和线程之间的联系有了一个更深刻的认识,而且对键盘监听器和双缓冲也有了一定的认识。

  废话不多说,下面是我的游戏(界面略难看,大家请忽略)


  人物可以左右移动和跳跃,按向下键则是防御,减少30点伤害。
  跳跃和自由落体的代码(使用线程)

public void Activity() {if (KListener.command2 == KeyEvent.VK_UP) {if (Jnum > 0) {// 擦除之前的位置g.setColor(Color.BLACK);g.fillRect(x, y, 40, 80);t = 1;isJump = true;isFall = false;y = y + jump + gravity * t;if (d == 1) {g.drawImage(fireh, x, y, 40, 80, null);} else {g.drawImage(fireh1, x, y, 40, 80, null);}Jnum--;}}

public void run() {while (true) {Activity();checkPalce();// 英雄跳跃的动作if (isJump) {t++;// 擦除之前的位置g.setColor(Color.BLACK);g.fillRect(x, y, 40, 80);y = y + jump + gravity * t;if (d == 1) {g.drawImage(fireh, x, y, 40, 80, null);} else {g.drawImage(fireh1, x, y, 40, 80, null);}}if (isFall) {// 擦除之前的位置g.setColor(Color.BLACK);g.fillRect(x, y, 40, 80);y = y + gravity * t;if (d == 1) {g.drawImage(fireh, x, y, 40, 80, null);} else {g.drawImage(fireh1, x, y, 40, 80, null);}t++;}try {Thread.sleep(60);} catch (Exception e) {e.printStackTrace();}}

即引入了一个gravity变量模拟重力加速度,如果跳跃则给一个向上的速度,然后通过线程完成下落。

左边的人物的技能


第一个技能是冰弹 造成不错的伤害而且减慢移动,降低跳跃一段时间。


第二个技能是波浪形态,造成一般的伤害,并在停止时把他也带到停止位置


第三个技能是链状闪电,它会持续一段时间,在此过程中对方进入到它的范围内会受到伤害,并麻痹直到它结束。

右边人物的技能




第一个技能是放出一个不错伤害但是飞行不快的火鸟,在飞行一段后如果没有遇到敌人则会散出8个小量伤害的火球





第二个技能是放出一个火焰 在移动一段距离后会变大 并提升伤害。



第三个技能是在前方一段距离放出一个火焰守卫,它不能移动,但在持续时间内会对碰到他的敌人造成少量伤害

在游戏中为了持续刷新被人物和技能擦过的屏幕,还是用了双缓冲。双缓冲就是在绘图重绘时,先取得对应位置的图像,然后得到此图像的画布,将你的人物和其他东西画再得到的这个画布上面。代码:
// 重写父类绘制窗体的方法public void paint(Graphics g) {if (offScreenImage == null) {// 截取窗体所在位置的图片offScreenImage = this.createImage(550, 450);}// 获得截取图片的画布Graphics gImage = offScreenImage.getGraphics();// 获取画布的底色并且使用这种颜色填充画布Color c = Color.BLACK;gImage.setColor(c);gImage.fillRect(0, 0, 550, 450); // 有清除上一步图像的功能,相当于gImage.clearRect(0,super.paint(gImage);gImage.setColor(Color.green);gImage.fillRect(0, 440, 550, 10);gImage.fillRect(150, 340, 250, 10);//显示冰英雄的血量String str = Integer.toString(IceHero.HP); gImage.setColor(Color.WHITE);gImage.drawString(str,0, 90);//显示火英雄的血量String str2 = Integer.toString(FireHero.HP); gImage.setColor(Color.WHITE);gImage.drawString(str2,0, 100);if (IceHero.d == 1) {gImage.drawImage(iceh, IceHero.x, IceHero.y, 40, 80, null);} else {gImage.drawImage(iceh1, IceHero.x, IceHero.y, 40, 80, null);}if (FireHero.d == 1) {gImage.drawImage(fireh, FireHero.x, FireHero.y, 40, 80, null);} else {gImage.drawImage(fireh1, FireHero.x, FireHero.y, 40, 80, null);}// 将接下来的图片加载到窗体画布上去,才能看到每次画的效果g.drawImage(offScreenImage, 0, 0, null);}

热点排行