首页 > 解决方案 > 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),))?;

对于矩形,x,和在创建矩形时传递,但y需要X/Y 坐标:widthheightgraphics::draw

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),))?;

为什么两个坐标都需要?

标签: rustgame-development

解决方案


来自ggez 库的作者

区别在于它是在网格的坐标空间中还是在屏幕的坐标空间中。对不起,重言式的答案,让我看看我是否可以做得更好......

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

所以你可以用这两种方法实现完全相同的东西,但我想说这draw()对位置操作更好。


推荐阅读