2014-11-22 89 views
1

我必须在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; 

回答

3

使用内置的GM-功能(此代码必须被放置在end step事件敌人的对象):

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

或:

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_stepmp_grid_...A*

P.S.当您使用这样的代码

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

你必须明白,如果是enemy_obj几个实例,然后将只

+0

为什么这个代码必须在去拍摄的第一个人(用最小的ID) end_step事件而不是只是步骤事件? – 2015-01-23 04:48:02

+0

因为所有实例在'step'事件之后和'end step'事件之前改变位置。例如,如果你的对象'obj_player'的速度为4,位置x = 0,则'step'事件的'x = obj_player.x'为0,但是'step end'事件为4.因此,如果我在step事件中执行'direction = point_direction(x,y,player_obj.x,player_obj.y)',它会使用旧的'player_obj'位置,你会看到一些延迟。 – Dmi7ry 2015-01-23 08:25:14