Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Чтобы элемент передвигался рандомно (https://javascript.ru/forum/misc/68767-chtoby-ehlement-peredvigalsya-randomno.html)

Dilettante_Pro 09.05.2017 13:39

рони,
Похоже, я телепат: я чувствовал, что что-то подобное появится

рони 09.05.2017 13:49

Dilettante_Pro,
:)

рони 10.05.2017 14:10

:write: изменил алгоритм движения кроликов пост №23

yaparoff 10.05.2017 17:11

Прикрутил к коду Dilettante_Pro кое-что еще:
добавил некоторые элементы ООП;
добавил новый юнит - траву.

Теперь думаю над следующим:
1) Нужно реализовать эффект зарастания травы по всему полю. Т.е если на клетке трава, то через некоторое время(допустим через 4 сек) на соседней клетке (выбирается рандомно) тоже должна появиться трава.
(смотреть строку № 100) http://plnkr.co/edit/yFvDmjtbARSTLjoKK0rW?p=preview

2) Животное (красный квадратик) должно кушать эту траву и получать энергию (баллы). Если оно не ест (количество баллов = 0) - через какое-то время оно умирает.

Сейчас же животное не может даже зайти на траву, т.к. никакой юнит не может заходить на другого юнита

Dilettante_Pro 10.05.2017 17:48

yaparoff,
У вас при движении животных получается двойной forEach - при вызове функции moveAnimal() и внутри этой функции. Из-за этого животные прыгают как сумасшедшие

yaparoff 10.05.2017 18:34

Цитата:

Сообщение от Dilettante_Pro (Сообщение 452065)
получается двойной forEach

Предлагаете убрать forEach у SetInterval (строка 129) ?

Написал вот так:
setInterval(function() {
	moveAnimal();
}, 1000);

Но интерпретатор не может понять что это за moveAnimal();
К нему надо подобраться по другому. Как?

Dilettante_Pro 11.05.2017 15:27

Цитата:

Сообщение от yaparoff
К нему надо подобраться по другому. Как?

Например, так
Animal.prototype.moveAnimal = function(i) {
	var stepTop, stepLeft, unitTop, unitLeft, noFree, unitPos = {};
//	for (var i = 0; i < animals.length; i++) {
		noFree = true;
		do {
			stepTop = Math.round(Math.random() * 2 - 1) * 20;
			stepLeft = Math.round(Math.random() * 2 - 1) * 20;
			unitTop = +animals[i].top.replace(/\D/g,"") + stepTop;
			unitLeft = +animals[i].left.replace(/\D/g,"") + stepLeft;
			if (unitTop < 0 || unitLeft < 0 || unitTop >  380 || unitLeft > 380) {
				noFree = true; 
			} else {
				unitTop = unitTop + 'px';
				unitLeft = unitLeft + 'px';
				noFree = false;
				
				for(var j = 0; j< units.length; j++) {
					if(units[j].top == unitTop && units[j].left == unitLeft) {
						noFree = true;
					}
				}
			}

		} while (noFree);
		units[i].top = unitTop;
		units[i].left = unitLeft;
		animals[i].top = unitTop;
		animals[i].left = unitLeft;
		var elem = document.querySelector('#a' + i);
		elem.style.top = unitTop;
		elem.style.left = unitLeft;
//	}
}


setInterval(function() {
		newAnimals.forEach(function(animal, index) {
			console.log(animal);
			animal.moveAnimal(index);
		});
	}, 1000);


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