javascript - 为什么我的角色握得太久会重复?
问题描述
在我的游戏中,我希望我的角色四处走动。而我的性格确实如此。但是,如果我握住钥匙的时间过长,我的角色就会开始重复自己,并在其身后留下痕迹。例如,如果我的角色是一个 6,在按住左箭头键三秒钟后,我最终会在它后面留下一个 3。下面是一张图片:
为什么会这样?我如何解决它?
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<canvas id="ctx" width="1773" height="990" style="border:1px solid #000000;"></canvas>
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>
var ctx = document.getElementById("ctx").getContext("2d");
ctx.font = '30px Arial';
var socket = io();
socket.on('newPositions',function(data){
ctx.clearRect(0,0,500,500);
for(var i = 0 ; i < data.length; i++)
ctx.fillText(data[i].number,data[i].x,data[i].y);
});
document.onkeydown = function(event){
if(event.keyCode === 39) //d
socket.emit('keyPress',{inputId:'right',state:true});
else if(event.keyCode === 40) //s
socket.emit('keyPress',{inputId:'down',state:true});
else if(event.keyCode === 37) //a
socket.emit('keyPress',{inputId:'left',state:true});
else if(event.keyCode === 38) // w
socket.emit('keyPress',{inputId:'up',state:true});
}
document.onkeyup = function(event){
if(event.keyCode === 39) //d
socket.emit('keyPress',{inputId:'right',state:false});
else if(event.keyCode === 40) //s
socket.emit('keyPress',{inputId:'down',state:false});
else if(event.keyCode === 37) //a
socket.emit('keyPress',{inputId:'left',state:false});
else if(event.keyCode === 38) // w
socket.emit('keyPress',{inputId:'up',state:false});
}
</script>
</body>
</html>
var express = require('express');
var app = express();
var serv = require('http').Server(app);
app.get('/',function(req, res) {
res.sendFile(__dirname + '/client/index.html');
});
app.use('/client',express.static(__dirname + '/client'));
serv.listen(2000)
console.log("Server started.");
var SOCKET_LIST = {};
var PLAYER_LIST = {};
var Player = function(id) {
var self = {
x:250,
y:250,
id:id,
number: "" + Math.floor(10 * Math.random()),
pressingRight:false,
pressingLeft:false,
pressingUp:false,
pressingDown:false,
maxSpd:10,
}
self.updatePosition = function(){
if(self.pressingRight)
self.x += self.maxSpd;
if(self.pressingLeft)
self.x -= self.maxSpd;
if(self.pressingUp)
self.y -= self.maxSpd;
if(self.pressingDown)
self.y += self.maxSpd;
}
return self;
}
var io = require('socket.io')(serv,{});
io.sockets.on('connection', function(socket){
socket.id = Math.random();
SOCKET_LIST[socket.id] = socket;
var player = Player(socket.id);
PLAYER_LIST[socket.id] = player
socket.on('disconnect',function(){
delete SOCKET_LIST[socket.id];
delete PLAYER_LIST[socket.id];
});
socket.on('keyPress',function(data){
if(data.inputId === 'left')
player.pressingLeft = data.state;
else if(data.inputId === 'right')
player.pressingRight = data.state;
else if(data.inputId === 'up')
player.pressingUp = data.state;
else if(data.inputId === 'down')
player.pressingDown = data.state;
});
});
setInterval(function(){
var pack = [];
for(var i in PLAYER_LIST){
var player = PLAYER_LIST[i];
player.updatePosition();
pack.push({
x:player.x,
y:player.y,
number:player.number
});
}
for(var i in SOCKET_LIST){
var socket = SOCKET_LIST[i];
socket.emit('newPositions',pack);
}
},1000/25);
解决方案
您也可以使用clear rect,但您需要管理“笔和填充”。
clearRect 只是清除屏幕的一部分
socket.on('newPositions',function(data){
// This only blanks a part of the screen,
//ctx.clearRect(0,0,500,500);
// Clear (whitewash) the screen
ctx.fillStyle='white';
ctx.fillRect(0,0,width,height);
// since we are using fillText below
ctx.fillStyle='black';
for(var i = 0 ; i < data.length; i++){
ctx.fillText(data[i].number,data[i].x,data[i].y);
}
});
<canvas id="ctx" width="200" height="300" >
<script>
var ctx = document.getElementById("ctx").getContext("2d");
ctx.font = '30px Arial';
var width = 200;
var height = 300;
var data = [{number:"1",x:0,y:3,color:"blue"},{number:"4",x:6,y:10,color:"red"}];
setInterval(function(){
ctx.fillStyle="black";
ctx.fillRect(0,0,width,height);
for(var i = 0 ; i < data.length; i++){
ctx.fillStyle=data[i].color;
ctx.fillText(data[i].number,data[i].x,data[i].y);
data[i].x += 1 + i;
data[i].y += 2 + i;
}
}, 23);
</script>
推荐阅读
- css - Angular 7子组件样式不起作用
- docker - Docker 工具箱 (Windows):无效的卷规范
- grails - 在 logback 中注入 grailsApplication
- c - 抢占式调度算法
- regex - mongodb shell find 与 regex 和相同的 python 之间的区别
- r - 仅缩短标签 fe 的首字母
- json - 如何使用 RxJS 进行 groupBy 并在特定数组中获取结果?
- python - 当找到 list2 中的项目时,移动到 list1 中的下一个项目,同时比较两个列表
- python - 替换字典列表中的键的有效方法
- ios - 无法更新领域对象