网格坐标和绘制坐标在 ggez 库中如何相互关联?



创建线时,会传递点列表,但graphics::draw需要 X/Y 坐标:

let (origin, dest) = (Point::new(0.0, 0.0), Point::new(0.0, 0.0));
let line = graphics::Mesh::new_line(ctx, &[origin, dest], 2.0, graphics::WHITE)?;
graphics::draw(ctx, &line, (Point2::new(0.0, 0.0),))?;

对于矩形,创建矩形时会传递xywidthheight,但graphics::draw需要 X/Y 坐标:

let rectangle = graphics::Mesh::new_rectangle(
ctx,
graphics::DrawMode::fill(),
[0.0, 0.0, 30.0, 30.0].into(),
graphics::WHITE,
)?;
graphics::draw(ctx, &rectangle, (Point::new(0.0, 0.0),))?;

为什么需要两个坐标?

来自 ggez 库的作者:

区别在于它是在网格的坐标空间中还是在屏幕的坐标空间中。对不起,同义重复的答案,让我看看我能不能做得更好......

创建网格时,假设您正在一张透明方格纸上绘制点。这就是网格坐标系。然后当你打电话给graphics::draw()时,你把它放在另一张方格纸上,你传递给draw()的坐标就是你把两者偏移了多少。但它不仅仅是一个偏移,draw()采用可以旋转、缩放等网格坐标系的选项。如果只是创建网格,使其以50,50为中心,然后旋转它,则默认情况下,它将围绕其0,0点旋转,而不是网格的中心。如果创建网格使其以0,0坐标为中心,则默认情况下,旋转或缩放网格将从其自己的中心开始。DrawParam::offset()参数可以控制"中心"点的位置,但这仍然有点痛苦。

因此,您可以使用这两种方法实现完全相同的目标,但我想说draw()更适合仓位操纵。

最新更新