当我按下 ENTER 时如何重新开始我的游戏?
Posted
技术标签:
【中文标题】当我按下 ENTER 时如何重新开始我的游戏?【英文标题】:How can I restart my game when I press ENTER? 【发布时间】:2015-02-10 02:55:57 【问题描述】:我做了一个简单的游戏,差不多完成了,我唯一剩下的就是当我按下 Enter 时让游戏重新开始。现在游戏在我按下 Enter 时开始,但它没有重新启动。
有人可以帮帮我吗?
这是启动游戏的代码
document.onkeydown = function tast (e)
if (e.keyCode == 39) // høyre
høyre = 1;
if (e.keyCode == 37) // venstre
venstre = 1;
if (e.keyCode == 38) // opp
opp = 1;
if (e.keyCode == 40) // ned
ned = 1;
if(e.keyCode == 32)
newskudd();
snd.play();
console.log("hit space")
if(e.keyCode == 13)
spill();
查看演示点击链接DEMO
溢出();功能是
function spill()
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (var i = 0; i < kuler.length; i++)
kuler[i].x += 0;
kuler[i].y += kuler[i].dy;
ctx.fillStyle = kuler[i].f;
ctx.beginPath();
ctx.arc(kuler[i].x, kuler[i].y, kuler[i].r, 2*Math.PI, 0);
ctx.closePath();
ctx.fill();
if (venstre == 1)
kuler[0].x -= 4;
if (høyre == 1)
kuler[0].x += 4;;
if (opp == 1)
kuler[0].y -= 4;
if (ned == 1)
kuler[0].y += 4;
if (kuler[0].x >= canvas.width-kuler[0].r)
kuler[0].x = canvas.width-kuler[0].r
;
if (kuler[0].x <= 0+kuler[0].r)
kuler[0].x = 0+kuler[0].r
;
if (kuler[0].y >= canvas.height-kuler[0].r)
kuler[0].y = canvas.height-kuler[0].r
;
if (kuler[0].y <= 0+kuler[0].r)
kuler[0].y = 0+kuler[0].r
;
for (var j = 0; j < fiender.length; j++)
ctx.fillStyle = "blue";
ctx.beginPath();
ctx.arc(fiender[j].x, fiender[j].y, fiender[j].r, 2*Math.PI, 0);
ctx.closePath();
ctx.fill();
fiender[j].y += fiender[j].vy;
if (fiender[j].x >= canvas.width -fiender[j].r)
fiender[j].x =canvas.width - fiender[j].r;
;
if (fiender[j].x <= 0 + fiender[j].r)
fiender[j].x =0 + fiender[j].r;
;
if (fiender[j].vy >= 2)
fiender[j].vy = 2;
;
/*if (fiender[j].y + fiender[j].r >= kuler[i].y && fiender[j].x + fiender[j]. == kuler[i].x) // remove kuler[i] and fiender[j]
fiender.splice(j, 1);
kuler.splice(i,1);
;*/
var distanceFromCenters = Math.sqrt(Math.pow(Math.abs(fiender[j].x - kuler[i].x),2) + Math.pow(Math.abs(fiender[j].y - kuler[i].y),2 )); // you have a collision
if (distanceFromCenters <= (fiender[j].r + kuler[i].r))
fiender.splice(j, 1);
kuler.splice(i,1);
poeng += 1;
else if (fiender[j].y > canvas.height)
fiender.splice(j,1)
if(j > 1)
fiender.splice(j,1)
tekst.innerhtml = ( "Poeng: " + poeng )
requestAnimationFrame(spill);
【问题讨论】:
您确定名称høyre
将得到支持吗?
høyre 只是挪威方向的名称
一切正常,除了 restat kode
我快速浏览了您的演示,每次按下回车时都会按预期调用spill()
。这会导致游戏在结束之前加速,之后似乎没有任何效果。无论哪种方式,问题似乎都不在于您在此处发布的代码。
@morten 正如亚当所说,enter
键工作得很好,但有意想不到的效果。您需要发布spill()
函数,以便我们查看。您很可能需要重置变量和clearTimeouts()
,以便重置计时器。
【参考方案1】:
我认为每次按下spill()
时,您都会开始一个新的requestAnimationFrame
循环。因此,每次你按下spill()
,你实际上是在双重调用你的y coordinate
转换:fiender[j].y += fiender[j].vy;
Read here on how to properly start/stop a window.requestAnimationFrame
var requestId;
function loop()
...
// do stuff
...
requestId = window.requestAnimationFrame(loop, canvas);
function start()
if (!requestId)
loop();
function stop()
if (requestId)
window.cancelAnimationFrame(requestId);
requestId = undefined;
【讨论】:
以上是关于当我按下 ENTER 时如何重新开始我的游戏?的主要内容,如果未能解决你的问题,请参考以下文章