根据其他物体的位置在圆周上绘制精灵
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
我正在 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