Просмотр полной версии : Перемещение мувиклипа
Столкнулся с проблемой - не могу сделать так, чтобы мувиклип "плавал" по экрану, не выходя за его пределы... Нужен эффект прицела "шарящего" по экрану. Все мои познания сводятся к clip._x = random(100); :rolleyes:
Задайте пределы по координатам и водите мувик по сцене, например, с помощью setInterval или onEnterFrame, время от времени меняя рандомно шаг движения и его знак (+-).
поподробнее пожалуйста, я только учусь)
Я бы с Tween Motion делал бы.
Если надо не програмное решение, то Motion Guide
http://articles.antory.ru/adobe-flash/animaciya-vo-flash/
Держите. Немного иначе, чем я посоветовал.
Исходник тоже есть.
Перемещается прицел pricel_mc в заданных пределах координат по рандомным точкам и за рандомное время.
import mx.transitions.Tween;
//задаем левый верхний угол области движения
var topLeftX:Number = (275 - 400/2) + 20;
var topLeftY:Number = (200 - 300/2) + 20;
//задаем правый нижний угол области движения
var botRightX:Number = (275 + 400/2) - 20;
var botRightY:Number = (200 + 300/2)- 20;
//задаем врменные пределы движения между конечными точками, в секундах
var timeMin:Number = 2;
var timeMax:Number = 10;
//функция, отвечающая за организацию движения в указанные координаты X и Y и за указанный в секундах промежуток времени
function moveIt (xMove:Number, yMove:Number, timeMove:Number):Void {
var xTween:Tween = new Tween(pricel_mc, '_x', mx.transitions.easing.None.easeNone, pricel_mc._x, xMove, timeMove, true);
var yTween:Tween = new Tween(pricel_mc, '_y', mx.transitions.easing.None.easeNone, pricel_mc._y, yMove, timeMove, true);
//вызов следующего шага после окончания данного
xTween.onMotionFinished = nextPoint;
}
function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random()*(max - min)) + min;
return randomNum;
}
//переход к следующей точке - вычисления вводных и активация движения
function nextPoint () {
//вычисляем рандомные координгаты конечной точки в заданных пределах
var xFinish:Number = randRange (topLeftX, botRightX);
var yFinish:Number = randRange (topLeftY, botRightY);
//вычисляем рандомный промежуток времени для движения, в секундах
var timeFinish:Number = randRange (timeMin, timeMax);
//запусаем очередное движение
moveIt (xFinish, yFinish, timeFinish);
}
//начальный старт движения с кнопки
start_btn.onRelease = nextPoint;
//либо автостарт
//nextPoint();
Поставьте поменьше timeMin и timeMax, шустрее будет бегать. Например, 2 и 3.
Естественно, время timeMin < timeMax.
PS. Можно ввести плюшку - нормировать время прохождения в зависимости от координат конечных точек, с тем, чтобы скорость прохождения была одинаковой...
Попробуйте, если захотите так...
За руководство спасибо большое) И за скрипт - это как раз то что нужно) А вот вопрос - почему начальные координаты заданы не просто числом, а выражением?
Я думал, вы догадаетесь. :)
Это, чтобы было понятно, как вычислялось.
Например:
var topLeftX:Number = (275 - 400/2) + 20;
275 - это X-координата центра прямоугольной области
400 - ширина прямоугольной области
20 - половина диаметра прицела (т.е. радиус)
Получаем крайний левый предел по X.
Остальное - по аналогии.
Можете просто на глаз у себя подобрать, если лень вычислять.
точно) там просто прямоугольник был закрыт от редактирования) теперь ясно)
Добавлено через 7 минут
почему-то выдаёт ошибку при экспорте...syntax error в первой строке, причём только в моём файле, при экспорте исходника всё норм... можно как-то обойтись без экспорта mx.transitions.Tween?
как вариант, на много проще, без всяких рандомов и твинов
как вариант, на много проще, без всяких рандомов и твинов
у меня почему-то на ActionScript 1.0 не пашет, тока на 2.0, а нужно именно на первом
почему-то выдаёт ошибку при экспорте...syntax error в первой строке, причём только в моём файле, при экспорте исходника всё норм... можно как-то обойтись без экспорта mx.transitions.Tween?
Нет, пример основан на классе Tween и прочем. AS2 only, в общем.
Ставьте при публикации AS2.
AS1 уже очень сильно устарел.
Вот сделал, но прицел застревает в верхнем углу)
var incX = 1;
var incY = -2;
var w = 16;
var h = 16;
mc.onEnterFrame=function() {
mc._x += incX;
mc._y += incY;
if (mc._x > 240-w) {// Столкновение с правой границей
mc._x = 240-w;
incX = -incX;// Меняем направление
}
if (mc._x < w) {// Столкновение с левой границей
mc._x = w;
incX = -incX;// Меняем направление
}
if (mc._y < h) {// Столкновение с верхней границей
mc._y = h;
incY = -incY;// Меняем направление
}
if (mc._y > 350-h) { // Столкновение с нижней границей
mc._y = 350-h;
incY = -incY;// Меняем направление
}
}
Так как у меня клип состоит не из одного кадра, то он каждый раз при проходе через первый кадр сбрасывает величину приращения на исходные :( Как можно избежать этого?
Добавлено через 1 минуту
Ставьте при публикации AS2.
AS1 уже очень сильно устарел.
девайс на который флешка пишется не поддерживает AS2, тока AS1
Так как у меня клип состоит не из одного кадра, то он каждый раз при проходе через первый кадр сбрасывает величину приращения на исходные :( Как можно избежать этого?
Делайте все в одном кадре.
Или введите для этого флаговую переменную для проверки, нужно или нет выполнять эти действия, т.е. ограничение выполнения кода один раз.
Типа:
if (!wasStarted) {
var incX = 1;
var incY = -2;
var w = 16;
var h = 16;
mc.onEnterFrame=function() {
mc._x += incX;
mc._y += incY;
if (mc._x > 240-w) {// Столкновение с правой границей
mc._x = 240-w;
incX = -incX;// Меняем направление
}
if (mc._x < w) {// Столкновение с левой границей
mc._x = w;
incX = -incX;// Меняем направление
}
if (mc._y < h) {// Столкновение с верхней границей
mc._y = h;
incY = -incY;// Меняем направление
}
if (mc._y > 350-h) { // Столкновение с нижней границей
mc._y = 350-h;
incY = -incY;// Меняем направление
}
}
var wasStarted = true ;
}
mooncar, спасибо Вам большое) всё работает)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.