创建线时,会传递点列表,但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),))?;
对于矩形,创建矩形时会传递x
、y
、width
和height
,但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()
更适合仓位操纵。