24.08.2015, 17:33
|
Аспирант
|
|
Регистрация: 03.09.2014
Сообщений: 61
|
|
Анимация объекта на canvas
Пытаюсь двигать кружочком, привязанным к координатам мыши.
Использую requestAnimationFrame.
Кружок двигается за мышкой, но предыдущие круги остаются.
Вопрос в том, как их убрать? Может метод рисования используется другой?
Я использовал
arc(x, y, 15, 0, 2*Math.PI, true);
|
|
24.08.2015, 17:38
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
levshkatov,
clearRect или canvas.width = canvas.width
Канвас это холст. Все что на нем отрисовали - остается. Стереть можно либо специальным методом, либо тронув размер холста (на старых андройдах метод глючит и рекомендуется дергать размер, но это медленно.)
|
|
24.08.2015, 17:41
|
Аспирант
|
|
Регистрация: 03.09.2014
Сообщений: 61
|
|
Способ с шириной холста не подходит, нет необходимости очищать весь холст.
Насчет clearRect интересно, но как его лучше использовать? Если сначала очищать а потом поверх рисовать, анимация будет рывками.
Спрашиваю, чтобы знать, как это правильно делается.
|
|
24.08.2015, 17:52
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
levshkatov,
Правильно стирать, а потом рисовать. Если будете быстро стирать и рисовать - рывков не увидите.
|
|
24.08.2015, 18:08
|
Профессор
|
|
Регистрация: 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>
|
|
24.08.2015, 18:36
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
levshkatov,
Если перерисовывать получается слишком накладно - иногда делают 2 канваса и на одном рисуют статику, а на другом - все подвижное.
|
|
24.08.2015, 18:49
|
Аспирант
|
|
Регистрация: 03.09.2014
Сообщений: 61
|
|
Дело в том, что перерисовываемых элементов на канвасе довольно много. В каждый момент времени у каждого из них свои координаты (только один объект зависит от координат мыши, остальные - нет). Как думаете, стоит полностью очищать канвас в таком случае или прямоугольниками подчищать за каждым объектом?
|
|
24.08.2015, 18:56
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
levshkatov,
Оптимизировать надо тогда, когда заметно что производительности не хватает. Попробуйте сначала чистить все, и если будет тормозить, то тогда можно вынести объект зависящий от мышки в отдельный канвас например. Я обычно чищу все поле. С канвасом есть много интересных решений. Например если сделать его маленьким а потом растянуть, то работать он будет сильно быстрее (но потери качества).
Я делал мобильную игру, где надо было тапать по падающим сверху продуктам. Все кроме фона рисовал на канвасе. бывало до 30 объектов на экране одновременно. Канвас размером в экран телефона чистился целиком на мобилах без тормозов.
Последний раз редактировалось tsigel, 24.08.2015 в 18:59.
|
|
24.08.2015, 19:58
|
Аспирант
|
|
Регистрация: 03.09.2014
Сообщений: 61
|
|
tsigel,
Спасибо большое за ответ. Делаю тоже игрушку, в перспективе возможно и на телефоны. Пока что попробую с компьютерной версией разобраться.
Там и получается, что раз объект игрока движется, вокруг все меняется.
А с фоном как лучше поступить? Я себе его представляю как довольно обширное рисованное поле, наверное экранов в 6 по длине и ширине, то есть, чтобы создавалась иллюзия движения (игрок двигается не только в пределах экрана).
Насчет того, что лучше использовать для очистки канваса нашел такой вот сервис: http://jsperf.com/ctx-clearrect-vs-c...canvas-width/2
Попробую постоянно добавлять прямоугольники по размеру канваса. Надеюсь, они не сильно впоследствии нагружают память?
Последний раз редактировалось levshkatov, 24.08.2015 в 20:07.
|
|
|
|