Я делаю приложение для рисования в реальном времени в холсте html5. Когда один пользователь рисует на холсте, все идет хорошо, но когда два пользователя рисуют в одно и то же время, все становится испорченным, например, если один изменяет цвет, цвет для всех изменений клиента, а линии начинают рисовать из одной точки в другую , Как это можно зафиксировать? Спасибо, вот мой код.два человека, рисующие на одном холсте
var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");
canvas.width="600";
canvas.height="500";
var radius = 10;
var mouse = {x:0,y:0};
var drag = false;
var imageObj = new Image();
imageObj.onload = function() {
context.drawImage(imageObj, 20, 20);
};
imageObj.src = 'rhino4.png';
$scope.colorChange = function(color){
Socket.emit("colorChange",color);
};
Socket.on("colorChange",function (color) {
context.strokeStyle = color;
context.fillStyle = color;
})
$scope.radiusChange = function(size) {
Socket.emit("radiusChange",size);
}
Socket.on("radiusChange",function (size) {
radius = size;
context.lineWidth = radius*2;
})
context.lineWidth = radius*2;
var putPoint = function (mouse) {
if(drag){
context.lineTo(mouse.x,mouse.y)
context.stroke();
context.beginPath();
context.arc(mouse.x,mouse.y,radius,0,Math.PI*2);
context.fill();
context.beginPath();
context.moveTo(mouse.x,mouse.y);
context.globalCompositeOperation='source-atop';
context.drawImage(imageObj, 20, 20);
context.globalCompositeOperation='source-over';
}
}
Socket.on("putPoint",function (mouse) {
putPoint(mouse);
});
var engage = function(mouse){
console.log("in engage",mouse);
drag = true;
putPoint(mouse);
}
var disengage = function(){
drag = false;
context.beginPath();
}
var socketPutPoint = function(e){
mouse.x = e.offsetX;
mouse.y = e.offsetY;
Socket.emit("putPoint",mouse);
}
Socket.on("engage",function (mouse) {
console.log("engaging");
engage(mouse);
});
var socketEngage = function (e) {
mouse.x = e.offsetX;
mouse.y = e.offsetY;
console.log(mouse);
Socket.emit("engage",mouse);
}
var socketDisengage = function (e) {
mouse.x = e.offsetX;
mouse.y = e.offsetY;
console.log(mouse);
Socket.emit("disengage",mouse);
}
Socket.on("disengage",function (mouse) {
disengage();
})
canvas.addEventListener('mouseup',socketDisengage);
canvas.addEventListener('mouseleave',socketDisengage);
canvas.addEventListener('mousedown',socketEngage);
canvas.addEventListener('mousemove',socketPutPoint);
Я думал об изменении цвета обратно на оригинал в методе colorChange после putpoint, но это не похоже на работу
Вам нужно будет отслеживать «последнюю точку» каждого клиента и до выдачи 'context.lineTo (mouse.x, mouse.y)' делать 'moveTo' в« последнюю точку »клиента (который также будет применяться к цвету, чтобы вы могли установить правильный цвет клиента). – Prusse
понял о цвете, но я немного не понимаю о точке, мне нужно будет перейти к старым точкам после каждой ничьей или после того, как другой клиент уволил событие mouseup –
Попробуйте сделать ваш обработчик mousedown ('socketEngage'), чтобы сделать (плюс исходный код) 'mouse.last_x = e.offsetX; mouse.last_y = e.offsetY; '(начало функции), в вашем обработчике mousemove (' socketPutPoint') 'mouse.last_x = mouse.x; mouse.last_y = mouse.y; '(начало функции) и' putPoint' перед контекстом context.lineTo (mouse.x, mouse.y) 'add' if (mouse.last_x && mouse.last_y). moveTo (mouse.last_x, mouse.last_y); 'чтобы понять, о чем я говорю =) Надеюсь, что вы сможете выполнить остальные настройки. – Prusse