Показать сообщение отдельно
Старый 03.10.2011, 00:03
Ylik вне форума Посмотреть профиль Отправить личное сообщение для Ylik Найти все сообщения от Ylik
  № 1  
Ответить с цитированием
Ylik
 
Аватар для Ylik

Регистрация: Sep 2010
Адрес: Saint-Petersburg
Сообщений: 143
По умолчанию движение к мышке и hitTest

Здравствуйте! Я попыталась сделать движение объекта за мышкой из этого урока: http://xitri.com/2008/09/22/simple-e...-top-view.html
Но я не очень дружу с математикой и так до конца не смогла разобраться с кодом.
А точнее: я немного изменила свою задачу, хотела, чтобы при столкновении с препятствием объект останавливался и начинал двигаться к мышке только когда угол между направлением к цели и направлением движения объекта будет хотя бы, например, 60 градусов.
Уже по-всякому пробовала… Не пойму, что влияет на остановку объекта.

А пока: при столкновении с препятствием объект не останавливается, а продолжает двигаться к мышке.

Ниже мой код для наглядности и исходник, если кто заинтересуется.

Очень прошу, помогите разобраться, кто может! Большое спасибо за внимание к моему вопросу!
Очень буду рада комментированию частей кода!

Код AS1/AS2:
step = 2;
 
onEnterFrame = function(){
	var dx = _xmouse - p._x;
	var dy = _ymouse - p._y;
	//Направление (угол) к цели
	var angle = Math.atan2(dy, dx);
	var dist = Math.sqrt(dx*dx + dy*dy);
	if(dist > step) {
		//пробуем пройти напролом
		tgtX = p._x + 1/2*step * Math.cos(angle);
		tgtY = p._y + 1/2*step * Math.sin(angle);
		p.p2.play();
		if (zone.hitTest(tgtX, tgtY, true)){
			p.p2.gotoAndStop(1);
			//напролом не получилось, вычисляем базовое направление
			var dAngle = dAngleRadian(direction, angle);
			workAngle = angle + dAngle*.10;
			//Шаг поворота - 10 градусов
			for(var i = 0; i < 15; i += 10) {
				for(var j = -1; j <= 1; j += 2) {
					if (angle > 60) {
					var a = workAngle + radian(i) * j;
					var tempX = p._x + step * Math.cos(a);
					var tempY = p._y + step * Math.sin(a);
					if (!zone.hitTest(tempX, tempY, true)) {
						trace(tempX);
						//точка выхода найдена. Запоминаем ее и прерываем цикл
						tgtX = tempX;
						tgtY = tempY;
						break;
					}
				}
			}
		}
		}
		var timeDx = tgtX - p._x;
		var timeDy = tgtY - p._y;
		//направление движения
		direction = Math.atan2(timeDy, timeDx);
		var dAngle = dAngleDegree(direction*180/Math.PI, p._rotation);
		//поворачиваем клип в направлении движения на 5-ю часть
		p._rotation += dAngle * .2;
		p._x = tgtX;
		p._y = tgtY;
	} else {
		//стоим
		p.p2.gotoAndStop(1);
		tgtX = p._x;
		tgtY = p._y;
	}
}
 
function dAngleRadian(a1, a2) {
	var da = a1 - a2;
	if (da > Math.PI) {
		da = -Math.PI*2 + da;
	} else if (da < -Math.PI) {
		da = Math.PI*2 + da;
	}
	return da;
}
function dAngleDegree(a1, a2) {
	var da = a1 - a2;
	if (da > 180) {
		da = -360 + da;
	} else if (da < -180) {
		da = 360 + da;
	}
	return da;
}
function degree(a) {
	return a / Math.PI * 180;
}
function radian(a) {
	return a / 180 * Math.PI;
}
Вложения
Тип файла: rar Пример.rar (8.8 Кб, 47 просмотров)