PDA

Просмотр полной версии : Полет программно


Taha4000
09.10.2009, 16:19
Добрый день, уважаемые флешеры!!! Поискала в поиске, но подобного не нашла и прошу у Вас помощи!!! Сама я дизайнер, в программировании понимаю кое чего, но написать такой скрипт не под силу :wacko:

Вот задумала я такую анимашку: по экрану с растениями летает божья коровка, точнее иногда летает, а иногда ползает по растениям. Конечно, когда она летает, у нее крылышки открыты, а когда ползает закрыты. Вот летает она летает, ни о чем не думает, т.е. произвольно.
Также у нас есть кнопка (например для перехода на какой либо раздел), и когда курсор мыши находиться над этой кнопкой, то божья коровка подлетает к кнопке и кружит вокруг нее и только когда нажмем на кнопку божья коровка садиться на нее. Как только перейдем в нужный раздел, то божья коровка улетает и опять произвольно кружит до следующего наведения и/или нажатия кнопки. Кнопок будет не мало, а каждом разделе по разному, но коровка будет везде конечно

Вот не знаю как это сделать, может все программно прописать :wacko:... но не представляю как это сделать... Если делать анимашку произвольного полета, то когда курсор будет над кнопкой, как остановить эту анимацию и тут все равно нужно делать полет до кнопки программно и опять :wacko:

Сделала маленький исходник для примера: ссылка (http://***********/14268965)

Помогите плз кто чем может :rolleyes:

frops
09.10.2009, 17:19
Можно написать программно, например пусть божья коровка подлетает к координатам кнопки. Грубо говоря, пусть b1_btn - имя кнопки.

Необходимо вычислить расстояние до кнопки и направление движения. Как вычислить направление и расстояние могу написать, но позже.

Допустим вычислили расстояние(rast) и направление(tx,ty) и напрявлем туду БК

var mx:Number = b1_btn._x;
var my:Number = b1_btn._y;

_root.onEnterFrame = function()
{
if(rast>=2)
{
bojya_korovka._mx+=tx;
bojya_korovka._y+=ty;
}
}



ICQ: 376657599

Taha4000
12.10.2009, 10:29
Необходимо вычислить расстояние до кнопки и направление движения. Как вычислить направление и расстояние могу написать, но позже.

- напиши пожалуйста ;)

да и можно ли этот программный полет сделать по небольшой дуге, т.е. чтоб она летела не прямо, а немного изогнуто???? :rolleyes:

dirrect
14.10.2009, 16:01
полет по прямой будет так:

//координаты кнопки
var mx:Number = b1_btn._x;
var my:Number = b1_btn._y;

var spd:Number = 1;//скорость движения

//процедура
_root.onEnterFrame = function() {
delta_x = bojya_korovka._x-mx;
delta_y = bojya_korovka._y-my;
targetRotation = -Math.atan2(delta_x, delta_y)/(Math.PI/180);
rast = Math.sqrt((delta_x*delta_x)+(delta_y*delta_y));
if(rast>=2) {
bojya_korovka._x+=spd*Math.sin((targetRotation)*(Math.PI/180));
bojya_korovka._y+=spd*Math.cos((targetRotation)*(Math.PI/180));
}
}

а если вписать в процедуру bojya_korovka.rotation = targetRotation; то коровка будет поворачиваться в сторону курсора. Для полета по наклонной нуобходимо в начале движения задать отличный от рассчитанного угол в переменной targetRotation, а затем по ходу вдижения динамически приближать значение к первоначально рассчитанному. Если непонятно, то спрашивай еще...

iNils
14.10.2009, 16:23
dirrect, для оформления своего кода надо использовать теги (http://www.flasher.ru/forum/showthread.php?t=122539)

Taha4000
14.10.2009, 16:26
Если честно не понятно :rolleyes:

А можно это в код дописать??????

dirrect
14.10.2009, 16:57
Вот готовый код:
// координаты кнопки
var mX:Number = b1_btn._x;
var mY:Number = b1_btn._y;
var sA:Number = -45;//угол отклонения
// скорость движения
var spd:Number = 5;
// процедура
_root.onEnterFrame = function() {
delta_x = bojya_korovka._x-mX;
delta_y = bojya_korovka._y-mY;
targetRotation = -Math.atan2(delta_x, delta_y)/(Math.PI/180)+sA;
rast = Math.sqrt((delta_x*delta_x)+(delta_y*delta_y));
bojya_korovka._rotation = targetRotation;
if (rast>=spd) {
bojya_korovka._x += spd*Math.sin((targetRotation)*(Math.PI/180));
bojya_korovka._y -= spd*Math.cos((targetRotation)*(Math.PI/180));
}
};
различные вариации переменных sA и spd дадут нужный результат, проеверено, работает... :)

Taha4000
14.10.2009, 20:16
Спасибо огромное!!!!! Завтра буду пробывать :)

Добавлено через 15 часов 12 минут
Все работает!!!! Летит по дуге :) спасибо спасибо!!!!!!!

с этим разобрались, но тут еще вопросы появились... у меня же эта божья коровка сначала летает (я сделала зацикленный мувик полета по траектории, где она когда ползает по растению, у нее крылышки закрыты, а когда летает открыты) - дак вот при наведении на кнопку она должна полететь к ней... я попробывала тупо остановить мувик и выполнить полет программно, но не так все просто :wacko: думаю понятно что происходит.... этот весь мувик с траекторией летит, и конечно не так как нужно...

я думаю нужно при наведении на кнопку мувик анимации нужно остановить программно, запомнить в каком кадре остановили, просчитать его координаты и поворот самой божьей коровки, и наверно сделать его прозрачной через альфаканал, а после этого загрузить с библиотеки божью коровку с открытыми крыльями, поместить ее на место нужных координат и при нужном угле и произвести полет программно. Потом при отвединии или нажатии на кнопку, вернуть божью коровку на те же координаты под нужным углом, сделать ее опять со 100% альфаканалом и продолжить проигрывание анимации...

возможно есть и другие способы.... не знаю :o

помогите плз с кодом :rolleyes:

dirrect
17.10.2009, 06:31
Вот держи финальную версию:
var goHome:Boolean = true;
_root.Rastenie.cel._visible = false;
// координаты кнопки
var homeX:Number = Rastenie._x;
var homeY:Number = Rastenie._y;
var mX:Number = homeX;
var mY:Number = homeY;
var sA:Number = -20;//угол отклонения
// скорость движения
var spd:Number = 4;
// скорость поворота
var spdR:Number = 2;
// процедура
getCelXY = function(){
var myPoint = {x:0, y:0};
_root.Rastenie.cel.localToGlobal(myPoint);
mX=myPoint.x;
mY=myPoint.y;
//trace("myPoint_x - "+myPoint.x);
}
_root.onEnterFrame = function() {
if (goHome){
getCelXY();
}
delta_x = Math.floor(ladybird._x-mX);
delta_y = Math.floor(ladybird._y-mY);
targetRotation = -Math.atan2(delta_x, delta_y)/(Math.PI/180)+sA;
rast = Math.sqrt((delta_x*delta_x)+(delta_y*delta_y));
if (rast>=spd+20) {
ladybird.gotoAndStop(2);
} else {
ladybird._rotation=targetRotation;
ladybird.gotoAndStop(1);

}
if (rast>=spd+10) {//20 - это радиус круга попадая в который коровка перестает лететь
if (Math.abs(Math.abs(Math.floor(ladybird._rotation))-Math.abs(targetRotation))<5) {
ladybird._rotation=targetRotation;
} else {
ladybird._rotation += spdR;
}
ladybird._x += spd*Math.sin((ladybird._rotation)*(Math.PI/180));
ladybird._y -= spd*Math.cos((ladybird._rotation)*(Math.PI/180));
}
};
mouseOnButton = function(){
goHome = false;
mX = Math.floor(_xmouse);
mY = Math.floor(_ymouse);
}
mouseOutButton = function(){
goHome = true;
}
//кнопки
btn_1.onPress = function() {
};
btn_1.onRollOver = function(){
mouseOnButton();
}
btn_1.onRollOut = function(){
mouseOutButton();
}
//
btn_2.onPress = function() {
};
btn_2.onRollOver = function(){
mouseOnButton();
}
btn_2.onRollOut = function(){
mouseOutButton();
}
//
btn_3.onPress = function() {
};
btn_3.onRollOver = function(){
mouseOnButton();
}
btn_3.onRollOut = function(){
mouseOutButton();
}

в исходнике все понятно.

Taha4000
21.10.2009, 10:12
dirrect СПАСИБО ОГРОМНОЕ!!!!!! :):):)