Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   canvas animation (https://javascript.ru/forum/misc/32843-canvas-animation.html)

Simulator 01.11.2012 00:13

canvas animation
 
Приветствую!
Пытаюсь рисовать изображения в canvas, используя координаты полученные с сервера.
собственно отрисовка происходит как-то так:
function draw()
{
canvas.drawImage(image,myObject.x,myObject.y);
requestAnimationFrame(draw);
}

а координаты обновляются так:
function onmessage(data) {
    var packet = JSON.parse(data.data);
myObject.x = packet.x;
myObject.y= packet.y
}

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

nerv_ 01.11.2012 00:42

может дело в задержке ответа сервера?

Simulator 01.11.2012 10:41

лаги есть даже на локальной машине. и как тогда модифицировать алгоритм отрисовки, что бы их не было

melky 01.11.2012 11:13

Цитата:

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

нет, всё верно.

так и должно быть - координаты то вы не с течением времени изменяете, а сразу ставите конечные :D

Цитата:

Сообщение от Simulator
Может кто-нибудь подскажет, где у меня ошибка?)

в логике. когда приходят координаты, вы их сразу ставите

function onmessage(data) {
    var packet = JSON.parse(data.data);
myObject.x = packet.x;
myObject.y= packet.y
// и всё зашибись
}


нет, надо изменять эти координаты с течением времени.

в учебнике есть хорошая статья на эту тему
http://learn.javascript.ru/js-animation

ещё при анимации на канвасе нужно сначала очищать область, где был элемент - иначе он там и останется.
после этого изменять координаты, и только после этого отрисовывать текущее состояние.

Simulator 01.11.2012 19:47

Цитата:

Сообщение от melky (Сообщение 213421)
нет, всё верно.

так и должно быть - координаты то вы не с течением времени изменяете, а сразу ставите конечные :D

но я даже пытался присылать координаты каждые 17 секунд, этого должно было быть более чем достаточно, по моему пониманию(
Цитата:

Сообщение от melky (Сообщение 213421)
нет, надо изменять эти координаты с течением времени.

я прочитал статью, но все же еще осталось недопонимание(
то есть фактически метод draw надо переделать как-то так?
var last=0;
function draw() {
    var progress = (new Date - last) 
    canvas.drawImage(image,myObject.x*progress,myObject.y*progress);
last = new Date;
}


Спасибо.

vadim5june 01.11.2012 20:19

по моему так нужно
запоминаем старые координаты xold yold
получаем новые x y
то есть расстояние будет x-xold y-yold
и дальше плавно его проходим за сколько то итераций допустим 10
for(var i=0;i<10;i++)render(i);
function render(i){
ctx.clearRect(w,h);//очищаем canvas
ctx.drawImage(image,xold+(x-xold)/10*i,yold+(y-yold)/10*i)
}

Simulator 01.11.2012 20:25

Цитата:

Сообщение от vadim5june (Сообщение 213566)
по моему так нужно
запоминаем старые координаты xold yold
получаем новые x y
то есть расстояние будет x-xold y-yold
и дальше плавно его проходим за сколько то итераций допустим 10
for(var i=0;i<10;i++)render(i);
function render(i){
ctx.clearRect(w,h);//очищаем canvas
ctx.drawImage(image,xold+(x-xold)/10*i,yold+(y-yold)/10*i)
}

но ведь получается что координаты отрисовки не будут соответствовать реальным?

vadim5june 01.11.2012 20:29

Цитата:

Сообщение от Simulator (Сообщение 213568)
но ведь получается что координаты отрисовки не будут соответствовать реальным?

У тебя просто изменятся растояние сразу одним скачком а мы разбиваем путь на n частей и в конечной точке приходим к реальным координатам но плавно
а здесь гдето еще надо setTimeout вставить
var i=0
function render(){
ctx.clearRect(w,h);//очищаем canvas
ctx.drawImage(image,xold+(x-xold)/10*i,yold+(y-yold)/10*i);
i++;if(i<10)setTimeout(render,100);
}

Simulator 01.11.2012 20:47

А разве такой метод для игры например подходит?
Цитата:

Сообщение от vadim5june (Сообщение 213570)
а здесь гдето еще надо setTimeout вставить

да у меня все в requestAnimationFrame, так что норм

vadim5june 01.11.2012 20:52

Цитата:

Сообщение от Simulator
А разве такой метод для игры например подходит?

ну это просто метод для плавного движения-так сделана анимация в jquery типа fladeIn animate итд

Simulator 01.11.2012 21:02

Цитата:

Сообщение от vadim5june (Сообщение 213575)
ну это просто метод для плавного движения-так сделана анимация в jquery типа fladeIn animate итд

просто для игры,по идее,важно реальное текущее местоположение(

vadim5june 01.11.2012 21:06

Цитата:

Сообщение от Simulator
просто для игры,по идее,важно реальное текущее местоположение(

А что за игра?Почему координаты с сервера приходят и так редко через 17 секунд?

Simulator 01.11.2012 21:14

Цитата:

Сообщение от vadim5june (Сообщение 213578)
А что за игра?Почему координаты с сервера приходят и так редко через 17 секунд?

с сервера - пытаюсь создать что-то мультиплеерное.
простите, не 17 секунд, а 17 миллисекунд)
я разное время пытался устанавливать, а 17 миллисекунд должны обеспечивать обновление 1000\17 = 58 раз в секунду, то есть время, по идее, вполне достаточно для гладкой анимации

vadim5june 01.11.2012 21:18

Цитата:

Сообщение от Simulator
простите, не 17 секунд, а 17 миллисекунд)

все поняли что 17 секунд поэтому и предлагали анимацию-а здесь она не нужна-тогда мой код тоже не нужен
если есть ссылка дайте посмотрю

Simulator 01.11.2012 21:30

мда, описка(
да, есть. Тут лаги видны очень хорошо, но присутсвуют они даже на локальной машине:
http://159.253.23.45:8080/test_1/

vadim5june 01.11.2012 22:02

а смысл есть здесь канвас спользовать-можно все в DOM сделать-а там гораздо быстрее

Simulator 01.11.2012 22:07

Цитата:

Сообщение от vadim5june (Сообщение 213587)
а смысл есть здесь канвас спользовать-можно все в DOM сделать-а там гораздо быстрее

всмысле в DOM?
+ это только пока одни танки, дальше можно будет еще чего-нибудь добавить. Не думаю, что тут без канваса обойтись можно, тем более что например: bombermine.ru ; browserquest.mozilla.com - вполне работают на canvas и нормально, я конечно далек от создания такого, очень далек)
но понять почему у меня лагает, а у них нет, хочется

vadim5june 01.11.2012 22:25

да на bombermine.ru плавно движется все
хотел исходный код посмотреть но не получилось

Simulator 01.11.2012 22:29

да, хотя сложность понятное дело во много раз больше, так что мне кажется - у меня в логике апдейта координат все еще есть ошибка, вот только где? понять не могу
хм, в хроме все норм смотрится
view-source:http://bombermine.ru/play
но у меня там к сожалению очень слабо получается ориентироваться(

vadim5june 01.11.2012 22:45

А с чего Вы взяли что они канвас используют-не видно что то
активно css используют библиотеки bootstrap и less

Simulator 01.11.2012 22:52

http://habrahabr.ru/post/143699/
http://habrahabr.ru/post/145505/
вот с этих топиков

Simulator 02.11.2012 10:35

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 213612)



MDN предлагает такой вариант:
(function() {
  var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
                              window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
  window.requestAnimationFrame = requestAnimationFrame;
})();

так а разница?

nerv_ 02.11.2012 16:34

Цитата:

Сообщение от vadim5june (Сообщение 213566)
по моему так нужно
запоминаем старые координаты xold yold
получаем новые x y
то есть расстояние будет x-xold y-yold
и дальше плавно его проходим за сколько то итераций допустим 10
for(var i=0;i<10;i++)render(i);
function render(i){
ctx.clearRect(w,h);//очищаем canvas
ctx.drawImage(image,xold+(x-xold)/10*i,yold+(y-yold)/10*i)
}

больше так не делай :)
Цитата:

Сообщение от melky
в учебнике есть хорошая статья на эту тему
http://learn.javascript.ru/js-animation


Simulator 02.11.2012 18:59

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 213689)
Так понятней? :)

да, спасибо что разъяснили :thanks:

Цитата:

Сообщение от melky (Сообщение 213421)
в учебнике есть хорошая статья на эту тему
http://learn.javascript.ru/js-animation

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


Часовой пояс GMT +3, время: 09:41.