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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.04.2013, 03:11
greep вне форума Посмотреть профиль Отправить личное сообщение для greep Найти все сообщения от greep
  № 1  
Ответить с цитированием
greep
 
Аватар для greep

Регистрация: Jun 2002
Адрес: on the backyard
Сообщений: 285
Отправить сообщение для greep с помощью ICQ
По умолчанию эффект притяжения

Здравствуйте, дорогие форумчане!
Хочу обратиться с вопросом, ответ на который не могу найти уже целый день и честно говоря даже отчаялся...
Задача заключается в воссоздании эффекта притяжения, но с замедлением на пути к точке притяжения. Грубо говоря, есть область, попав в которую объект стремится к одной точке замедляясь по пути к ней. Координаты точки: x=113 y=120

Есть кнопка, которая инициирует перетаскивание мувиклипа (red). Если координаты мувиклипа попадают в обозначенную область - должно сработать притяжение. Но как его описать я ни как не могу сообразить.

в руте код

Код AS1/AS2:
 
btn.onRollOver = function(){
 
	startDrag(red, true, 51, 51, 189, 349);
	Mouse.hide();
 
	_root.onEnterFrame = function(){
		if(red._x > 50 && red._x < 180 && red. _y > 50 && red._y < 180){
 
			trace("цель в зоне досягаемости силы притяжения ");
			// А что делать дальше я не знаю :( хелп... 
 
		}
	} 
 
}
btn.onRollOut = function(){
	red.stopDrag();
	Mouse.show();
}

Старый 17.04.2013, 08:24
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 2  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Цитата:
Грубо говоря, есть область, попав в которую объект стремится к одной точке замедляясь по пути к ней.
Область, в которую должен попасть объект и точка, к которой он должен стремиться, должны пересекаться, это очевидно.

Попробуйте сделать движение объекта зависимым от расстояния до точки. Расстояние ищите с помощью формулы Пифагора. С помощью Math.atan2(dy, dx) ищите угол между объектом и точкой в радианах.

Чуть позже попробую пример собрать
__________________
hauts.ru

Старый 17.04.2013, 11:55
greep вне форума Посмотреть профиль Отправить личное сообщение для greep Найти все сообщения от greep
  № 3  
Ответить с цитированием
greep
 
Аватар для greep

Регистрация: Jun 2002
Адрес: on the backyard
Сообщений: 285
Отправить сообщение для greep с помощью ICQ
2Hauts: было бы здорово, но мне кажется, что теорема пифагора тут не причем.

У меня получалось направленное движение к этой точке, но оно было не пропорциональным: если объект находился на равном расстоянии как по х, так и по у, то все ок, но если объект был ближе по х (или по у), то он сперва достигал ближайшей константы, а затем движение по данной оси прекращалось, но продолжалось по другой. Зрелище, конечно, слабо напоминало притяжение. А мне же еще и замедление надо ввести... Наверно описав трение?

Друзья, у кого с математикой хорошо, помогите пожалуйста!
Заранее спасибо!

Старый 17.04.2013, 12:04
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 4  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
greep,
У Hauts с математикой хорошо.

Теоремой Пифагора находите расстояние до цели. На основе этого расстояния рассчитываете скорость как вам надо. Затем двигаете объект в направлений угла с найденной скоростью.
__________________
Дети не должны знать о своих родителях

Старый 17.04.2013, 12:16
greep вне форума Посмотреть профиль Отправить личное сообщение для greep Найти все сообщения от greep
  № 5  
Ответить с цитированием
greep
 
Аватар для greep

Регистрация: Jun 2002
Адрес: on the backyard
Сообщений: 285
Отправить сообщение для greep с помощью ICQ
2Tails: я не хотел ни кого оскорбить своими домыслами. Гипотенузу, я допустим вычислю по формуле h = Math.sqrt(x * x + y * y), а вот как быть со скоростью и движением в направлении угла? Если вас не затруднит, опишите пожалуйста формулой или кодом...

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Допустим, есть у вас скорость:
Код AS1/AS2:
var speed:Number = 5;   // 5 пикселов за шаг
Есть у вас угол, указывающий направление движения:
Код AS1/AS2:
var angle:Number = 1.2    // Угол должен быть в радианах, где 3.14 = 360 градусов
Далее раскладываете скорость по осям и двигаете объект:
Код AS1/AS2:
bullet._x += Math.cos(angle) * speed;
bullet._y += Math.sin(angle) * speed;
Добавлено через 12 минут
пс.
Как найти угол в радианах вам написал Hauts:
Цитата:
Сообщение от Hauts Посмотреть сообщение
С помощью Math.atan2(dy, dx) ищите угол между объектом и точкой в радианах.
__________________
Дети не должны знать о своих родителях

Старый 17.04.2013, 12:32
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 7  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
greep, всё довольно просто

Код AS1/AS2:
Stage.scaleMode = "noscale";
Stage.showMenu = false;
Stage.align = "tl";
_quality = "best";
 
var clip = this.createEmptyMovieClip("clip", 1);
clip.lineStyle(1,0x0000000);
clip.beginFill(0xFF0000,100);
clip.moveTo(-10,-10);
clip.lineTo(10,-10);
clip.lineTo(10,10);
clip.lineTo(-10,10);
clip.lineTo(-10,-10);
clip.endFill();
 
 
var freeSpeed = 10;
var affectRadius = 200;
var affectX = Stage.width / 2;
var affectY = Stage.width / 2;
 
clip._x = Math.random() * Stage.width;
clip._y = Math.random() * Stage.height;
 
this.onMouseDown = function() {
	affectX = this._xmouse;
	affectY = this._ymouse;
};
 
this.onEnterFrame = function() {
	var dx = affectX - clip._x;
	var dy = affectY - clip._y;
	var distance = Math.sqrt(dx * dx + dy * dy);
	var angle = Math.atan2(dy, dx);// y value first!
 
	var affectPower = 1;
	var cos = Math.cos(angle);
	var sin = Math.sin(angle);
	if (distance > affectRadius) {
		clip._x += cos * freeSpeed;
		clip._y += sin * freeSpeed;
	} else {
		var coeff = distance / affectRadius;
		affectPower = 10 * coeff;
		var speed = freeSpeed * coeff;
		clip._x += cos * speed;
		clip._y += sin * speed;
	}
	debugDraw(affectPower);
};
 
function debugDraw(affectPower) {
	this.clear();
	this.lineStyle(1,0xFF0000,50);
	this.moveTo(affectX - 5,affectY);
	this.lineTo(affectX + 5,affectY);
	this.moveTo(affectX,affectY - 5);
	this.lineTo(affectX,affectY + 5);
	this.lineStyle(affectPower,0x00FF00,50);
	this.moveTo(clip._x,clip._y);
	this.lineTo(affectX,affectY);
}
example.swf   (1.2 Кб)


Кликайте на флэшке, чтобы блок подвинулся.
Вложения
Тип файла: swf example.swf (1.2 Кб, 65 просмотров)
__________________
hauts.ru

Старый 17.04.2013, 12:40
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 8  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
А ещё, можно сделать векторами! Но это совсем другая история.

Hauts,
Ссори что вклинился
__________________
Дети не должны знать о своих родителях

Старый 17.04.2013, 12:41
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 9  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Tails, да я только "за"
__________________
hauts.ru

Старый 17.04.2013, 12:44
greep вне форума Посмотреть профиль Отправить личное сообщение для greep Найти все сообщения от greep
  № 10  
Ответить с цитированием
greep
 
Аватар для greep

Регистрация: Jun 2002
Адрес: on the backyard
Сообщений: 285
Отправить сообщение для greep с помощью ICQ
Куда уж проще)

Код AS1/AS2:
 
btn.onRollOver = function(){
 
	startDrag(red, true, 51, 51, 189, 349);
	Mouse.hide();
 
	_root.onEnterFrame = function(){
		if(red._x > 50 && red._x < 180 && red. _y > 50 && red._y < 180){
 
			red.stopDrag();
			red._x += (113-red._x)/5;
			red._y += (120-red._y)/5;
 
		}
	} 
 
}
btn.onRollOut = function(){
	red.stopDrag();
	Mouse.show();
}
Друзья, всем огромное спасибо!

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

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

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


 


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


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