当我按下 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 时如何重新开始我的游戏?的主要内容,如果未能解决你的问题,请参考以下文章

当我按下按钮时重新定位标记android API V2

在 Unity 中使用键重新启动场景

当我按下一个按钮时,“不幸的是我的应用程序已停止”[重复]

当我按下一个按钮时我的游戏崩溃了(以 NSException 类型的未捕获异常终止)

如何修复在 Android 中崩溃的活动的重新启动?

点击按钮时 UITableView 重新加载数据