Так как же передвинуть танк на игровом поле? Все движения в игре, будь то движение танка, или направление башни, осуществляется с помощью векторов. Вектор проще всего представить в виде отрезка, который указывает в определенную сторону, а значит мы будем указывать не место, куда хотим передвинуть танк, а направление движения (как на настоящем джойстике). Вот, что вам потребуется:
Здесь все просто: в функцию, в которой вы реализовываете всю логику вашего бота, приходит объект: world
, у которого есть поле: objects
, представляющее собой массив из всех существующих объектов в текущий тик. В этом массиве вам предстоит разыскать ваш танк, у которого будет type
: “player” и user
: имя, которое вы указали при авторизации.
Так же, здесь в objects
, вы можете найти полезную информацию о всех объектах на карте. Главное помните, что type
: "player"
- это танк, type
: "shell"
- выпущенный снаряд, а type
: "bonus"
- бонусы, периодически появляющиеся на поле.
Могут быть любые интересующие вас координаты: координаты бонуса, координаты соперника, центр поля или самая удаленная точка от ваших противников. Все зависит от того, какую цель вы преследуете. Помните, что в objects
много полезной для вас информации.
move-xy
= [x2-x1, y2-y1] - и вы двигаетесь в нужном направлении
function getDirection(start_xy, destination_xy) {
return [destination_xy[0] - start_xy[0], destination_xy[1] - start_xy[1]];
}
А вот и обещанные функции, которые решают некоторые математические задачи:
Функция принимает два массива с координатами точек начала [x1, y1] и конца [x2, y2] отрезка и возвращает длину отрезка:
function getDistanceBetweenTwoPoints(start_xy, destination_xy) {
var x = Math.abs(start_xy[0] - destination_xy[0]);
var y = Math.abs(start_xy[1] - destination_xy[1]);
return Math.sqrt((Math.pow(x, 2) + Math.pow(y, 2)));
}
Функция принимает координаты двух векторов [x1, y1] и [x2, y2] (не путать с координатами точек) и возвращает угол между ними. Координаты вектора вы уже научились находить (см. выше ф-цию getDirection()).
function getAngleBetweenTwoVectors(vector_a, vector_b) {
var scalarMultiply = vector_a[0] * vector_b[0] + vector_a[1] * vector_b[1];
var abs_a = Math.sqrt(Math.pow(vector_a[0], 2) + Math.pow(vector_a[1], 2));
var abs_b = Math.sqrt(Math.pow(vector_b[0], 2) + Math.pow(vector_b[1], 2));
var cos_angle = scalarMultiply / (abs_a * abs_b);
return Math.acos(cos_angle) * 180 / Math.PI;
}
Эта непростая функция принимает координаты начальной и конечной точек для каждой из двух прямых и выдает координату точки их пересечения, если такая имеется и false в случае если прямые не пересекаются. Таким образом, вам нужно будет передать в функцию четыре массива с координатами и проанализировать результат.
function checkLineIntersection(line1_start, line1_end, line2_start, line2_end) {
var denominator = ((line2_end[1] - line2_start[1]) * (line1_end[0] - line1_start[0])) - ((line2_end[0] - line2_start[0]) * (line1_end[1] - line1_start[1]));
if (denominator == 0) {
return false;
}
var a = line1_start[1] - line2_start[1];
var numerator1 = ((line2_end[0] - line2_start[0]) * a) - ((line2_end[1] - line2_start[1]) * b);
a = numerator1 / denominator;
var x = line1_start[0] + (a * (line1_end[0] - line1_start[0]));
var y = line1_start[1] + (a * (line1_end[1] - line1_start[1]));
return [x, y];
}