我正在使用 ggez 与一些朋友一起制作游戏,并且我试图让我们的角色始终旋转以面对指针。到目前为止,我知道我需要以弧度获得角度值(f32),我想我可以使用 atan2 来获得这个(?)但是,我只是没有得到我想要的行为。
这是我的代码:(顺便说一句,move_data 是一个保存玩家角色值的结构,例如位置、速度、角度和旋转速度)。
let m = mouse::position(ctx);
move_data.angle = ((m.y - move_data.position.y).atan2(move_data.position.x - m.x)) * (consts::PI / 2.0) as f32;
我认为我已经接近了,因为我已经能够用它来旋转角色,但只能以一种“不完整”的方式。当我将鼠标移到那里时,玩家角色(pc)大多只能面向左上角。否则,如果指针在 pc 的右侧和/或下方,它会以非常缓慢和轻微的方式旋转,并停止面向指针。不知道这个描述有没有道理。
我认为问题在于我不完全确定 atan2 首先在做什么(我只记得一些基本的三角函数),而且我也不确定我是否正确使用它,所以我不完全知道我的代码在做什么。(这是我用于 atan2 的文档:https ://doc.rust-lang.org/std/primitive.f64.html#method.atan2 )
经过多次试验和错误后,我才到此为止,尽可能多地使用谷歌搜索(大多数 Unity 教程结果在寻找基于我的代码的算法时出现),我还在非官方的 Rust 社区 Discord 服务器中询问过,但到目前为止没有任何效果。
我之前也有这段代码,但也找不到如何让它工作。
let m = mouse::position(ctx); // Type Point2
let mouse_pos = Vector2::new(m.x, m.y); // Transformed to Vector2 to be read by Matrix
move_data.angle = Matrix::angle(&mouse_pos, &move_data.position);