Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.07.2017, 12:19
Интересующийся
Отправить личное сообщение для Negotiant Посмотреть профиль Найти все сообщения от Negotiant
 
Регистрация: 27.03.2017
Сообщений: 28

Движение объектов по массиву координат
Интересуют примеры реализации движения нескольких объектов по массиву координат (на canvas), подскажите пожалуйста..
Ответить с цитированием
  #2 (permalink)  
Старый 04.07.2017, 15:30
Аспирант
Отправить личное сообщение для Luca Посмотреть профиль Найти все сообщения от Luca
 
Регистрация: 20.06.2017
Сообщений: 69

работа с Canvas
Ответить с цитированием
  #3 (permalink)  
Старый 05.07.2017, 12:34
Интересующийся
Отправить личное сообщение для Negotiant Посмотреть профиль Найти все сообщения от Negotiant
 
Регистрация: 27.03.2017
Сообщений: 28

Rise,
Интересует пример движения объектов на canvas не рандомного, а по определённому "узору", или массиву векторов, возможно Вы сможете подсказать? Спасибо.
Ответить с цитированием
  #4 (permalink)  
Старый 05.07.2017, 13:27
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Здесь координаты вычисляются на каждом шагу, но точно так же могут использоваться ранее сформированные массивы координат

<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    
  </head>

  <body>
   <canvas id="canvas" width="400" height="400"></canvas>
   
   <script>
     var Ball = function () {
			this.x = Math.floor(Math.random() * 400);
			this.y = Math.floor(Math.random() * 400);
			this.xSpeed = -2;
			this.ySpeed = 3;
		};


		var circle = function (x, y, radius, fillCircle) {
			ctx.beginPath();
			ctx.arc(x, y, radius, 0, Math.PI * 2, false);
			if (fillCircle) {
				ctx.fill();
			} 
			else {
				ctx.stroke();
			}
		};

		Ball.prototype.draw = function () {
			circle(this.x, this.y, 3, true);
		};

		Ball.prototype.move = function () {
			this.x += this.xSpeed;
			this.y += this.ySpeed;
		};

		Ball.prototype.checkCollision = function () {
			if (this.x < 0 || this.x > width) {
				this.xSpeed = -this.xSpeed;
			}
			if (this.y < 0 || this.y > height) {
				this.ySpeed = -this.ySpeed;
			}
		};

		var canvas = document.getElementById("canvas");
		var ctx = canvas.getContext("2d");

		
                var ball = [];         
                for(var i = 0; i < 10; i++){
                         ball[i] = new Ball();	
                }
                var width = canvas.width;
                var height = canvas.height;	
		
		setInterval(function () {
		    ctx.clearRect(0, 0, width, height);
		    for(var i = 0; i < 10; i++){      
                        ball[i].draw();
                        ball[i].move();
                        ball[i].checkCollision();
                    } ;
  		    ctx.strokeRect(0, 0, width, height);
		}, 30);
   </script>
  </body>

</html>

Последний раз редактировалось Dilettante_Pro, 05.07.2017 в 13:46.
Ответить с цитированием
  #5 (permalink)  
Старый 05.07.2017, 14:21
Интересующийся
Отправить личное сообщение для Negotiant Посмотреть профиль Найти все сообщения от Negotiant
 
Регистрация: 27.03.2017
Сообщений: 28

Dilettante_Pro,
Нет ли у Вас примера с движением по "ранее сформированным массивам координат"? Спасибо.
Ответить с цитированием
  #6 (permalink)  
Старый 05.07.2017, 15:21
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Negotiant,
как-то так... Предварительно сформированный массив, конечно, не очень...
<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    
  </head>

  <body>
   <canvas id="canvas" width="400" height="400"></canvas>
   
   <script>
     var coord = [];
     for(var i = 0; i < 10; i++){
         coord[i] = [];
         for(var j = 0; j < 10; j++){
            coord[i][j]= {};
            coord[i][j].x = (i + 1) *(j + 1) * 10;
            coord[i][j].y = i * 15 + j * 10;
         }
     }
     alert(JSON.stringify(coord));
     var Ball = function (i) {
			this.x = coord[i][0].x;
			this.y = coord[i][0].y;;

		};


		var circle = function (x, y, radius, fillCircle) {
			ctx.beginPath();
			ctx.arc(x, y, radius, 0, Math.PI * 2, false);
			if (fillCircle) {
				ctx.fill();
			} 
			else {
				ctx.stroke();
			}
		};

		Ball.prototype.draw = function () {
			circle(this.x, this.y, 3, true);
		};

		Ball.prototype.move = function (i,j) {
			this.x = coord[i][j].x;
			this.y = coord[i][j].y;
		};

		Ball.prototype.checkCollision = function (i,j) {
		    if(i==9 && j==9) clearInterval(loop);	
		};

		var canvas = document.getElementById("canvas");
		var ctx = canvas.getContext("2d");

		
                var ball = [];         
                for(var i = 0; i < 10; i++){
                         ball[i] = new Ball(i);	
                }
                var width = canvas.width;
                var height = canvas.height;	
		var j = 0;
		var loop = setInterval(function () {
		    ctx.clearRect(0, 0, width, height);
		    for(var i = 0; i < 10; i++){      
                        ball[i].draw();
                        ball[i].move(i,j);
                        ball[i].checkCollision(i,j);
                    } ;
  		    ctx.strokeRect(0, 0, width, height);
                    j++;
		}, 100);
   </script>
  </body>

</html>

Последний раз редактировалось Dilettante_Pro, 05.07.2017 в 15:26.
Ответить с цитированием
  #7 (permalink)  
Старый 05.07.2017, 16:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

canvas Движение объектов по массиву координат

мысли вслух
<!DOCTYPE html>
<html>

  <head>
 <script>
     if (!Object.assign) {
  Object.defineProperty(Object, 'assign', {
    enumerable: false,
    configurable: true,
    writable: true,
    value: function(target, firstSource) {
      'use strict';
      if (target === undefined || target === null) {
        throw new TypeError('Cannot convert first argument to object');
      }

      var to = Object(target);
      for (var i = 1; i < arguments.length; i++) {
        var nextSource = arguments[i];
        if (nextSource === undefined || nextSource === null) {
          continue;
        }

        var keysArray = Object.keys(Object(nextSource));
        for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
          var nextKey = keysArray[nextIndex];
          var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
          if (desc !== undefined && desc.enumerable) {
            to[nextKey] = nextSource[nextKey];
          }
        }
      }
      return to;
    }
  });
}
 </script>
  </head>

  <body>
   <canvas id="canvas" width="400" height="400"></canvas>

   <script>
 var Ball = function(data) {
    this.opt = {
        index: -1,
        queue: [],
        loop: false,
        startTime: 0,
        timer: null
    };
    this.init(data);
    this.x, this.y
};
Ball.prototype.init = function(data) {
    var opt = Object.assign(this.opt, data || {});
    opt.startTime = performance.now();
    opt.index++;
    opt.loop && (opt.index %= opt.queue.length);
};
Ball.prototype.move = function() {

    var d = this.opt.startTime;
    var data = this.opt.queue[this.opt.index];
    if(!data) return;
    var b = (performance.now() - d) / data.duration;
        1 <= b && (b = 1);
        this.x = data.from.x + (data.to.x - data.from.x) * b | 0;
        this.y = data.from.y + (data.to.y - data.from.y) * b | 0;
        1 == b && this.init();


};
var circle = function(x, y, radius, fillCircle) {
    ctx.beginPath();
    ctx.arc(x, y, radius, 0, Math.PI * 2, false);
    ctx.fillStyle = "green";
    if (fillCircle) ctx.fill();
    else ctx.stroke()
};
Ball.prototype.draw = function() {
    circle(this.x, this.y, 10, true)
};
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var obj = {
    queue: [{
        from: {
            x: 100,
            y: 100
        },
        to: {
            x: 150,
            y: 200
        },
        duration: 1000
    }, {
        from: {
            x: 150,
            y: 200
        },
        to: {
            x: 200,
            y: 100
        },
        duration: 3E3
    }, {
        from: {
            x: 200,
            y: 100
        },
        to: {
            x: 250,
            y: 200
        },
        duration: 1000
    }, {
        from: {
            x: 250,
            y: 200
        },
        to: {
            x: 300,
            y: 100
        },
        duration: 3000
    }],
    loop: true
};
var ball = [];
var i = 0;
(function x() {
    ball[i] = new Ball(obj);
    ++i < 50 && window.setTimeout(x, 500)
})();
var width = canvas.width;
var height = canvas.height;
requestAnimationFrame(function test() {
    ctx.clearRect(0, 0, width, height);
    for (var i = 0; i < ball.length; i++) {
    ball[i].move();
    ball[i].draw();
    }
    ctx.strokeRect(0, 0, width, height);
    requestAnimationFrame(test)
});
   </script>
  </body>

</html>

Последний раз редактировалось рони, 05.07.2017 в 17:00. Причина: небольшая оптимизация и для ie Object.assign
Ответить с цитированием
  #8 (permalink)  
Старый 05.07.2017, 16:41
Интересующийся
Отправить личное сообщение для Negotiant Посмотреть профиль Найти все сообщения от Negotiant
 
Регистрация: 27.03.2017
Сообщений: 28

Спасибо.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение объектов Paradantoz Учебные материалы 0 16.06.2017 20:18
Поиск по массиву объектов Georrg Общие вопросы Javascript 24 14.08.2014 14:59
Согласованное движение нескольких объектов. kalach Общие вопросы Javascript 15 18.11.2010 19:06
Движение объектов. SergeiAzarov Общие вопросы Javascript 14 18.04.2010 17:12
движение объектов за курсором по траетории steve Общие вопросы Javascript 1 17.06.2009 16:07