Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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 просмотров)

Старый 04.10.2011, 05:13
Ylik вне форума Посмотреть профиль Отправить личное сообщение для Ylik Найти все сообщения от Ylik
  № 2  
Ответить с цитированием
Ylik
 
Аватар для Ylik

Регистрация: Sep 2010
Адрес: Saint-Petersburg
Сообщений: 143
Людиии, помогите, пожалуйста, разобраться в этом вопросе!!! Я до сих пор голову ломаю... Трудно понять всю эту математику без чьей-то помощи...

Старый 07.10.2011, 03:57
Доктор Глюк вне форума Посмотреть профиль Отправить личное сообщение для Доктор Глюк Найти все сообщения от Доктор Глюк
  № 3  
Ответить с цитированием
Доктор Глюк
[+1 03.02.12]
 
Аватар для Доктор Глюк

Регистрация: Jul 2007
Адрес: Благовещенск на Амуре
Сообщений: 22
Thumbs up !!!!!!!!!!!!!!!!!!!!

не использовал твой код, нашёл исходник, заменил имена объектов как в твоём коде, и добавил следующее:

Код AS1/AS2:
see=60;
Код AS1/AS2:
var dAngle = dAngleDegree(direction*180/Math.PI, p._rotation);
 
		if(Math.abs(dAngle)<see){ // !!!!!!!!!! и в слух пожалуйста спасибо TermoBYTE! =D
 
			//поворячиваем клип к направлени движения на 5-ю часть
			p._rotation += dAngle * .2;
			p._x = tgtX;
			p._y = tgtY;
			p.play();
		} else {
			//стоим
			p.gotoAndStop(5);
		}
	} else {
		//стоим
		p.gotoAndStop(5);
…
Вложения
Тип файла: rar исправленная.rar (16.3 Кб, 44 просмотров)
__________________
даёш кликопробегом по иконам


Последний раз редактировалось Доктор Глюк; 07.10.2011 в 04:17.
Старый 07.10.2011, 04:05
Ylik вне форума Посмотреть профиль Отправить личное сообщение для Ylik Найти все сообщения от Ylik
  № 4  
Ответить с цитированием
Ylik
 
Аватар для Ylik

Регистрация: Sep 2010
Адрес: Saint-Petersburg
Сообщений: 143
Спасибо большое за ответ!
А вот вопрос возник: после столкновения со стеной объект больше не реагирует на мышь специально?

Старый 07.10.2011, 09:13
Доктор Глюк вне форума Посмотреть профиль Отправить личное сообщение для Доктор Глюк Найти все сообщения от Доктор Глюк
  № 5  
Ответить с цитированием
Доктор Глюк
[+1 03.02.12]
 
Аватар для Доктор Глюк

Регистрация: Jul 2007
Адрес: Благовещенск на Амуре
Сообщений: 22
нет) так вышло) над этим надо думать)) просто мне сейчас реально некогда этими игрушками заниматься)
__________________
даёш кликопробегом по иконам

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

Регистрация: Sep 2010
Адрес: Saint-Petersburg
Сообщений: 143
Ну вот, в принципе уже больше похоже на то, что мне нужно.
Но всё-равно есть один косяк, с которым никак не могу справиться...
Когда объект сталкивается со стеной с левой стороны, и когда мышкой поворачиваем объект слева, то он как-то резко поворачивается, дёргается...
В общем, чтоб было более понятно, я прикрепила файл...
Может кто-нибудь знает, в чём дело? Очень буду рада за помощь!

Мой обновлённый код:
Код AS1/AS2:
step = 3;
 
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 + step * Math.cos(angle);
		tgtY = p._y + step * Math.sin(angle);
		p.p2.play();
		if (zone.hitTest(tgtX, tgtY, true)){
			p.p2.stop();
					if (!zone.hitTest(p._x, p._y, true)) {
							tgtX = p._x;
							tgtY = p._y;
							p._rotation = angle * 180/Math.PI;
					}
		}
		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-ю часть
		var r = p._rotation + dAngle * .2;
		p._rotation = r;
		p._x = tgtX;
		p._y = tgtY;
	} else {
		//стоим
		p.p2.stop();
		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 (17.6 Кб, 47 просмотров)

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:28.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 20:28.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.