PDA

Просмотр полной версии : Вопрос по вращению объектов


optemus
28.12.2011, 12:34
Вопрос следующий:
Есть круговая шкала на ней 12 цифр. Все это необходимо вращать, сохраняя читабельность цифр
Поясняю: деления шкалы вращаются почасовой и против часовой стрелки при этом цифры также вращаются и всегда должны сохранять вертикальное (читабельное) положение относительно оси Y
Вот графический пример (написан на делфи 7)
До
http://imglink.ru/show-image.php?id=742178c24e70c99419ca59dbc8cb780e
После
http://imglink.ru/show-image.php?id=baff22588bb3b3979e246a71a7ad8524
А вот как подобное реализовать в Флеше CS5 не знаю.

Jewelz
28.12.2011, 12:40
цифры вам не вращать нужно а перемещать (синус, косинус в помощь)

или можно вращать весь контейнер (с делениями и цифрами) а потом отдельно каждую цифру назад

optemus
28.12.2011, 13:18
вот только как создать такой кантейнер я не знаю.

goodguy
28.12.2011, 13:27
Да, собственно, он и нафиг не нужен. Можно легко обойтись без вышеуказанного контейнера.
Вот, по-быстренькому набросал пример класса, который крутит циферблат без вращения цифр.

package {
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
/**
* ...
* @author Серов Константин
*/
public class DigitsRotation extends Sprite {

private var _angleStep: int = 360 / 12;
private var _faceRadius: Number = 100;
private var _allDigits: Vector.<TextField> = new Vector.<TextField>();
private var _initialAngle: int = 0;
private var _increment: Number = 1;
private var _cX: Number;
private var _cY: Number;
private var _degRad: Number = Math.PI / 180;

public function DigitsRotation() {
_cX = stage.stageWidth / 2;
_cY = stage.stageHeight / 2;
positionDigits();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}

private function onEnterFrame(e:Event):void {
_initialAngle += _increment;
for (var i:int = 0; i < _allDigits.length; i++) {
_allDigits[i].x = _cX + Math.cos((_initialAngle + (i * _angleStep)) * _degRad) * _faceRadius;
_allDigits[i].y = _cY + Math.sin((_initialAngle + (i * _angleStep)) * _degRad) * _faceRadius;
}
}

private function positionDigits():void {
for (var i:int = 1; i < 13; i++) {
var tf:TextField = new TextField();
tf.text = String(i);
tf.x = _cX + Math.cos((_initialAngle + (i * _angleStep)) * _degRad) * _faceRadius;
tf.y = _cY + Math.sin((_initialAngle + (i * _angleStep)) * _degRad) * _faceRadius;
_allDigits.push(tf);
addChild(tf);
}
}
}
}


Надеюсь идея ясна

optemus
28.12.2011, 15:51
увы ошибка
Монтажный кадр 1, слой "Слой 1", кадр 1, строка 2 1037: Пакеты не могут быть вложенными.
видемо не умею пользоваться подобным кодом

Jewelz
28.12.2011, 15:55
это код класса

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

optemus
28.12.2011, 15:55
данный цифирблать лишь 1 из 7 и 5 уже написаны в моем случаее необходимо большую часть рисовать вручную и объеденять пакеты с заранее отрисованным и анимированным содержимом я увы не умею

Добавлено через 32 минуты
увы моих познаний в флаш явно не достаточно чтобы разобраться как работает код выше

goodguy
28.12.2011, 17:01
Увы, тогда тут мы вряд ли чем поможем

GBee
28.12.2011, 17:02
Так подучите, код свыше очень простой и почти красивый, если бы не адские табуляции :о)))

goodguy
28.12.2011, 17:07
если бы не адские табуляции :о)))
Ога, тут уродливо почему-то добавляется. В оригинале красиво и ровно :D

GBee
28.12.2011, 17:27
Могу еще про египетские скобки каку сказать, но не буду :о)))))