Я действительно борюсь с изменением рисунка на холсте, поэтому я подумал, что увижу, сможет ли кто-нибудь помочь мне здесь или предложить совет.
Я нарисовал статический флаг в холсте, и я также нарисовал развевающийся флаг. Я пытаюсь заставить этот флаг взмахнуть на мыши.
Сначала я думал, что мне нужно будет создать два отдельных файла: один для статического и один для размахивающего аспекта. Затем сохраните каждый из них как изображение jpg/gif, используя window.location = canvas.toDataURL("image/") ;.
Но я только что обнаружил, что вы можете сделать это все в одном файле через jquery/hover. Что кажется намного проще и более эффективным способом сделать это.
Вот код для развевающегося флага:
window.onload = function(){
var flag = document.getElementById('banglaFlag');
banglaStatic( flag, 320 );
var timer = banglaWave( flag, 30, 15, 200, 200 );
};
function banglaStatic( canvas, width ){
//Drawing the Bangladesh flag.
//Declaring variables that regard width and height of the canvas.
//Variables C to L are needed for the waving function.
var a = width / 1.9;
var b = 200;
var c = 7*a/13;
var l = a / 13;
canvas.width = b;
canvas.height = a;
var ctx = canvas.getContext('2d');
var radius = 45;
};
function banglaWave( canvas, wavelength, amplitude, period, shading ){
var fps = 30;
var ctx = canvas.getContext('2d');
var w = canvas.width, h = canvas.height;
var od = ctx.getImageData(0,0,w,h).data;
// var ct = 0, st=new Date;
return setInterval(function(){
var id = ctx.getImageData(0,0,w,h);
var d = id.data;
var now = (new Date)/period;
for (var y=0;y<h;++y){
var lastO=0,shade=0;
for (var x=0;x<w;++x){
var px = (y*w + x)*4;
var o = Math.sin(x/wavelength-now)*amplitude*x/w;
var opx = ((y+o<<0)*w + x)*4;
shade = (o-lastO)*shading;
d[px ] = od[opx ]+shade;
d[px+1] = od[opx+1]+shade;
d[px+2] = od[opx+2]+shade;
d[px+3] = od[opx+3];
lastO = o;
}
}
ctx.putImageData(id,0,0);
// if ((++ct)%100 == 0) console.log( 1000 * ct / (new Date - st));
},1000/fps);
}
Заранее благодарим за любой совет/помощь.
Я не знаю, где ваша проблема. Я не видел код обработки событий, поэтому я предполагаю, что ваш вопрос:
Определите функцию "обработать событие мыши". Например, если вы хотите переместить флаг, когда пользователь наводит курсор мыши на него, определите что-то вроде:
function mouseMove(event) {
var mouseX,
mouseY;
event.preventDefault(); // stops browser to do what it normally does
// determine where mouse is
mouseX = event.pageX;
mouseY = event.pageY;
// do something useful, e.g. change the flag to waving when mouse is over flag
}
Затем зарегистрируйте эту функцию для вызова при перемещении мыши:
canvas.addEventListener("mousemove", mouseMove, false);
canvas
- это холст, на котором вы "mousemove"
флаг, "mousemove"
- это имя события (существует еще много таких, как "mousedown", "mouseup", "mouseout" (холст), "mousewheel" и т.д.), mouseMove
- это имя вашей функции (обработчик события, как он назывался).
События немного отличаются от браузера и браузера (и даже версии браузера), поэтому вам может понадобиться реализовать различный обработчик событий, если вам это нужно в браузерах.
Надеясь, что это помогло...
холст подобен листу. нет никакого объекта, на котором вы можете навести курсор.
для того, чтобы делать то, что вы хотели сделать, это просто связать область с флагом,
выполните ответ "virtualnobi" и подсчитайте, попадает ли координата мыши в этот регион,
если истина делает то, что вы хотите.
как
if (mouseX<100 && mouseX>0 && mouseY>0 && mouseY<100){
//animate the flag
}
использовать mouseX=event.clientX;
mouseY=event.clientY;
ограниченная площадь x = (0,100), y = (0,100) здесь.
requestAnimationFrame
. Эта функция будет выполнять собственную функцию, скажем,drawFlag
каждый раз, когда браузер повторно отображает вашу страницу. ВdrawFlag
сначала очистите холст, затем нарисуйте соответствующий флаг. (2) Выберите соответствующий флаг в зависимости от того, наведена ли мышь на холст. Существуют события мышиmouseenter
иmouseleave
для которых вы должны определить функции-обработчики (как указано выше). Обработчикmouseenter
устанавливает логическое значение, функцию ...