【发布时间】:2015-08-02 03:14:51
【问题描述】:
我想在我的图块游戏中实现角色移动,这样它就不会向服务器发送关键事件的垃圾邮件。目前我已经使用 setInterval 限制了发送的事件数量。
我的想法有问题:
如果玩家没有在正确的时间点按某个键,则移动可能不起作用
连续点击一个键(例如向右箭头),只会在 setInterval 接收事件时发送键事件。这让它看起来有问题。
我的代码有好处:
如果你只是拿着钥匙,它就可以完美运行。
一次按住两个键可以沿对角线移动。代码存储正在按下的键。
可能有帮助的事情:
- 与对关键事件的限制不同,去抖动会很好地工作。我只是不希望玩家发送垃圾邮件的速度比按住键的速度更快。 (我在反跳代码方面没有取得多大成功)
这是我的代码的精简基本示例:http://jsfiddle.net/empXx/66/
var canvas = document.getElementById('c'),
ctx = canvas.getContext("2d"),
tileSize = 10;
var holdingUp = false;
var holdingDown = false;
var holdingLeft = false;
var holdingRight = false;
var cx = 150;
var cy = 150;
$(document).keydown(function(e) {
if(e.which==37) { holdingLeft = true; }
if(e.which==38) { holdingUp = true; }
if(e.which==39) { holdingRight = true; }
if(e.which==40) { holdingDown = true; }
});
$(document).keyup(function(e) {
if(e.which==37) { holdingLeft = false; }
if(e.which==38) { holdingUp = false; }
if(e.which==39) { holdingRight = false; }
if(e.which==40) { holdingDown = false; }
});
ctx.fillRect(150, 150, tileSize, tileSize);
setInterval(function() {
if(holdingUp) {
cls();
ctx.fillRect(cx, cy - tileSize, tileSize, tileSize);
cy -= tileSize;
} else if(holdingDown) {
cls();
ctx.fillRect(cx, cy + tileSize, tileSize, tileSize);
cy += tileSize;
}
if(holdingLeft) {
cls();
ctx.fillRect(cx - tileSize, cy, tileSize, tileSize);
cx -= tileSize;
} else if(holdingRight) {
cls();
ctx.fillRect(cx + tileSize, cy, tileSize, tileSize);
cx += tileSize;
}
}, 120);
function cls() { ctx.clearRect(0, 0, canvas.width, canvas.height); }
我怎样才能让这个游戏交互更流畅,让用户更愉快,同时减少垃圾邮件?
【问题讨论】:
-
可能有更好的方法,但是jsfiddle 解决了您列出的两个问题,方法是记录按键被按下的次数,并使用这些计数来确保每次按键都会导致移动。
-
有趣。我还应该指出,向左运动优于向右运动。向上优于向下。如果我按住右,左,无论放置顺序如何,它都会向左。
标签: jquery canvas keypress keydown keyup