Форум 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=138432)

MkTwo 07.04.2010 20:18

Перемещение мувиклипа
 
Столкнулся с проблемой - не могу сделать так, чтобы мувиклип "плавал" по экрану, не выходя за его пределы... Нужен эффект прицела "шарящего" по экрану. Все мои познания сводятся к clip._x = random(100); :rolleyes:

mooncar 07.04.2010 20:26

Задайте пределы по координатам и водите мувик по сцене, например, с помощью setInterval или onEnterFrame, время от времени меняя рандомно шаг движения и его знак (+-).

MkTwo 07.04.2010 20:46

поподробнее пожалуйста, я только учусь)

_SAM_ 07.04.2010 21:04

Я бы с Tween Motion делал бы.
Если надо не програмное решение, то Motion Guide
http://articles.antory.ru/adobe-flas...ciya-vo-flash/

mooncar 07.04.2010 21:16

Вложений: 1
Держите. Немного иначе, чем я посоветовал.
Исходник тоже есть.

Перемещается прицел pricel_mc в заданных пределах координат по рандомным точкам и за рандомное время.

Код AS1/AS2:

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. Можно ввести плюшку - нормировать время прохождения в зависимости от координат конечных точек, с тем, чтобы скорость прохождения была одинаковой...
Попробуйте, если захотите так...

MkTwo 07.04.2010 21:21

За руководство спасибо большое) И за скрипт - это как раз то что нужно) А вот вопрос - почему начальные координаты заданы не просто числом, а выражением?

mooncar 07.04.2010 21:32

Я думал, вы догадаетесь. :)
Это, чтобы было понятно, как вычислялось.
Например:
Код AS1/AS2:

var topLeftX:Number = (275 - 400/2) + 20;

275 - это X-координата центра прямоугольной области
400 - ширина прямоугольной области
20 - половина диаметра прицела (т.е. радиус)
Получаем крайний левый предел по X.

Остальное - по аналогии.

Можете просто на глаз у себя подобрать, если лень вычислять.

MkTwo 07.04.2010 21:35

точно) там просто прямоугольник был закрыт от редактирования) теперь ясно)

Добавлено через 7 минут
почему-то выдаёт ошибку при экспорте...syntax error в первой строке, причём только в моём файле, при экспорте исходника всё норм... можно как-то обойтись без экспорта mx.transitions.Tween?

KiL33 07.04.2010 21:44

Вложений: 1
как вариант, на много проще, без всяких рандомов и твинов

MkTwo 07.04.2010 21:49

Цитата:

Сообщение от KiL33 (Сообщение 898777)
как вариант, на много проще, без всяких рандомов и твинов

у меня почему-то на ActionScript 1.0 не пашет, тока на 2.0, а нужно именно на первом

mooncar 07.04.2010 21:55

Цитата:

Сообщение от MkTwo (Сообщение 898775)
почему-то выдаёт ошибку при экспорте...syntax error в первой строке, причём только в моём файле, при экспорте исходника всё норм... можно как-то обойтись без экспорта mx.transitions.Tween?

Нет, пример основан на классе Tween и прочем. AS2 only, в общем.
Ставьте при публикации AS2.
AS1 уже очень сильно устарел.

MkTwo 07.04.2010 22:13

Вот сделал, но прицел застревает в верхнем углу)
Код AS1/AS2:

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 минуту
Цитата:

Сообщение от mooncar (Сообщение 898781)
Ставьте при публикации AS2.
AS1 уже очень сильно устарел.

девайс на который флешка пишется не поддерживает AS2, тока AS1

mooncar 07.04.2010 22:22

Цитата:

Сообщение от MkTwo (Сообщение 898785)
Так как у меня клип состоит не из одного кадра, то он каждый раз при проходе через первый кадр сбрасывает величину приращения на исходные :( Как можно избежать этого?

Делайте все в одном кадре.
Или введите для этого флаговую переменную для проверки, нужно или нет выполнять эти действия, т.е. ограничение выполнения кода один раз.
Типа:
Код AS1/AS2:

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 ;
 
}


MkTwo 08.04.2010 09:29

mooncar, спасибо Вам большое) всё работает)


Часовой пояс GMT +4, время: 00:59.

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