Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Движение по синусоиде
Flash Zone Forum > Macromedia Flash > ActionScript
Danko
Есть мувик, он движется за мышью по прямой, хотелось бы заставить двигаться, как змею, по синусоиде.
Получилось очень странно. Змея движется как надо только в верхний правый, и нижний левый углы(по отношению к змее)
Попробовал 10 вариантов, сделать нормально не получается.
Macromedia Flash Professional 8

Код
var lx = lard._x;
var ly = lard._y;
var amplitude:Number = 100;
var rate:Number = Math.PI/24;

Mouse.hide();
this.onMouseMove = function():Void
{
    lard._x = this._xmouse;
    lard._y = this._ymouse;
}

kitx = lx;
kity = ly;
cos_al_kill = (lx - killer._x) / Math.sqrt( (killer._x - lx) * (killer._x - lx) + (killer._y - ly) * (killer._y - ly));
sin_al_kill = (ly - killer._y) / Math.sqrt( (killer._x - lx) * (killer._x - lx) + (killer._y - ly) * (killer._y - ly));

if (Key.isDown(Key.SPACE)) {
    killer._x = 100;
    killer._y = 100;
}

if ((kitx > killer._x) && (kity > killer._y)) {
killer._x += 3 * cos_al_kill + amplitude * Math.sin(killer._y * rate) / 30;
killer._y += 3 * sin_al_kill;
} else if ((kitx < killer._x) && (kity < killer._y)) {
killer._x += 3 * cos_al_kill + amplitude * Math.sin(killer._y * rate) / 30;
killer._y += 3 * sin_al_kill;
} else if ((kitx > killer._x) && (kity < killer._y)) {
killer._x += 3 * cos_al_kill + amplitude * Math.sin(killer._y * rate) / 30;
killer._y += 3 * sin_al_kill;
} else if ((kitx < killer._x) && (kity > killer._y)) {
killer._x += 3 * cos_al_kill + amplitude * Math.sin(killer._y * rate) / 30;
killer._y += 3 * sin_al_kill;
}


Подскажите решение пожалуйста...
chingachgoog
Честно говоря, не совсем понял, что хочется в конечном итоге получить.

Получилось ли сделать пример, где мувик движется за курсором по прямой?
Если получилось, то в чем вопрос? Просто делаем отклонение от нормали на величину постоянной синусоиды (помноженной на амплитуду).
Danko
Движение по прямой работает без проблем, по синусоиде - никак. Змея должна двигаться за мышью, по синусоиде. Задача состоит в том чтобы точка двигалась к координатам мыши, постоянно извиваясь. Мышь может находиться где угодно по отношению к мувику...
chingachgoog
Цитата(Danko @ 2.03.2012 - 19:00) *
Движение по прямой работает без проблем, по синусоиде - никак. Змея должна двигаться за мышью, по синусоиде. Задача состоит в том чтобы точка двигалась к координатам мыши, постоянно извиваясь. Мышь может находиться где угодно по отношению к мувику...


Что значит по прямой? Есть движение мувика к мыши по прямой, если мувик может располагаться где угодно? Если есть, значит используется atan2, если используется atan2, то найти к нему перпендикуляр (ось с амплитудой синусоиды) вообще не сложно.

Т.е. я говорю вот о чем. Надо учиться работать от простого к сложному.
Простое - движение к курсору мыши по прямой. Это сделано? Великолепно.
Усложняем - например, делаем еще и ускорение. Получилось?
Тогда делаем колебание с амплитудой синусоиды.
Но я не вижу кода, где хотя бы получился шаг 1. Где вообще функция atan2?
Danko
Пардон, не правильно сказал... Движение по прямой за мышью работает нормально. atan2 я не использую, а сразу нахожу синус и косинус угла.
Практики во Flash нету, да и проект такого рода делаю в первый раз. Писал сам не используя сайты, поэтому кустарным методом... не думаю что atan2 что-то меняет... ну вроде бы.
Ускорение для мувика мне не нужно, тк это существенно упростит уклонение от неё... В общем не нужно ускорение.
Хотелось бы в итоге получить это:

http://img196.imageshack.us/img196/5466/72270941.png

Никаких ускорений не нужно... изначально код был проще:
Код
var lx = lard._x;
var ly = lard._y;
var amplitude:Number = 100;
var rate:Number = Math.PI/24;

Mouse.hide();
this.onMouseMove = function():Void
{
    lard._x = this._xmouse;
    lard._y = this._ymouse;
}

kitx = lx;
kity = ly;
cos_kill = (lx - killer._x) / Math.sqrt( (killer._x - lx) * (killer._x - lx) + (killer._y - ly) * (killer._y - ly));
sin_kill = (ly - killer._y) / Math.sqrt( (killer._x - lx) * (killer._x - lx) + (killer._y - ly) * (killer._y - ly));

killer._x += 3 * cos_kill + amplitude * Math.sin(killer._y * rate) / 30;
killer._y += 3 * sin_kill;

Но в данном коде змея следует за мышью по синусоиде только в направлениях вниз и вверх, чем меньше расстояние по оси Y между мышью и змеёй, тем более прямолинейно змея двигается. Нужно чтобы в конце концов змея двигалась за мышкой всегда по синусоиде...
Надеюсь сейчас моя проблемка ясна...
Цитата
То найти к нему перпендикуляр (ось с амплитудой синусоиды) вообще не сложно.

Вы не могли бы детальнее описать, так как с флэшем недавно познакомился, да и с синусами у меня всегда проблемы были... dry.gif Всё остальное получается без особых проблем в проекте, но это просто... Трабл...
chingachgoog
Во-первых этот код не рабочий.
Во-вторых - atan2 - золотая функция

Код
import flash.geom.*

// Курсор-цель
Mouse.hide();
this.onMouseMove = function(){
    lard._x = this._xmouse;
    lard._y = this._ymouse;    
}

// Змея
a=0
amplitude=15
killer.onEnterFrame=function(){
    // мордой (правая часть клипа) всегда смотрим на цель
    this._rotation=0
    var p=new Point()
    p.x=_root._xmouse
    p.y=_root._ymouse
    this.globalToLocal(p)
    this._rotation=Math.atan2(p.y, p.x)*180/Math.PI
    
    // Задаем синусовую амплитуду (по оси Y)
    var dy=Math.sin(a)*amplitude
    p.x=0
    p.y=dy
    this.localToGlobal(p)
    this._x=p.x
    this._y=p.y
    a++
    
    // Передвижение к цели
    this._x+=(lard._x-this._x)*0.05
    this._y+=(lard._y-this._y)*0.05
}
Danko
Огромное спасибо, думал все забили. Всё работает, даже настроение поднялось, ещё раз огромное спасибо!
Русская версия IP.Board © 2001-2013 IPS, Inc.