PDA

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


addertu
17.06.2011, 18:27
Здравствуйте. Делаю игрушку. Вид сверху. нажимаю и держу клавишу влево или вправо и герой медленно поворачивается влево или в право, когда отпускаю клавишу герой остается повернутым. Вопрос, как теперь сделать так чтоб при нажатии клавиши вперед герой шел именно в ту сторону в которую он повернут? Может надо использовать синус и косинус? Как заставить его туда идти в actionscript2?

warsem
19.06.2011, 16:19
а в чем сложность заключаетца? у вас есть угол поворота. Просто строите треугольник с этим углом и находите X и Y. Дальше меняете координаты героя на эти X и Y.
Хороший чертеж на бумаге вам поможет всё понять.

addertu
19.06.2011, 19:36
а в чем сложность заключаетца? у вас есть угол поворота. Просто строите треугольник с этим углом и находите X и Y. Дальше меняете координаты героя на эти X и Y.
Хороший чертеж на бумаге вам поможет всё понять.
Ничего не понял. Я написал код. в нем обект двигается какрас так как мне надо но он не поворачивается лицом в ту сторону в которую двигается. как его заставить это делать? Вот код:

onClipEvent(load) {
var povorot=0;
var go=0;
var obj1x=_root.obj1._x;
var obj1y=_root.obj1._y;
}

onClipEvent(enterFrame) {

_root.povVLevo.onRelease = function() {
povorot-=0.3;
}

_root.povVPravo.onRelease = function() {
povorot+=0.3;
}

_root.vpered.onRelease = function() {
go+=1;
}

_root.nazad.onRelease = function() {
go-=1;
}

var angle:Number=povorot;//задать значение
var distance:Number=go;//задать значение
var dirx:Number=Math.cos(angle);
var diry:Number=Math.sin(angle);
obj1x+=distance*dirx;
obj1y+=distance*diry;

_root.obj1._x=obj1x;
_root.obj1._y=obj1y;
//_root.obj1._rotation=povorot;

}

arisman
20.06.2011, 13:58
_root.obj1._rotation= povorot ...

А там радианы в градусы переведены?

Я не очень силён в математики, школьную программу не помню, но в моём случае это было
180 / Math.PI * Math.acos(радианы) .
только там были отдельные проблемы, возможно из за неверной формулы с местами, где поворот от 90 до 180 и 270 - 360 ... Всё решил ...

addertu
22.06.2011, 09:51
_root.obj1._rotation= povorot ...

А там радианы в градусы переведены?

Я не очень силён в математики, школьную программу не помню, но в моём случае это было
180 / Math.PI * Math.acos(радианы) .
только там были отдельные проблемы, возможно из за неверной формулы с местами, где поворот от 90 до 180 и 270 - 360 ... Всё решил ...

Я не совсем понял твой ответ. куда вписывать строку 180 / Math.PI * Math.acos(радианы)? Можешь исправить вылаженный мной код так чтоб все заработало и объект смотрел в сторону поворота?

Я поставил в самом конце строку _root.obj1._rotation=povorot; но объект почемуто вертится на меньшее значение чем поворачивается.

arisman
22.06.2011, 14:36
Извини, не могу проверить. Попробуй след.

_root.obj1._rotation = ( 180 / Math.PI ) * Math.acos(povorot);

У меня возникли небольшие проблемы в 2 и 3-ем квадранте (просто на некоторых участках поворот был немного другой) ... Но у меня скорее всего было не из за формулы, да и проблема уже решается механически.

addertu
22.06.2011, 15:19
Извини, не могу проверить. Попробуй след.

_root.obj1._rotation = ( 180 / Math.PI ) * Math.acos(povorot);

У меня возникли небольшие проблемы в 2 и 3-ем квадранте (просто на некоторых участках поворот был немного другой) ... Но у меня скорее всего было не из за формулы, да и проблема уже решается механически.

У меня это почемуто не корректно работает. После определенного угла перестает поворачиваться. А как ты думаешь вот этот вариант точно вычесляет нужный угол: _root.obj1._rotation=povorot*180/Math.PI;?

arisman
22.06.2011, 15:53
эта формула
( 180 / Math.PI ) * Math.acos(povorot);

перевод из радиан в градусы.

Параметрами тригонометрических функций (cos sin тангенс котангенс и арк косинус, ....) в AS являются радианы ... поэтому povorot - это у тебя не градусы, а радианы...

У меня была проблема я искал угол между двумя векторами ... Я её решил условиями
Если в таком то квадранте, то
180 - поворот; ( то есть ( 180 / Math.PI ) * Math.acos(povorot);)
если в таких то квадрантах, то -1 * поворот (( 180 / Math.PI ) * Math.acos(povorot);)

До конца я сам не понял почему не работают некоторые квадранты, то есть что то понятно сразу стало, а что то до сих пор не могу понять .... Просто подгонял ... И подгонял только 2мя операциями
либо 180 - поворото, либо -1 * поворот.

Добавлено через 5 минут
public static acos(x:Number) : Number

Computes and returns the arc cosine of the number specified in the parameter x, in radians.

Availability: ActionScript 1.0; Flash Player 5 - In Flash Player 4, the methods and properties of the Math class are emulated using approximations and might not be as accurate as the non-emulated math functions that Flash Player 5 supports.

Parameters
x:Number - A number from -1.0 to 1.0.


ты как нибудь учитываешь, промежуток от -1 до 1 ... как я понял в твоем коде просто прибавляется (+0,3)