|
|
|||||
эффект притяжения
Здравствуйте, дорогие форумчане!
Хочу обратиться с вопросом, ответ на который не могу найти уже целый день и честно говоря даже отчаялся... Задача заключается в воссоздании эффекта притяжения, но с замедлением на пути к точке притяжения. Грубо говоря, есть область, попав в которую объект стремится к одной точке замедляясь по пути к ней. Координаты точки: x=113 y=120 Есть кнопка, которая инициирует перетаскивание мувиклипа (red). Если координаты мувиклипа попадают в обозначенную область - должно сработать притяжение. Но как его описать я ни как не могу сообразить. в руте код 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(); } |
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
Цитата:
Попробуйте сделать движение объекта зависимым от расстояния до точки. Расстояние ищите с помощью формулы Пифагора. С помощью Math.atan2(dy, dx) ищите угол между объектом и точкой в радианах. Чуть позже попробую пример собрать
__________________
hauts.ru |
|
|||||
2Hauts: было бы здорово, но мне кажется, что теорема пифагора тут не причем.
У меня получалось направленное движение к этой точке, но оно было не пропорциональным: если объект находился на равном расстоянии как по х, так и по у, то все ок, но если объект был ближе по х (или по у), то он сперва достигал ближайшей константы, а затем движение по данной оси прекращалось, но продолжалось по другой. Зрелище, конечно, слабо напоминало притяжение. А мне же еще и замедление надо ввести... Наверно описав трение? Друзья, у кого с математикой хорошо, помогите пожалуйста! Заранее спасибо! |
|
|||||
greep,
У Hauts с математикой хорошо. Теоремой Пифагора находите расстояние до цели. На основе этого расстояния рассчитываете скорость как вам надо. Затем двигаете объект в направлений угла с найденной скоростью.
__________________
Дети не должны знать о своих родителях |
|
|||||
2Tails: я не хотел ни кого оскорбить своими домыслами. Гипотенузу, я допустим вычислю по формуле h = Math.sqrt(x * x + y * y), а вот как быть со скоростью и движением в направлении угла? Если вас не затруднит, опишите пожалуйста формулой или кодом...
|
|
|||||
Допустим, есть у вас скорость:
Есть у вас угол, указывающий направление движения: Далее раскладываете скорость по осям и двигаете объект: Добавлено через 12 минут пс. Как найти угол в радианах вам написал Hauts:
__________________
Дети не должны знать о своих родителях |
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
greep, всё довольно просто
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); } Кликайте на флэшке, чтобы блок подвинулся.
__________________
hauts.ru |
|
|||||
Куда уж проще)
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, время: 09:58. |
|
« Предыдущая тема | Следующая тема » |
|
|