根据其他对象的位置在圆周上绘制精灵

Posted

技术标签:

【中文标题】根据其他对象的位置在圆周上绘制精灵【英文标题】:Drawing a sprite on the circumference of a circle based on the position of other objects 【发布时间】:2021-12-04 21:49:40 【问题描述】:

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

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

//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;

【问题讨论】:

【参考方案1】:

您当前的代码稍微复杂一些,因此需要这样做,如果您想绘制指向所有敌人的 V 形,您不妨在 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 加到正弦/余弦而不是乘以它 尝试对sSpr_Chevron (?) 应用角度,而不是使用 draw_sprite_ext 来绘制旋转的精灵。 根据执行实例的 X/Y 而不是增量 X/Y 计算 largest_distance

【讨论】:

以上是关于根据其他对象的位置在圆周上绘制精灵的主要内容,如果未能解决你的问题,请参考以下文章

pygame 的精灵使用

Fabricjs根据内部对象的对象边界矩形上的鼠标位置进行选择或悬停

在不使用点精灵的情况下在屏幕上的不同点渲染多个纹理

飞机大战

我的OpenGL学习进阶之旅介绍一下 图元的类型:三角形直线和点精灵

canvas怎么根据坐标获取上面的内容