PDA

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


Wadimir
19.11.2009, 18:19
Добрый день!

У меня не получается сделать такое управление мувиком:
Есть кнопки вперёд и поворот. Нажимаем на кнопку вперёд, мувик двигается вперёд, нажимаем на кнопку поворот-мувик поворачивается на определённый градус. Нажимаем опять вперёд и мувик двигается но уже в ту сторону в которую повернулся.

Вот мой код в котором при повороте он продолжает двигаться не взирая на поворот

speed=5;
vperod.onPress = function () {
bk._y-=speed;
}

povorot.onPress = function () {
bk._rotation -=speed;
}

mooncar
19.11.2009, 18:32
Указанный код работает верно - при движении "вперед" у вас по-прежнему продолжает наращиваться координата Y. Поворот же никак не учитывается.

Wadimir
19.11.2009, 19:17
А как сделать чтоб поворот учитывался?

jony_e
20.11.2009, 19:43
тут уже нужно по формуле высчитывать. потому что мувику придется после поворота двигаться уже по диагонали. почитайте про синус(косинус) в прямоугольном треугольнике между гипотенузой и катетом :) этот угол-это начальная координата по Х и по Y. длинна прилегающего катета это длина по Х, а длина противоположного катета-это днина по Y. Тоесть если вам известен угол и длинна катета(тоесть длинна по Х) то можно вычеслить длинну другого катета и таким образом значение по Y. :)
Есть треугольник ABC угол ACB-прямой(90градусов), нам известен угол между BAC и длинна AC нужно найти длинну катета BC(это и будет координата по Y)

вот небольшая демонстрация, если мы поворачиваем объект на 45 градусов, то катеты соответственно равны и их значения =5

var oy:Number=5;
var ox:Number=0;

vperod.onPress = function () {
bk._y-=oy;
bk._x-=ox;
}

povorot.onPress = function () {
bk._rotation =45;
ox=5;
}

Wadimir
21.11.2009, 01:08
А если повторно нажать на поворот. Как тогда быть?

fessor
21.11.2009, 16:48
предлагаю реализовать все без тригонометрии ))
два мувика один вложеный в другой;
первый поворачиваем, другой двигаем
при повороте ставим едущий мувик в исходное положение (запоминаем смещение), а поворачивающийся смещаем в обратную сторону, и начинаем двигать снова

Wadimir
21.11.2009, 16:58
а если нужно чтоб поворачивался от 5 до 360 до 72 мувика надо?

mooncar
21.11.2009, 17:58
предлагаю реализовать все без тригонометрии ))
два мувика один вложеный в другой;
первый поворачиваем, другой двигаем
при повороте ставим едущий мувик в исходное положение (запоминаем смещение), а поворачивающийся смещаем в обратную сторону, и начинаем двигать снова
А как компенсировать смещение одного вложенного мувика относительно точки регистрации другого? Попробуйте реализовать то, о чем вы говорите, и поймете, о чем я.

veles2008
22.11.2009, 12:21
speed=0;
onEnterFrame=function() {
vperod.onPress = function () {
speed =5;
}
povorot.onPress = function () {
bk._rotation -=5;
}
bk._x+=speed*(Math.sin(0.0175*bk._rotation));
bk._y+=speed*(Math.cos(0.0175*bk._rotation));
speed*=0;
}

Wadimir
23.11.2009, 12:10
Огромное спасибо!

jony_e
23.11.2009, 13:58
На самом деле, тут все не так уж и просто потому, что во флеше _rotation имеет диапозон от 0 до 180 и от -180 до 0, а не 360 градусов как мы привыкли :) таким образом угол 190 градусов во флеше будет равен -170 градусов.
во флеше измерение идет не в градусах, а в радианах.
Проще всего высчитывать длину по Х через тангенс.

var a:Number=0;
var b:Number=5;
vperod.onPress = function () {
if(bk._rotation>0 and bk._rotation<90){
bk._y+=b;
bk._x-=a;
}
if(bk._rotation>90 and bk._rotation<180){
bk._y-=b;
bk._x+=a;
}
if(bk._rotation>-180 and bk._rotation<-90){
bk._y-=b;
bk._x+=a;
}
if(bk._rotation>-90 and bk._rotation<0){
bk._y+=b;
bk._x-=a;
}

povorot.onPress = function () {
bk._rotation +=10; // можно изменять угол поворота и играться с ним, а так-же можно сделать еще одну кнопку которая будет поворачивать объект в другую сторону :)
a=b*Math.tan(bk._rotation*(Math.PI/180)); // универсальная формула не привязанная к определенному углу, как в предыдущем примере.
}

для углов равных (0,-0,90,-90,180,-180) было лень писать проверки :) допишите сами :)