使用piston_window打印文本异常:仅显示‘1’而非‘10’求助
问题:piston_window输出字符串"10"仅显示"1"
我在使用piston_window库打印文本时遇到问题,尝试输出字符串‘10’,但界面仅显示‘1’。以下是相关代码:
use piston_window::types::Color; use piston_window::{text, Context, G2d, Glyphs, Transformed}; pub const TEXT_COLOR: Color = [1.0, 1.0, 1.0, 1.0]; pub fn main() { let assets = find_folder::Search::ParentsThenKids(3, 3) .for_folder("assets") .unwrap(); let ref font = assets.join("retro-gaming.ttf"); let factory = window.factory.clone(); let mut glyphs = Glyphs::new( font, TextureContext { factory, encoder: window.factory.create_command_buffer().into(), }, TextureSettings::new(), ) .unwrap(); let mut window: PistonWindow = WindowSettings::new("test", [30, 30]) .resizable(false) .exit_on_esc(true) .build() .unwrap_or_else(|e| panic!("Failed to build Window: {}", e)); while let Some(event) = window.next() { window.draw_2d(&event, |ctx, g, _| { text::Text::new_color(TEXT_COLOR, 20) .draw( "10", &mut glyphs, &ctx.draw_state, ctx.transform.trans(0.0, 20.0), g, ) .unwrap(); }); } }
问题分析
- 窗口尺寸不足:你设置的窗口大小为
[30, 30],但字体大小设为20,字符串"10"的整体宽度超过了窗口的30像素限制,导致第二个字符被窗口边界裁剪,只显示出第一个字符。 - 代码顺序错误:你在创建
glyphs时提前引用了window.factory,但window是在这之后才初始化的,这会直接导致编译失败,必须调整创建顺序。
修正后的代码
use piston_window::types::Color; use piston_window::{text, Context, G2d, Glyphs, PistonWindow, TextureContext, TextureSettings, WindowSettings}; pub const TEXT_COLOR: Color = [1.0, 1.0, 1.0, 1.0]; pub fn main() { let assets = find_folder::Search::ParentsThenKids(3, 3) .for_folder("assets") .unwrap(); let ref font = assets.join("retro-gaming.ttf"); // 先创建窗口,确保factory可被正确引用 let mut window: PistonWindow = WindowSettings::new("test", [100, 50]) // 增大窗口尺寸以容纳文本 .resizable(false) .exit_on_esc(true) .build() .unwrap_or_else(|e| panic!("Failed to build Window: {}", e)); // 基于已创建的窗口初始化glyphs let factory = window.factory.clone(); let mut glyphs = Glyphs::new( font, TextureContext { factory, encoder: window.factory.create_command_buffer().into(), }, TextureSettings::new(), ) .unwrap(); while let Some(event) = window.next() { window.draw_2d(&event, |ctx, g, _| { text::Text::new_color(TEXT_COLOR, 20) .draw( "10", &mut glyphs, &ctx.draw_state, ctx.transform.trans(10.0, 30.0), // 微调位置避免文本贴边 g, ) .unwrap(); }); } }
修改说明
- 增大窗口尺寸至
[100, 50],确保足够显示完整的"10"字符串 - 调整代码顺序,先创建窗口再初始化
glyphs,解决编译错误 - 微调文本绘制的偏移量,避免字符紧贴窗口边缘
内容的提问来源于stack exchange,提问作者DeFan
相关产品推荐
相关产品推荐

