使用ggez绘制Rectangle无法显示在画布上的技术问题
解决ggez绘制黑色矩形不显示的问题
针对你遇到的矩形无法显示、仅看到白色画布的问题,结合代码分析,可从以下几个方向排查并修复:
1. 先验证基础渲染是否正常
临时修改代码,绘制一个固定位置的大矩形,确认渲染流程没问题:
fn draw(&mut self, ctx: &mut ggez::Context) -> GameResult { let mut canvas = graphics::Canvas::from_frame(ctx, Color::WHITE); // 绘制一个位于(50,50)、尺寸100x100的黑色矩形 let rect = Mesh::new_rectangle( ctx, DrawMode::fill(), Rect::new(50.0, 50.0, 100.0, 100.0), Color::BLACK, )?; canvas.draw(&rect, DrawParam::default()); canvas.finish(ctx)?; Ok(()) }
如果这个矩形能显示,说明你的循环逻辑或坐标计算有问题;如果还是不显示,再检查窗口配置或ggez初始化是否正确。
2. 排查坐标与可视范围
- 检查
CELL_SIZE是否过小:如果CELL_SIZE的值比如是1.0x1.0,矩形会小到几乎看不见,可临时调大数值测试。 - 检查
GRID_SIZE * CELL_SIZE是否超过窗口尺寸:如果计算出的矩形坐标超出了窗口范围,自然无法显示,可打印几个i*CELL_SIZE.0和j*CELL_SIZE.1的值,确认是否在窗口宽高范围内。
3. 改用MeshBuilder批量创建矩形
循环中反复创建单个Mesh可能触发隐藏的渲染问题,改用MeshBuilder批量构建所有矩形的合并Mesh,既提升性能也能规避此类问题:
fn draw(&mut self, ctx: &mut ggez::Context) -> GameResult { let mut canvas = graphics::Canvas::from_frame(ctx, Color::WHITE); let mut mesh_builder = graphics::MeshBuilder::new(); for i in 0..GRID_SIZE.0 { for j in 0..GRID_SIZE.1 { if self.grid[i][j] { mesh_builder.rectangle( DrawMode::fill(), Rect::new( i as f32 * CELL_SIZE.0, j as f32 * CELL_SIZE.1, CELL_SIZE.0, CELL_SIZE.1, ), Color::BLACK, )?; } } } let rect_mesh = mesh_builder.build(ctx)?; canvas.draw(&rect_mesh, graphics::DrawParam::default()); canvas.finish(ctx)?; Ok(()) }
4. 确认视图投影设置
如果你的窗口坐标系统有自定义需求,可显式设置Canvas的投影矩阵,确保矩形在可视范围内:
let (win_w, win_h) = graphics::drawable_size(ctx); // 设置正交投影,Y轴向下适配ggez默认坐标 canvas.set_projection(graphics::Transform::orthographic(0.0, win_w, win_h, 0.0));
内容的提问来源于stack exchange,提问作者sobek
相关产品推荐
相关产品推荐

