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

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

废话不多说,下面是我的游戏(界面略难看,大家请忽略)
[img]http://dl.iteye.com/upload/attachment/532081/64685313-a19f-3ae1-8d43-0b6620fd4539.jpg[/img]

人物可以左右移动和跳跃,按向下键则是防御,减少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变量模拟重力加速度,如果跳跃则给一个向上的速度,然后通过线程完成下落。

左边的人物的技能

[img]http://dl.iteye.com/upload/attachment/532089/a9646433-c0e7-3ad9-ad39-c55eaa0b3531.jpg[/img]
第一个技能是冰弹 造成不错的伤害而且减慢移动,降低跳跃一段时间。

[img]http://dl.iteye.com/upload/attachment/532091/08e5b992-79e5-3c2b-9aac-0d0c53c42c41.jpg[/img]
第二个技能是波浪形态,造成一般的伤害,并在停止时把他也带到停止位置

[img]http://dl.iteye.com/upload/attachment/532095/17fdc573-4829-3919-aba3-d6f87acbedb4.jpg[/img]
第三个技能是链状闪电,它会持续一段时间,在此过程中对方进入到它的范围内会受到伤害,并麻痹直到它结束。

右边人物的技能

[img]http://dl.iteye.com/upload/attachment/532099/7cacc195-d11a-3805-8789-979ef296a1a2.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/532104/4b47b46d-39b4-35c6-b302-31cdb8427e09.jpg[/img]
第一个技能是放出一个不错伤害但是飞行不快的火鸟,在飞行一段后如果没有遇到敌人则会散出8个小量伤害的火球


[img]http://dl.iteye.com/upload/attachment/532112/830e4f62-aaf3-367a-b320-925c5d26b367.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/532115/20deafd0-613f-3bd5-b3f7-472a5580b4b1.jpg[/img]
第二个技能是放出一个火焰 在移动一段距离后会变大 并提升伤害。


[img]http://dl.iteye.com/upload/attachment/532119/36159274-d89e-3401-a037-2ea9920b3f9e.jpg[/img]
第三个技能是在前方一段距离放出一个火焰守卫,它不能移动,但在持续时间内会对碰到他的敌人造成少量伤害

在游戏中为了持续刷新被人物和技能擦过的屏幕,还是用了双缓冲。双缓冲就是在绘图重绘时,先取得对应位置的图像,然后得到此图像的画布,将你的人物和其他东西画再得到的这个画布上面。代码:
// 重写父类绘制窗体的方法
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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值