07.05.2017, 13:33
|
Кандидат Javascript-наук
|
|
Регистрация: 26.04.2016
Сообщений: 106
|
|
Чтобы элемент передвигался рандомно
По полю передвигается квадратик (вверх-вниз, влево-вправо)
http://plnkr.co/edit/wx0ygfaGTWHj9dSz07G0?p=preview
1) Как сделать так чтобы он передвигался рандомно?
Т.е. либо влево на 20рх, либо вправо на 20рх, либо вверх, либо вниз.
Естественно нужно чтобы он это это делал в пределах контейнера,
и передвигался постоянно
(знаю что может помочь Math.random(), но как именно его прописать?)
2) На поле есть неподвижные квадратики - это камни. На них элемент не может заходить - он должен их обходить
3) Как создать второй такой же элемент, чтобы он рождался в рандомном месте(кроме камня и другого элемента), также ходил, но при встрече двух элементов, они не могли вставать друг на друга, а обходили друг друга
Последний раз редактировалось yaparoff, 07.05.2017 в 14:25.
|
|
07.05.2017, 14:46
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
yaparoff,
массив надо делать, чтобы знать где можно ходить, а где какой-то обьект.много кода ... коллизии обьектов вычислять.
|
|
07.05.2017, 15:39
|
Кандидат Javascript-наук
|
|
Регистрация: 26.04.2016
Сообщений: 106
|
|
Сообщение от рони
|
yaparoff,
массив надо делать
|
В сети нашел что-то и свое подставил.
Т.е. есть массив массивов list где есть 8 вариантов, куда сделать шаг,
потом это перебирается Math.random() и выбирается одно направление.
и как результат этого вставить в мой код?
var randomDirection = {
list: [
[0, -20],
[20, -20],
[20, 0],
[20, 20],
[0, 20],
[-20, 20],
[-20, 0],
[-20, -20]
],
already: [],
random: function () {
return this.directions[Math.floor(Math.random() * this.list.length)];
},
get: function () {
var direction = this.random();
if (this.already.length >= this.list.length) {
this.already = [];
return direction;
}
if (this.already.indexOf(direction) !== -1) {
return this.get();
} else {
this.already.push(direction);
return direction;
}
}
};
alert(randomDirection.get());
Последний раз редактировалось yaparoff, 08.05.2017 в 06:41.
|
|
07.05.2017, 16:51
|
Кандидат Javascript-наук
|
|
Регистрация: 26.04.2016
Сообщений: 106
|
|
Сообщение от рони
|
чтобы знать где можно ходить, а где какой-то обьект
|
Вот. Так вычисляем координаты камней:
var stones = document.querySelectorAll('.stone');
var stonesCoords = [];
for (var i = 0; i < stones.length; i++) {
stonesCoords.push(getCoords(stones[i]));
}
function getCoords(element) {
var box = element.getBoundingClientRect();
return {
top: box.top + pageYOffset,
left: box.left + pageXOffset,
right: box.right + pageXOffset,
bottom: box.bottom + pageYOffset
};
}
В код добавил http://plnkr.co/edit/wx0ygfaGTWHj9dSz07G0?p=preview
Хотелось бы добавить, что элемент должен видеть только в пределах одного хода - дальше он не видит.
Последний раз редактировалось yaparoff, 07.05.2017 в 16:53.
|
|
07.05.2017, 17:04
|
Кандидат Javascript-наук
|
|
Регистрация: 26.04.2016
Сообщений: 106
|
|
Как теперь это все воедино соединить?
|
|
07.05.2017, 17:33
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
yaparoff,
может ну его нафиг?
|
|
07.05.2017, 17:40
|
Кандидат Javascript-наук
|
|
Регистрация: 26.04.2016
Сообщений: 106
|
|
Сообщение от рони
|
может ну его нафиг?
|
Не получиться. Нужно сделать обязательно. Эта задача - не моя прихоть
|
|
07.05.2017, 17:57
|
Кандидат Javascript-наук
|
|
Регистрация: 26.04.2016
Сообщений: 106
|
|
Rise,
Да. Из книги выразительный JavaScript
Автор рассказывает как делать, НО нужна своя реализация, нельзя копировать код.
Автор так объясняет, что мне не остается просто брать и копировать оттуда код. Но так нельзя. Мне код автора во многих местах не понятен.
Поэтому реализовываю по своему, чтобы каждая строчка кода мне понятна была.
В итоге примерно вот что должно получиться http://eloquentjavascript.net/code/#7.2
но объектов может быть меньше чем там
Последний раз редактировалось yaparoff, 07.05.2017 в 18:01.
|
|
07.05.2017, 18:44
|
Кандидат Javascript-наук
|
|
Регистрация: 21.01.2017
Сообщений: 139
|
|
yaparoff, может чем поможет
Броуновское движение на js
|
|
07.05.2017, 20:37
|
Кандидат Javascript-наук
|
|
Регистрация: 26.04.2016
Сообщений: 106
|
|
Сообщение от Rise
|
но там достаточно доходчиво и интересно написано
|
Как сделать собственную реализацию этого куска кода:
(о нем здесь написано)
Копировать нельзя
function Vector(x, y) {
this.x = x;
this.y = y;
}
Vector.prototype.plus = function(other) {
return new Vector(this.x + other.x, this.y + other.y);
};
var grid = ["top left", "top middle", "top right",
"bottom left", "bottom middle", "bottom right"];
function Grid(width, height) {
this.space = new Array(width * height);
this.width = width;
this.height = height;
}
Grid.prototype.isInside = function(vector) {
return vector.x >= 0 && vector.x < this.width &&
vector.y >= 0 && vector.y < this.height;
};
Grid.prototype.get = function(vector) {
return this.space[vector.x + this.width * vector.y];
};
Grid.prototype.set = function(vector, value) {
this.space[vector.x + this.width * vector.y] = value;
};
var grid = new Grid(5, 5);
grid.set(new Vector(1, 1), "X");
console.log(grid.get(new Vector(1, 1)));
Последний раз редактировалось yaparoff, 07.05.2017 в 20:51.
|
|
|
|