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

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

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

Регистрация: Jul 2011
Сообщений: 2
Question Вращение за курсором

Практически недавно начал изучать ас3.
И встал перед такой проблемой, к которой не смог найти решения в гугле О_О

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

Для плавного вращения я использовал greensock'овские твины.
получилось так:
Код AS3:
//ЕнтерФрейм
private function eFrame(e:Event) {
   var angle:Number;
   angle=Math.atan2(mouseY+291,mouseX)*180/Math.PI;
   TweenLite.to(logo.gear, 0.5, {rotation:angle, overwrite:1});
   TweenLite.to(bigGear, 0.5, {rotation:-angle/2, overwrite:1});
   TweenLite.to(gearNG.gear, 0.5, {rotation:-angle*2, overwrite:1});
   TweenLite.to(gearLvl.gear, 0.5, {rotation:-angle*2, overwrite:1});
   TweenLite.to(gearHS.gear, 0.5, {rotation:-angle*2, overwrite:1});
}
в результате при прохождении 180-и градусов все твинится не так как надо, а маленькие шестерёнки ещё раньше.

получается как-то так
http://forhaxed.ru/problem.php

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

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

Регистрация: Dec 2006
Адрес: 66°32′00″ с. ш. 66°38′00″ в. д.
Сообщений: 85
Код AS3:
if (angle - mc.rotation > 180) angle -= 360;
вроде бы примерно так

Старый 05.07.2011, 20:29
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 3  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
В этом случае, при достижении нуля все будет так же. Это не выход. Там нужен код посложнее.
Я вот так расчитывал вращение башни танка за курсором:
Код AS3:
		// расчет плавного вращения башни в сторону курсора >>>>
		var mouseXpos:Number = this.parent.mouseX;
		var mouseYpos:Number = this.parent.mouseY;
 
		var angleToMouse:Number = Math.atan2(mouseYpos - this.y, mouseXpos - this.x) * Globals.RAD_TO_DEG + 90;
		if (angleToMouse >= 180 && angleToMouse <= 270) {
			angleToMouse -= 360;
		}
		if (angleToMouse < 0 && angleToMouse > -180) {
			angleToMouse += 360;
		}
		var vehRotation:Number = this.rotation;
		if (vehRotation < 0 && vehRotation > -180) {
			vehRotation += 360;
		}
		var turretRot:Number = this.mTurret.rotation;
		if (turretRot < 0 && turretRot > -180) {
			turretRot += 360;
		}
		var turretGlobal:Number = turretRot + vehRotation;
		if (turretGlobal >= 360) {
			turretGlobal -= 360;
		}
		else if (turretGlobal < 0) {
			turretGlobal += 360;
		}
		if (turretGlobal >= 270 && turretGlobal <= 360) {
			if (angleToMouse >= 0 && angleToMouse <= 90) {
				turretGlobal -= 360;
			}
		}
		if (turretGlobal >= 0 && turretGlobal <= 90) {
			if (angleToMouse <= 360 && angleToMouse >= 270) {
				turretGlobal += 360;
			}
		}
		// admission - это минимальный угол, при котором башня перестает двигаться, нужен для того, чтобы она не начинала дергаться при достижении нужной позиции
		var admission:Number = (turretGlobal - angleToMouse) > 0 ? (turretGlobal - angleToMouse) : (turretGlobal - angleToMouse) * -1;
		if (turretGlobal <= angleToMouse) {
			if (admission > 3)
				this.mTurret.rotation += _turretAccel;
		} else if (turretGlobal > angleToMouse) {
			if (admission > 3)
				this.mTurret.rotation -= _turretAccel;
		}
Конечно код малость мудреный, но свое дело он делал.
Там может и не быть 270, просто в моем случае башня была повернута (картинка) как бы на 90 градусов, но в коде это воспринималось как 0.

п.с. Пояснения спрашивать бесполезно, я сам уже не помню что там и зачем


Последний раз редактировалось goodguy; 05.07.2011 в 20:31.
Старый 05.07.2011, 21:05
forhaxed вне форума Посмотреть профиль Отправить личное сообщение для forhaxed Найти все сообщения от forhaxed
  № 4  
Ответить с цитированием
forhaxed

Регистрация: Jun 2009
Сообщений: 35
У автора проблема в твине.

Старый 05.07.2011, 23:55
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 5  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Что-то похожее уже было. Там забыли что у TweenMax (скачайте если что) есть плагин shortRotation, который поворачивает объект корректно в кратчайшую сторону.

Старый 06.07.2011, 00:22
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 6  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Если это правда ENTER_FRAME, то по идее
Код AS3:
//ЕнтерФрейм
private function eFrame(e:Event) {
   var angle:Number;
   angle=Math.atan2(mouseY+291,mouseX)*180/Math.PI;
   if(angle - logo.gear.rotation > 180)
      angle -= 360;//ищем кратчайший поворот
   if(logo.gear.rotation - angle > 180)
      angle += 360;//ищем кратчайший поворот
   TweenLite.to(logo.gear, 0.5, {rotation:angle, overwrite:1});
   bigGear.rotation = -logo.gear.rotation*0.5;
   gearNG.rotation = -logo.gear.rotation*2;
   gearLvl.rotation = -logo.gear.rotation*2;
   gearHS.rotation = -logo.gear.rotation*2;
}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 06.07.2011, 09:40
IRay вне форума Посмотреть профиль Отправить личное сообщение для IRay Найти все сообщения от IRay
  № 7  
Ответить с цитированием
IRay

Регистрация: Jul 2011
Сообщений: 2
Попробовал shortRotation, помогло, но большая шестерня всё равно глючила...

Попробовал то, что написал -De- помоголо на ура!)
Так что огромное спасибо)

остался небольшой глюк с большой шестерней из-за её несимметричности, но с ним я разберусь...

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

Теги
rotation , вращение , курсор , шестерёнки
Опции темы
Опции просмотра

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

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


 


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


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