Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   эффект притяжения (http://www.flasher.ru/forum/showthread.php?t=197986)

greep 17.04.2013 03:11

эффект притяжения
 
Здравствуйте, дорогие форумчане!
Хочу обратиться с вопросом, ответ на который не могу найти уже целый день и честно говоря даже отчаялся...
Задача заключается в воссоздании эффекта притяжения, но с замедлением на пути к точке притяжения. Грубо говоря, есть область, попав в которую объект стремится к одной точке замедляясь по пути к ней. Координаты точки: 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();
}


Hauts 17.04.2013 08:24

Цитата:

Грубо говоря, есть область, попав в которую объект стремится к одной точке замедляясь по пути к ней.
Область, в которую должен попасть объект и точка, к которой он должен стремиться, должны пересекаться, это очевидно.

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

Чуть позже попробую пример собрать :)

greep 17.04.2013 11:55

2Hauts: было бы здорово, но мне кажется, что теорема пифагора тут не причем.

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

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

Tails 17.04.2013 12:04

greep,
У Hauts с математикой хорошо.

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

greep 17.04.2013 12:16

2Tails: я не хотел ни кого оскорбить своими домыслами. Гипотенузу, я допустим вычислю по формуле h = Math.sqrt(x * x + y * y), а вот как быть со скоростью и движением в направлении угла? Если вас не затруднит, опишите пожалуйста формулой или кодом...

Tails 17.04.2013 12:19

Допустим, есть у вас скорость:
Код 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 (Сообщение 1130141)
С помощью Math.atan2(dy, dx) ищите угол между объектом и точкой в радианах.


Hauts 17.04.2013 12:32

Вложений: 2
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 Кб)


Кликайте на флэшке, чтобы блок подвинулся.

Tails 17.04.2013 12:40

А ещё, можно сделать векторами! Но это совсем другая история.

Hauts,
Ссори что вклинился :)

Hauts 17.04.2013 12:41

Tails, да я только "за" :)

greep 17.04.2013 12:44

Куда уж проще)

Код 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, время: 16:23.

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