Переместить объект в направлении

Мне нужно работать в Game Maker для этого проекта, и я хочу переместить объект к другому объекту. Это то, что я получил до сих пор. Кто-нибудь знает, что я делаю неправильно? Враг теперь вращается вокруг игрока.

draw_sprite(sprite_index,image_index,x,y);
moveSpeed = 1;
angle = arctan2(enemy_obj.x - player_obj.x, enemy_obj.y - player_obj.y);
enemy_obj.x += cos(angle) * moveSpeed;
enemy_obj.y -= sin(angle) * moveSpeed;

person Mike Ottink    schedule 22.11.2014    source источник


Ответы (1)


Используйте встроенные GM-функции (этот код необходимо разместить в событии end step вражеского объекта):

angle = point_direction(x, y, player_obj.x, player_obj.y);
x += lengthdir_x(moveSpeed, angle);
y += lengthdir_y(moveSpeed, angle);

or:

direction = point_direction(x, y, player_obj.x, player_obj.y);
if point_distance(x, y, player_obj.x, player_obj.y) > 10 // min distance
{
    speed = moveSpeed;
}

Или вы можете использовать функции планирования движения, такие как mp_potential_step или mp_grid_... для A*.

P.S. Когда вы используете такой код

angle = arctan2(enemy_obj.x - player_obj.x, enemy_obj.y - player_obj.y);

вы должны понимать, что если экземпляров enemy_obj несколько, то будет взят только самый первый из них (с наименьшим id)

person Dmi7ry    schedule 23.11.2014
comment
Почему этот код должен идти в событии end_step, а не только в событии шага? - person Mark Hetherington; 23.01.2015
comment
Потому что все экземпляры меняют позиции после события step и до события end step. Например, если ваш объект obj_player имеет скорость 4 и положение x=0, тогда x = obj_player.x для события step будет 0, а для события step end будет 4. Поэтому, если я сделаю direction = point_direction(x, y, player_obj.x, player_obj.y) в событии step, он будет использовать старую позицию player_obj и вы увидите некоторую задержку. - person Dmi7ry; 23.01.2015