当前位置: 首页 > 知识库问答 >
问题:

让画布元素在按住键的同时移动,然后在放开时停止

简烨烁
2023-03-14

http://jsfiddle.net/genome314/4Hm8X/

代码问题:如果您按住箭头键并查看控制台 - 每次按键后键都会触发。此外,按住箭头键后,对象停止移动。

为什么在这种情况下这是一个问题:我希望每次发射箭头键时方块都移动,然后在发射键时方块停止。

预期效果:我想按住一个键来移动盒子,然后当我放开这个键的时候它就停止移动。

  • 这是可以实现的吗?如果是这样,大致如何?如果没有,是否有其他方法来注册方向?

声明一下,我不想使用Jquery。感谢任何提示或建议。

java描述语言

keyLeft = 0;
keyRight = 0;
keyNorth = 0;
keyBot = 0;
var interval;
var c = 0;

window.onload=function(){
    addButton.addEventListener
        ('click',function(){addRowCell("table1")},false);
    removeButton.addEventListener
        ('click',function(){deleteRowCell("table1")},false);
    stopButton.addEventListener('click',stop,false);
    startButton.addEventListener('click',initiate,false);
}
//38 up
//37 left
//40 down
//39 right
document.onkeydown = function (e) {

    console.debug(e.keyCode, "down");
    console.debug(e.keyCode, "up");

    switch (e.keyCode){
        case 37:
            initiateLeft();
            break;
        case 38:
            initiateNorth();
            break;
        case 40:
            initiateBot();
            break;
        case 39:
            initiateRight();
            break;
        case 32:
            stop();
            break;
    }
}

function stop(){
    clearInterval(interval);
}
function initiateRight(){
    clearInterval(interval);
    interval = setInterval(right,100);
}
function initiateLeft(){
    clearInterval(interval);
    interval = setInterval(left,100);
}
function initiateNorth(){
    clearInterval(interval);
    c=0;
    interval = setInterval(north,100);
}
function initiateBot(){
    clearInterval(interval);
    interval = setInterval(bot,100);
}

function right(){
    var x = document.getElementById("counter");
    x.value = keyRight;
    var d = document.getElementById("canv1");
    var ctx = d.getContext("2d");
    var ctx1 = document.querySelector('#canv1').getContext('2d');
    ctx1.clearRect(0,0,100,100);    
    ctx.strokeRect(20+keyRight-keyLeft,20-keyNorth+keyBot,40,40);
    keyRight++;
}
function left(){
    var x = document.getElementById("counter");
    x.value = keyLeft;
    var d = document.getElementById("canv1");
    var ctx = d.getContext("2d");
    var ctx1 = document.querySelector('#canv1').getContext('2d');
    ctx1.clearRect(0,0,100,100);
    ctx.strokeRect(20+keyRight-keyLeft,20-keyNorth+keyBot,40,40);
    keyLeft++;
}
function north(){
    var x = document.getElementById("counter");
    x.value = keyNorth;
    var d = document.getElementById("canv1");
    var ctx = d.getContext("2d");
    var ctx1 = document.querySelector('#canv1').getContext('2d');
    ctx1.clearRect(0,0,100,100);
    keyNorth+=(10-c);
    c+=2;
    ctx.strokeRect(20+keyRight-keyLeft,20-keyNorth+keyBot,40,40);
    if(20-keyNorth == 20)
    clearInterval(interval);
}
function bot(){
    var x = document.getElementById("counter");
    x.value = keyBot;
    var d = document.getElementById("canv1");
    var ctx = d.getContext("2d");
    var ctx1 = document.querySelector('#canv1').getContext('2d');
    ctx1.clearRect(0,0,100,100);
    ctx.strokeRect(20+keyRight-keyLeft,20-keyNorth+keyBot,40,40);
    keyBot++;
}

超文本标记语言

<canvas id="canv1" width="300px" height="100px"></canvas>
<input id="counter" style="width:40px;"></input>
<div style="clear:left;">
Press spacebar to pause.<br>

共有1个答案

齐昊焱
2023-03-14

我希望我没有做你的功课。如果是这样,你应该感到内疚。

keyLeft = 0;
keyRight = 0;
keyNorth = 0;
keyBot = 0;
var interval;
var c = 0;



//38 up
//37 left
//40 down
//39 right
document.onkeydown = function (e) {

    console.debug(e.keyCode, "down");
    console.debug(e.keyCode, "up");

    switch (e.keyCode){
        case 37:
            initiateLeft();
            break;
        case 38:
            initiateNorth();
            break;
        case 40:
            initiateBot();
            break;
        case 39:
            initiateRight();
            break;
        case 32:
            stop();
            break;
    }
}

function stop(){

}
function initiateRight(){

    interval = setTimeout(right,100);
}
function initiateLeft(){

    interval = setTimeout(left,100);
}
function initiateNorth(){

    c=0;
    interval = setTimeout(north,100);
}
function initiateBot(){

    interval = setTimeout(bot,100);
}

function right(){

    var x = document.getElementById("counter");
    x.value = keyRight;
    var d = document.getElementById("canv1");
    var ctx = d.getContext("2d");
    var ctx1 = document.querySelector('#canv1').getContext('2d');
    ctx1.clearRect(0,0,100,100);    
    ctx.strokeRect(20+keyRight-keyLeft,20-keyNorth+keyBot,40,40);
    keyRight++;
}
function left(){
    var x = document.getElementById("counter");
    x.value = keyLeft;
    var d = document.getElementById("canv1");
    var ctx = d.getContext("2d");
    var ctx1 = document.querySelector('#canv1').getContext('2d');
    ctx1.clearRect(0,0,100,100);
    ctx.strokeRect(20+keyRight-keyLeft,20-keyNorth+keyBot,40,40);
    keyLeft++;
}
function north(){
    var x = document.getElementById("counter");
    x.value = keyNorth;
    var d = document.getElementById("canv1");
    var ctx = d.getContext("2d");
    var ctx1 = document.querySelector('#canv1').getContext('2d');
    ctx1.clearRect(0,0,100,100);
    keyNorth+=(10-c);
    c+=2;
    ctx.strokeRect(20+keyRight-keyLeft,20-keyNorth+keyBot,40,40);
}
function bot(){
    var x = document.getElementById("counter");
    x.value = keyBot;
    var d = document.getElementById("canv1");
    var ctx = d.getContext("2d");
    var ctx1 = document.querySelector('#canv1').getContext('2d');
    ctx1.clearRect(0,0,100,100);
    ctx.strokeRect(20+keyRight-keyLeft,20-keyNorth+keyBot,40,40);
    keyBot++;
}
 类似资料:
  • 问题内容: 目前,每次按键时,精灵仅移动1个像素。按住左右键时,如何使水暖工精灵不断移动? 问题答案: 您可以使用pygame.key.get_pressed来做到这一点。 例:

  • 我有一个你可以攻击的游戏。当空格键被按下时,武器向下移动,当它被释放时,它应该向上移动。 提前致谢

  • 问题内容: 我创建了一个JFrame,它的中央有一个矩形,当我按某些键时,该矩形会移动。一切都很好,但当我松开按键时,矩形会继续前进。实际上,如果我多次按一个键,则矩形会加速。这可能是(肯定),因为在按下某个键时,我正在使用计时器来避免令人讨厌的0.5秒输入延迟。 我认为我必须在该方法中添加一些内容,但是我对放置在其中的内容一无所知。有小费吗?谢谢。 PS: 请 不要对我不使用按键绑定大吼大叫。我

  • 如果孩子在焦点中(已被点击),我怎么能失去父母的悬停状态?我有一个菜单箭头(用OPEN代替了它,以减少代码),它在悬停状态下打开我的菜单和菜单项,当我单击它们时,菜单项就会聚焦。在菜单项点击后,我希望能够失去对我父母的关注,这样菜单就会消失。 如果可能的话,我会尽量避免使用javascript,这是我最好的尝试... 这是我的html null null 编辑 我在一个单页应用程序上使用Angul

  • 本文向大家介绍在不播放动画时为元素设置CSS样式,包括了在不播放动画时为元素设置CSS样式的使用技巧和注意事项,需要的朋友参考一下 不播放动画时,使用animation-fill-mode属性设置元素的样式 示例

  • 我正在创建一个脚本,如果用户按下f7,它将开始记录鼠标点击,当他释放按钮,它应该停止,这发生,除非用户关闭程序。 我写了一个代码,在按下f7的时候开始记录按键,但是当释放它的时候仍然记录按键,因为按键处于连续按下的位置,它继续启动多个监听器,数据不断冗余。 在发布f7之后,listener也没有停止 这是密码