Изменение изображения холста при наведении курсора

0

Я действительно борюсь с изменением рисунка на холсте, поэтому я подумал, что увижу, сможет ли кто-нибудь помочь мне здесь или предложить совет.

Я нарисовал статический флаг в холсте, и я также нарисовал развевающийся флаг. Я пытаюсь заставить этот флаг взмахнуть на мыши.

Сначала я думал, что мне нужно будет создать два отдельных файла: один для статического и один для размахивающего аспекта. Затем сохраните каждый из них как изображение 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);
}

Заранее благодарим за любой совет/помощь.

Теги:
canvas
html5-canvas

2 ответа

0
Лучший ответ

Я не знаю, где ваша проблема. Я не видел код обработки событий, поэтому я предполагаю, что ваш вопрос:

Определите функцию "обработать событие мыши". Например, если вы хотите переместить флаг, когда пользователь наводит курсор мыши на него, определите что-то вроде:

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 - это имя вашей функции (обработчик события, как он назывался).

События немного отличаются от браузера и браузера (и даже версии браузера), поэтому вам может понадобиться реализовать различный обработчик событий, если вам это нужно в браузерах.

Надеясь, что это помогло...

  • 0
    Будет ли функция banglaWave работать сразу после mouseX = event.page.X; moustY = event.pageY? Извините, это первый раз, когда я сделал это .. Не могли бы вы показать мне в JSfiddle?
  • 0
    Звучит как фундамент ... :-) Я думаю, что лучший подход заключается в следующем: (1) Вам нужен цикл, который воссоздает ваш холст, используя requestAnimationFrame . Эта функция будет выполнять собственную функцию, скажем, drawFlag каждый раз, когда браузер повторно отображает вашу страницу. В drawFlag сначала очистите холст, затем нарисуйте соответствующий флаг. (2) Выберите соответствующий флаг в зависимости от того, наведена ли мышь на холст. Существуют события мыши mouseenter и mouseleave для которых вы должны определить функции-обработчики (как указано выше). Обработчик mouseenter устанавливает логическое значение, функцию ...
Показать ещё 2 комментария
0

холст подобен листу. нет никакого объекта, на котором вы можете навести курсор.
для того, чтобы делать то, что вы хотели сделать, это просто связать область с флагом,
выполните ответ "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) здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню