html5游戏与传统游戏可比性,一个HTML 5 躲避游戏的实现(3)

这篇博客介绍了如何通过JavaScript实现一个简单的游戏,利用keydown和keyup事件监听键盘输入,动态更新主角和怪物的位置。游戏采用了时间间隔内的动作判断,确保主角平滑移动。同时,通过矩形碰撞检测判断主角与怪物是否相撞,增加了游戏的交互性和挑战性。此外,每5秒会增加一个怪物,增加了游戏难度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Step 3 游戏动起来!

先添加一个事件来接收键盘的动作,上下左右用对应的ascii码。因为游戏并不是摁一下方向键,就移动一段距离。而是,判断一个时间间隔内的动作(最后的动作,中间有可能会变化,故用数组保存最后结果)。

varkeysDown= {};

addEventListener("keydown", function (e) {

keysDown[e.keyCode] = true;//如果有"keydown"这个动作,即摁下某键,就会存进keysDown数组

}, false);

addEventListener("keyup", function (e) {

delete keysDown[e.keyCode];

});

下面上主函数

varmain=function() {

varnow=Date.now();

vardelta=now- then;

Move(delta / 1000);//每次间隔时间根本不是1ms,比1ms要大得多

Draw();

Check();

then=now;

}

main函数就是主函数,就是一个刷新所执行的函数。now、then两个变量记录两次刷新的时间间隔,这个时间间隔并不是固定的,一般为几百毫秒。delta 是两者之差,单位为毫秒。下面依次解释各个函数:Move()用来计算英雄和怪物的新位置。Draw()用来画背景、人物、文字。Check()用来检查,怪物和英雄是否相撞。

Move():

varMove=function(modifier) {

if (38 in keysDown) {

hero.y-=hero.speed * modifier;

}

if (40 in keysDown) {

hero.y += hero.speed * modifier;

}

if (37 in keysDown) {

hero.x-=hero.speed * modifier;

}

if (39 in keysDown) {

hero.x += hero.speed * modifier;

}

if (hero.x>= canvas.width - 32) {

hero.x=0;

}else if (hero.x<= 0) {

hero.x=canvas.width - 32;

}

if (hero.y>= canvas.height - 32) {

hero.y=0;

}else if (hero.y<= 0) {

hero.y=canvas.height - 32;

}

for (vari=0; i<= monsterSum; i++) {

monsterList[i].move(modifier);

}

}

这里很好理解,判断这段时间间隔英雄的动作。算出新位置后,判断英雄是否跑出了画布,跑出了就从另一头出来(感谢 @昭曈 的创意)。接下来依次调用各个怪物的move函数,计算他们的新位置。

Draw():

varDraw=function() {

if (bgReady) {

ctx.drawImage(bgImage, 0 ,0);

}

if (heroReady) {

ctx.drawImage(heroImage, hero.x, hero.y);

}

if (monsterReady) {

for (vari=0; i<= monsterSum; i++)

ctx.drawImage(monsterImage, monsterList[i].x, monsterList[i].y);

}

ctx.fillStyle="rgb(250, 250, 250)";

ctx.font="24px Helvetica";

ctx.textAlign="left";

ctx.textBaseline="top";

last=Date.now() - start;

ctx.fillText(last/1000, 32, canvas.height - 64);

}

前三个函数类似,就是如果准备好了图片就画东西上去(前面的三个ready函数派上了用场)。下面先定义了文字的style,然后计算出时间间隔last,然后画上去。

Check():

varCheck=function() {

if (monsterSum != Math.floor(last / 5000)){//如果时间经过5秒就增加一个怪兽实例

monsterSum ++;

monsterList[monsterSum] = new monster();

}

for (vari=0; i<= monsterSum; i++) {

if (

(monsterList[i].x - 32)<= hero.x

&& hero.x<= (monsterList[i].x + 32)

&& (monsterList[i].y - 32)<= hero.y

&& hero.y<= (monsterList[i].y + 32)

) {

end=Date.now();

alert("你坚持了" + (end - start)/1000 + "秒");

End();

}

}

}

第一步是 如果经过5秒就增加一个怪兽,然后下面一个个判断怪兽与英雄是否接触。(这里用的是矩形,@小樟 说可以用圆心,感兴趣的可以试试: ) )

大家注意到了下面用到了一个end函数。下面补充,如果不停止一直刷新就浏览器就一直动了,故要有个结束函数。

End():

varEnd=function() {

if (bgReady) {

ctx.drawImage(bgImage, 0 ,0); //留住背景

}

window.clearInterval(timer);

return;

}

用到的clearInterval()稍后会说到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值