基于多线程的简略小游戏的制作
基于多线程的简单小游戏的制作
最近学习了多线程的相关知识,并基于多线程制作了一个2人对战的小游戏。在做这个的过程中对线程和线程之间的联系有了一个更深刻的认识,而且对键盘监听器和双缓冲也有了一定的认识。
废话不多说,下面是我的游戏(界面略难看,大家请忽略)

人物可以左右移动和跳跃,按向下键则是防御,减少30点伤害。
跳跃和自由落体的代码(使用线程)
即引入了一个gravity变量模拟重力加速度,如果跳跃则给一个向上的速度,然后通过线程完成下落。
左边的人物的技能

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

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

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


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


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

第三个技能是在前方一段距离放出一个火焰守卫,它不能移动,但在持续时间内会对碰到他的敌人造成少量伤害
在游戏中为了持续刷新被人物和技能擦过的屏幕,还是用了双缓冲。双缓冲就是在绘图重绘时,先取得对应位置的图像,然后得到此图像的画布,将你的人物和其他东西画再得到的这个画布上面。代码:
最近学习了多线程的相关知识,并基于多线程制作了一个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); }