#flash
#вспышка
Вопрос:
Недавно я смотрел флеш-видео: «Lynda.com — Проекты ActionScript 3.0: разработка игр» с Тоддом Перкинсом.
Прошлый урок был «создание флеш-танковой игры». Я следил за ходом событий и создал точно такую же игру, которая была описана в уроке.
Но в примере урока у вражеского танка не было искусственного интеллекта спуска. Враг двигался и стрелял случайным образом, и, похоже, играть в эту игру было не очень весело.
Я решил сделать искусственный интеллект более совершенным. Мне удалось заставить врага изменить направление движения, если в него попал игрок.
Если враг успешно попадает в игрока, он останавливается и продолжает стрелять в игрока под тем же углом и с той же позиции, пока он не промахнется или не получит удар от игрока.
Проблема в том, что формула для расчета правильного угла прицеливания недостаточно правильная. Враг вроде бы стреляет правильно, но все равно часто промахивается.
Итак, вот формула, которую я использовал:
enemyTargetRotation=Math.asin(Math.abs(enemy_mc.y - player_mc.y)/(Math.sqrt(Math.pow(player_mc.x - enemy_mc.x, 2) Math.pow((enemyWall_mc.height - stage.height),2)))/180*Math.PI);
enemyTargetRotation*=10000;
enemyTargetRotation =180;
Ответ №1:
Почему бы просто не Math.atan2(y2 - y1, x2 - x1) / Math.PI * 180
? Она должна указывать угол стрельбы в градусах с учетом координат танка x1, y1 и x2, y2 координат цели.
Комментарии:
1. Хм, проблема в том, что вражеский танк стоит на возвышенности. И пули, которые выпускают танки, летят не по прямой, а по параболе. Вы можете проверить исходный код, чтобы убедиться megaupload.com/?d=CH48PEML
2. Ну тогда надо уравнение параболы решать. Угол — неизвестная, начало в своем танке, должна пересекать чужой. ido.tsu.ru/schools/physmat/data/res/virtlab/text/m2_1.html
3. ээээ… но там в уравнении параболы, что-то типа y=x*tg(a) — x^2/(2*v^2-cos^2(a))… Так вот нужный угол а и под тангенсом и под косинусом как его найти? я не очень силён в тригонометрии… надо как-то из тангенса получить косинус?
4. Так… tg(x)=sin(x)/cos(x), но там во второй части cos^2(x). А cos^2(x)=1/2 1/2*cos(2x). пытался решить, но там получилось какое-то моструозное выражение. Я понял, что я не знаю как сократить cos(2x)/cos(x). и это точно не cos(x) :)) В общем я в тупике.
5. я сам не спец по этим косинусам, но любое уравнение можно решить численным методом — найти угол недолета и перелета, а потом делить их пополам, пока не попадешь. За несколько итераций должно сойтись.