Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.03.2014, 20:21
FoxyRoxy вне форума Посмотреть профиль Отправить личное сообщение для FoxyRoxy Найти все сообщения от FoxyRoxy
  № 1  
Ответить с цитированием
FoxyRoxy

Регистрация: Sep 2012
Сообщений: 7
Attention Перемещение MovieClip при помощи мыши. Нужна помощь

Как сделать так, что бы "MovieClip" при нажатии кнопки мышки на определенном участке окна, перемещался без скольжения, ускорения, поворотов с определенной (указанной) скоростью. Есть код, что в нём нужно дополнить, изменить? Спасибо!
На самом MovieClip:

Код AS1/AS2:
onClipEvent (mouseDown) {
    sx = _root._xmouse;
    sy = _root._ymouse;
}
 
onClipEvent (enterFrame) {
    this._x = this._x + (sx - this._x) / 4;
    this._y = this._y + (sy - this._y) / 4;
}
Untitled.swf   (1.5 Кб)
Вложения
Тип файла: swf Untitled.swf (1.5 Кб, 170 просмотров)

Старый 10.03.2014, 21:12
Alexej вне форума Посмотреть профиль Отправить личное сообщение для Alexej Найти все сообщения от Alexej
  № 2  
Ответить с цитированием
Alexej
 
Аватар для Alexej

Регистрация: Mar 2014
Сообщений: 15
Как то так.
Код AS1/AS2:
onClipEvent (mouseDown) {
	sx = _root._xmouse;
	sy = _root._ymouse;
}
onClipEvent (enterFrame) {
	speedX = 4;
	speedY = 4;
	if (this._x<sx) {
		if (this._x-sx<-speedX) {
			this._x += speedX;
		}
	} else {
		if (this._x-sx>speedX) {
			this._x -= speedX;
		}
	}
	if (this._y<sy) {
		if (this._y-sy<-speedY) {
			this._y += speedY;
		}
	} else {
		if (this._y-sy>speedY) {
			this._y -= speedY;
		}
	}
}


Последний раз редактировалось Alexej; 10.03.2014 в 21:32.
Старый 11.03.2014, 07:18
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 3  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Код AS1/AS2:
var speed = 10;
var stepX;
var stepY;
var endX;
var endY;
this.onMouseDown = function(){
    endX = this._xmouse;
    endY = this._ymouse;
    var angle = Math.atan2( endX - this._y, endY - this._x);
    stepX = speed * Math.cos( angle )
    stepY = speed * Math.sin( angle )
 
    this.onEnterFrame = moveToPoint;
}
function moveToPoint(){
    var dx = endX - this._x;
    var dy = endY - this._y;
    var distance = Math.sqrt( dx * dx + dy * dy);
    if(distance > speed){
        this._x += stepX;
        this._y += stepY;
    } else {
        this._x = endX;
        this._y = endY;
        delete this.onEnterFrame;
    }
}
Вот как-то так.

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

На каждое событие обновления (onEnterFrame) считаем расстояние до конечной точки. Если оно меньше, чем скорость — ставим клип в конечную точку. Если больше 0151 сдвигаем его по "шагам".

Алгоритм не идеальный, при большом расстоянии для перемещения и некоторых углах будет давать сбой в точности перемещения.

Наверное, можно б было подправить так:

Код AS1/AS2:
var speed = 10;
var endX;
var endY;
this.onMouseDown = function(){
    endX = this._xmouse;
    endY = this._ymouse;
    this.onEnterFrame = moveToPoint;
}
function moveToPoint(){
    var dx = endX - this._x;
    var dy = endY - this._y;
    var angle = Math.atan2( endX - this._y, endY - this._x);
    var stepX = speed * Math.cos( angle )
    var stepY = speed * Math.sin( angle )
    var distance = Math.sqrt( dx * dx + dy * dy);
    if(distance > speed){
        this._x += stepX;
        this._y += stepY;
    } else {
        this._x = endX;
        this._y = endY;
        delete this.onEnterFrame;
    }
}
— то есть перерассчитывать сдвиги для направлений на каждой итерации.

Добавлено через 3 минуты
Версия кода Alexej`я не по требованиям задачи: при диагональном перемещении скорость клипа будет в ~1,4 раза больше, чем при перемещении по одному направлению, вертикальному или горизонтальному.

И да. В качестве альтернативы предлагаю вам воспользоваться твинером, TweenMax`ом, к примеру. Тогда у вас будет возможность очень здорово контролировать динамику перемещения. А продолжительность перемещения легко рассчитывается исходя из расстояния для перемещения.

Если нужны примеры и пояснения — обращайтесь. Лучше тут, в теме, чем в личных сообщениях.
__________________
hauts.ru

Старый 11.03.2014, 18:47
FoxyRoxy вне форума Посмотреть профиль Отправить личное сообщение для FoxyRoxy Найти все сообщения от FoxyRoxy
  № 4  
Ответить с цитированием
FoxyRoxy

Регистрация: Sep 2012
Сообщений: 7
Спасибо за помощь! Получилось еще так, возможно где-то допущены ошибки.
Пишем в 1 кадре:
Код AS1/AS2:
speed = 5;
onMouseDown = function () {
	endx = _xmouse;
	endy = _ymouse;
};
onEnterFrame = function () {
	dx = endx-obj._x;
	dy = endy-obj._y;
	go = Math.atan2(endy-obj._y, endx-obj._x)*360/Math.PI;
	obj._x += Math.cos(go*Math.PI/360)*speed;
	obj._y += Math.sin(go*Math.PI/360)*speed;
	distance = Math.sqrt(dx*dx+dy*dy);
	if (distance<speed) {
		obj._x = endx;
		obj._y = endy;
	}
};
1.swf   (1.9 Кб)
Вложения
Тип файла: swf 1.swf (1.9 Кб, 260 просмотров)

Старый 20.03.2014, 13:49
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 5  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
FoxyRoxy, нормально получилось.

Вот только я привык кэшировать значения, чтобы не было лишних действий. 360/Math.PI лего можно один раз объявить в переменной и не делать каждый раз.
__________________
hauts.ru

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:04.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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