Просмотр полной версии : остановка вращения
greenmoon
26.07.2007, 17:13
Перерыл весь форум, не нашел.
Объект должен делать движение из одной задаваемой точки в другую (это-то не проблема), но при этом должен делать один оборот вокруг своей оси. Задача, вроде бы, простая, но он, зараза, у меня не останавливается, а продолжает вращение.
if(cl._rotation < 361) {cl._rotation += 36;}
else {cl._rotation = 0;}
var grad:Number = 0;
cl.onEnterFrame = function() {
this._rotation = grad;
grad += 36;
if (grad>=360) {
this._rotation = 0;
delete this.onEnterFrame;
}
};
greenmoon
26.07.2007, 17:37
Вращение получается строго одноразовое в таком случае, т.е. при следующем движении в контрольную точку объект cl уже не вращается. Вот полный код:
var Sym1x = sym1._x; var Sym2x = sym2._x; var Sym3x = sym3._x; // горизонтальные позиции точек
var Sym1y = sym1._y; var Sym2y = sym2._y; var Sym3y = sym3._y; // вертикальные позиции точек
var posx = 100; var posy = 100; // Начало движения объекта
var speed = 0.1; // скорость
var grad:Number = 0;
sym1.onRollOver = function ():Void {posx = Sym1x; posy = Sym1y;}
sym2.onRollOver = function ():Void {posx = Sym2x; posy = Sym2y;}
sym3.onRollOver = function ():Void {posx = Sym3x; posy = Sym3y;}
onEnterFrame = function ():Void
{
cl._rotation = grad;
grad += 36;
if (grad>=360){cl._rotation = 0; delete cl.onEnterFrame;}
if (cl._x < posx && cl._y < posy)
{
dis = Math.abs(posx - cl._x); cl._x += dis*speed;
dis = Math.abs(posy - cl._y); cl._y += dis*speed;
}
else if (cl._x > posx && cl._y > posy)
{
dis = Math.abs(posx - cl._x); cl._x -= dis*speed;
dis = Math.abs(posy - cl._y); cl._y -= dis*speed;
}
else if (cl._x > posx && cl._y < posy)
{
dis = Math.abs(posx - cl._x); cl._x -= dis*speed;
dis = Math.abs(posy - cl._y); cl._y += dis*speed;
}
else if (cl._x < posx && cl._y > posy)
{
dis = Math.abs(posx - cl._x); cl._x += dis*speed;
dis = Math.abs(posy - cl._y); cl._y -= dis*speed;
}
}
greenmoon, отредактируйте свои посты и оформите код тегами .
greenmoon
26.07.2007, 17:44
исправил сразу же, как увидел свой прокол
goarcade
26.07.2007, 18:13
за время, когда идет перемещение от одной точки к другой, объект должен повернуться ровно на 360 градусов?
greenmoon
26.07.2007, 18:18
Да. В принципе, если эта переменная будет задаваться - это не плохо, но это я уже сам вполне приконструлячу =))
goarcade
26.07.2007, 20:20
rotation = 360*t;
где t (значения от 0 до 1)- расстояние, пройденное объектом от начальной точки (A) к конечной точке(Б), деленное на длину отрезка АБ.
greenmoon
26.07.2007, 22:14
не то
если в код впихнуть еще одну переменную, это смысла не изменит
cl._rotation = grad;
grad += 36;
if (grad>=360){cl._rotation = 0; delete cl.onEnterFrame;}
ну, добавлю я еще t, а дальше что? цикл работает 1 (один) раз, когда задается новая координата и объект перемещается, он уже второй раз не вращается - в этом задача и смысл вопроса
goarcade
26.07.2007, 23:37
как тебе вот такой код?:)
var target:MovieClip = sym1;
var tempTarget:MovieClip = target;
speed=0.1
t=0;posx0 = cl._x;posy0 = cl._y;posr0 = cl._rotation;
posr0 = (posr0-Math.floor(posr0/360)*360)-360;
sym1.onRollOver = function ():Void {target = this}
sym2.onRollOver = function ():Void {target = this}
sym3.onRollOver = function ():Void {target = this}
onEnterFrame = function ():Void
{
if(target!=tempTarget)
{
tempTarget=target;
t=0;posx0 = cl._x;posy0 = cl._y;posr0 = cl._rotation;
posr0 = (posr0-Math.floor(posr0/360)*360)-360;
}
t+=speed;
if(t>1)t=1;
var dx:Number = target._x-posx0;
var dy:Number = target._y-posy0;
cl._x = posx0+dx*t;
cl._y = posy0+dy*t;
cl._rotation=posr0+(360-posr0)*t;
}
_rotation - это геттер/сеттер, оно не може быть больше 180 и меньше -180
_rotation = 181;
trace( _rotation ); // -179
Так что добавьте мувику свойство, отвечающее за поворот, и управляйте через него.
// черточка и табло
mc = createEmptyMovieClip('mc', 1);
mc.lineStyle( 5, 0xFF0000 );
mc.lineTo( 0, 100 );
mc._x = Stage.width/2;
mc._y = Stage.height/2;
var xpoz = Stage.width;
a_txt = createTextField( 'a_txt', 2, xpoz - 20, 10, 10, 10 );
a_txt.autoSize = 'right';
r_txt = createTextField( 'r_txt', 3, xpoz - 20, 30, 10, 10 );
r_txt.autoSize = 'right';
////////////////////////////////////////////////
// задаем геттер
function getAngle(){
return this.__angle || this._rotation;
}
function setAngle(val){
this.__angle = val;
this._rotation = val;
}
mc.addProperty( "angle", getAngle, setAngle );
/////////////////////////////////////////////////
// смотрим как работает
w = 10;
stopped = true;
function rotateMC(){
mc.angle += w;
if(mc.angle > 720 || mc.angle < -720 ) w *= -1;
a_txt.text = mc.angle;
r_txt.text = mc._rotation;
}
function onMouseDown(){
onEnterFrame = stopped ? rotateMC : null;
stopped = !stopped;
}
onMouseDown();
greenmoon
27.07.2007, 14:42
Не в чистом виде, но помогло.
Спасибо!
2Kikasso:
Огромный респект!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.