PDA

Просмотр полной версии : остановка вращения


greenmoon
26.07.2007, 17:13
Перерыл весь форум, не нашел.
Объект должен делать движение из одной задаваемой точки в другую (это-то не проблема), но при этом должен делать один оборот вокруг своей оси. Задача, вроде бы, простая, но он, зараза, у меня не останавливается, а продолжает вращение.

if(cl._rotation < 361) {cl._rotation += 36;}
else {cl._rotation = 0;}

CGandA
26.07.2007, 17:25
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;
}
}

etc
26.07.2007, 17:39
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;
}

Kikasso
27.07.2007, 02:23
_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:
Огромный респект!