Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.08.2015, 17:33
Аспирант
Отправить личное сообщение для levshkatov Посмотреть профиль Найти все сообщения от levshkatov
 
Регистрация: 03.09.2014
Сообщений: 61

Анимация объекта на canvas
Пытаюсь двигать кружочком, привязанным к координатам мыши.
Использую requestAnimationFrame.
Кружок двигается за мышкой, но предыдущие круги остаются.
Вопрос в том, как их убрать? Может метод рисования используется другой?
Я использовал
arc(x, y, 15, 0, 2*Math.PI, true);
Ответить с цитированием
  #2 (permalink)  
Старый 24.08.2015, 17:38
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

levshkatov,
clearRect или canvas.width = canvas.width

Канвас это холст. Все что на нем отрисовали - остается. Стереть можно либо специальным методом, либо тронув размер холста (на старых андройдах метод глючит и рекомендуется дергать размер, но это медленно.)
Ответить с цитированием
  #3 (permalink)  
Старый 24.08.2015, 17:41
Аспирант
Отправить личное сообщение для levshkatov Посмотреть профиль Найти все сообщения от levshkatov
 
Регистрация: 03.09.2014
Сообщений: 61

Способ с шириной холста не подходит, нет необходимости очищать весь холст.
Насчет clearRect интересно, но как его лучше использовать? Если сначала очищать а потом поверх рисовать, анимация будет рывками.
Спрашиваю, чтобы знать, как это правильно делается.
Ответить с цитированием
  #4 (permalink)  
Старый 24.08.2015, 17:52
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

levshkatov,
Правильно стирать, а потом рисовать. Если будете быстро стирать и рисовать - рывков не увидите.
Ответить с цитированием
  #5 (permalink)  
Старый 24.08.2015, 18:08
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

<canvas width="1000" height="500" style="position: absolute;"></canvas>

<script>

    var canvas = document.querySelector('canvas');
    var ctx = canvas.getContext('2d');
    var x = 20;
    ctx.strokeStyle="red";
    ctx.beginPath();
    ctx.arc(x, 250, 15, 0, 2*Math.PI, true);
    ctx.closePath();
    ctx.stroke();

    var animate = function () {

        ctx.clearRect(0,0, 1000, 500);
        x+= 5;
        ctx.beginPath();
        ctx.arc(x, 250, 15, 0, 2*Math.PI, true);
        ctx.closePath();
        ctx.stroke();
        if (x < 1000) {
            requestAnimationFrame(animate);
        }

    };

    setTimeout(animate , 2000);


</script>
Ответить с цитированием
  #6 (permalink)  
Старый 24.08.2015, 18:36
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

levshkatov,
Если перерисовывать получается слишком накладно - иногда делают 2 канваса и на одном рисуют статику, а на другом - все подвижное.
Ответить с цитированием
  #7 (permalink)  
Старый 24.08.2015, 18:49
Аспирант
Отправить личное сообщение для levshkatov Посмотреть профиль Найти все сообщения от levshkatov
 
Регистрация: 03.09.2014
Сообщений: 61

Дело в том, что перерисовываемых элементов на канвасе довольно много. В каждый момент времени у каждого из них свои координаты (только один объект зависит от координат мыши, остальные - нет). Как думаете, стоит полностью очищать канвас в таком случае или прямоугольниками подчищать за каждым объектом?
Ответить с цитированием
  #8 (permalink)  
Старый 24.08.2015, 18:56
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

levshkatov,
Оптимизировать надо тогда, когда заметно что производительности не хватает. Попробуйте сначала чистить все, и если будет тормозить, то тогда можно вынести объект зависящий от мышки в отдельный канвас например. Я обычно чищу все поле. С канвасом есть много интересных решений. Например если сделать его маленьким а потом растянуть, то работать он будет сильно быстрее (но потери качества).

Я делал мобильную игру, где надо было тапать по падающим сверху продуктам. Все кроме фона рисовал на канвасе. бывало до 30 объектов на экране одновременно. Канвас размером в экран телефона чистился целиком на мобилах без тормозов.

Последний раз редактировалось tsigel, 24.08.2015 в 18:59.
Ответить с цитированием
  #9 (permalink)  
Старый 24.08.2015, 19:58
Аспирант
Отправить личное сообщение для levshkatov Посмотреть профиль Найти все сообщения от levshkatov
 
Регистрация: 03.09.2014
Сообщений: 61

tsigel,
Спасибо большое за ответ. Делаю тоже игрушку, в перспективе возможно и на телефоны. Пока что попробую с компьютерной версией разобраться.
Там и получается, что раз объект игрока движется, вокруг все меняется.
А с фоном как лучше поступить? Я себе его представляю как довольно обширное рисованное поле, наверное экранов в 6 по длине и ширине, то есть, чтобы создавалась иллюзия движения (игрок двигается не только в пределах экрана).

Насчет того, что лучше использовать для очистки канваса нашел такой вот сервис: http://jsperf.com/ctx-clearrect-vs-c...canvas-width/2
Попробую постоянно добавлять прямоугольники по размеру канваса. Надеюсь, они не сильно впоследствии нагружают память?

Последний раз редактировалось levshkatov, 24.08.2015 в 20:07.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта. Zemsky Общие вопросы Javascript 30 19.12.2013 19:44
Анимация на canvas. creator-sites Общие вопросы Javascript 2 01.10.2012 16:15
Задача: поворот движущего сложного объекта canvas DenBraun Общие вопросы Javascript 7 18.06.2012 17:05
Анимация в цикле с разворотом объекта ZloiZmei jQuery 2 30.01.2012 12:23
анимация движения объекта по прямой YISHIMITSY Элементы интерфейса 6 04.03.2010 15:47