gpt4 book ai didi

javascript - 是否有可能使 JQuery keydown 响应更快?

转载 作者:行者123 更新时间:2023-11-28 04:03:52 25 4
gpt4 key购买 nike

我正在使用 JQuery 和 HTML5 canvas 标签编写一个简单的页面,通过按“w”向上、“s”向下、“a”向左和“d”向右移动 Canvas 上的形状。我一切正常,但我希望形状在敲击键时开始以恒定速度移动。现在有某种保持期,然后运动开始。我怎样才能让运动立即发生?

这是我的代码的重要部分:

<script src="jquery.js"></script>
<script src="JQuery.print.js"></script>
<body>
<canvas id="myCanvas" width="500" height="200" style="border:1px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas>
<br><br>
start navigating<input type="text" id = "enter"/>
<div id = "soul2">
coords should pop up here
</div>
<div id = "soul3">
key should pop up here
</div>

<script>

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
//keypress movements
var xtriggered = 0;
var keys = {};
var north = -10;
var east = 10;
var flipednorth = 0;

$(document).ready(function(e){
$("input").keydown(function(){
keys[event.which] = true;
if (event.which == 13) {
event.preventDefault();
}
//press w for north
if (event.which == 87) {
north++;
flipednorth--;
}
//press s for south
if (event.which == 83) {
north--;
flipednorth++;
}
//press d for east
if (event.which == 68) {
east++;
}
//press a for west
if (event.which == 65) {
east--;
}
var msg = 'x: ' + flipednorth*5 + ' y: ' + east*5;
ctx.beginPath();
ctx.arc(east*6,flipednorth*6,40,0,2*Math.PI);
ctx.stroke();
$('#soul2').html(msg);
$('#soul3').html(event.which );
$("input").css("background-color","#FFFFCC");
});

$("input").keyup(function(){
delete keys[event.which];
$("input").css("background-color","#D6D6FF");
});
});

</script>

如果我不应该发布这么长的代码,请告诉我。

最佳答案

您缺少的是“游戏循环”。

在决定是否以及何时在 Canvas 上移动图形时,您不必直接对按下或向上键作出 react ,而是需要使用按键事件来跟踪在任何给定时刻按下了哪些键,然后检查该键来自 setTimeout() 的状态独立于关键事件运行的基于循环。

您已经开始用您的 keys 做到这一点随时跟踪给定键是否按下的变量:

// in keydown
keys[event.which] = true;
// in keyup
delete keys[event.which];

...除了event未定义 - 您需要将其作为事件处理程序的参数,并且您的代码也没有实际检查 keys 中的值.

这是我所说内容的简化版本:

$(document).ready(function(e){
var keys = {};

$("input").keydown(function(event){
keys[event.which] = true;
}).keyup(function(event){
delete keys[event.which];
});

function gameLoop() {
// w for north
if (keys[87]) {
north++;
flipednorth--;
}
//press s for south
if (keys[83]) {
north--;
flipednorth++;
}
// etc. for other keys

// code to move objects and repaint canvas goes here

setTimeout(gameLoop, 20);
}
gameLoop();
});

演示:http://jsfiddle.net/ktHdD/1/

gameLoop()函数将运行 20 毫秒左右(您可以根据需要改变它,但对于相当流畅的动画来说,这已经足够快了)。每次运行时,它都会检查是否有任何键被按下,如果是,则调整相关的位置变量并重新绘制。如果你有其他自动移动的对象(例如,在游戏中可能有坏人)你会在 gameLoop() 中更新它们功能也一样。

关于javascript - 是否有可能使 JQuery keydown 响应更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13538168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com