根据其他物体的位置在圆周上绘制精灵

Drawing a sprite on the circumference of a circle based on the position of other objects

我正在 Gamemaker Studio 2 中制作狙击手射击街机风格的游戏,我希望视口外的目标位置由 V 字形指向, V 字形在范围移动时沿着范围的圆周移动。我正在使用三角技术来确定坐标,但人字形在四处跳跃,似乎没有指向目标。我将代码分为两部分:用于确定敌人 class(将指向的对象)步进事件中的坐标的代码和同一 class 中的绘制事件。此外,当我尝试旋转人字形使其也指向敌人时,它根本不绘制。

这里分别是坐标算法和绘制人字形的代码

//determine the angle the target makes with the player
delta_x = abs(ObjectPlayer.x - x);  //x axis displacement
delta_y = abs(ObjectPlayer.y - y);  //y axis displacement
angle = arctan2(delta_y,delta_x);   //angle in radians
angle *= 180/pi                     //angle in radians

//Determine the direction based on the larger dimension and 
largest_distance = max(x,y);
plusOrMinus = (largest_distance == x)?
sign(ObjectPlayer.x-x) : sign(ObjectPlayer.y-y);

//define the chevron coordinates
chevron_x = ObjectPlayer.x + plusOrMinus*(cos(angle) + 20);
chevron_y = ObjectPlayer.y + plusOrMinus*(sign(angle) + 20);

绘图代码

if(object_exists(ObjectEnemy)){
    draw_text(ObjectPlayer.x, ObjectPlayer.y-10,string(angle));
    draw_sprite(Spr_Chevron,-1,chevron_x,chevron_y);
    //sSpr_Chevron.image_angle = angle;
}

您当前的代码比它需要的稍微复杂一些,如果您想绘制指向所有敌人的人字形,您不妨在 Draw 中当场完成。如果无论如何都需要度数进行绘图,请使用基于度数的函数

var px = ObjectPlayer.x;
var py = ObjectPlayer.y;
with (ObjectEnemy) {
    var angle = point_direction(px, py, x, y);
    var chevron_x = px + lengthdir_x(20, angle);
    var chevron_y = py + lengthdir_y(20, angle);
    draw_sprite_ext(Spr_Chevron, -1, chevron_x, chevron_y, 1, 1, angle, c_white, 1);
}

(另请参阅:我将近十年的 blog post 关于在夹紧屏幕边缘时执行此操作的方法)

您现有代码的具体问题是:

  • 用单轴plusOrMinus配两轴
  • 将 20 加到 sine/cosine 而不是将它们乘以它
  • 尝试将角度应用于 sSpr_Chevron (?) 而不是使用 draw_sprite_ext 来绘制旋转的精灵。
  • 正在根据执行实例的 X/Y 而不是增量 X/Y.
  • 计算 largest_distance