Что такое тип GlyphCache в функции для визуализации текста в Piston2d? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь написать отдельную функцию для рендеринга текста с помощью piston2d. Взяв пример hello_world.rs , я пытаюсь расширить его, чтобы я мог отображать текст внутри функции.

Вот код, который я написал:

extern crate piston_window;
extern crate find_folder;

use piston_window::*;

fn main() {
    let mut window: PistonWindow = WindowSettings::new(
            "piston: try to render text",
            [200, 200]
        )
        .exit_on_esc(true)
        .build()
        .unwrap();

    let assets = find_folder::Search::ParentsThenKids(3, 3)
        .for_folder("assets").unwrap();
    println!("{:?}", assets);
    let ref font = assets.join("FiraSans-Regular.ttf");
    let factory = window.factory.clone();
    let mut glyphs = Glyphs::new(font, factory, TextureSettings::new()).unwrap();

    window.set_lazy(true);
    while let Some(e) = window.next() {
        window.draw_2d(&e, |c, mut g| {
            clear([0.0, 0.0, 0.0, 1.0], g);
            render_text(10.0, 100.0, "Hello World", 32, c, &mut g, &mut glyphs);
        });
    }
}

fn render_text(x: f64, y: f64,
               text: &str, size: u32,
               c: Context, g: &mut G2d, 
               glyphs: &mut glyph_cache::rusttype::GlyphCache<GfxFactory, G2dTexture>) {
    text::Text::new(size).draw(
           text,
           &mut glyphs,
           &c.draw_state,
           c.transform.trans(x, y),
           g
        ).unwrap();
} 

Когда я пытаюсь запустить этот код, я получаю следующую ошибку:

error[E0277]: the trait bound `&mut piston_window::glyph_cache::rusttype::GlyphCache<'_, gfx_device_gl::factory::Factory, piston_window::Texture<gfx_device_gl::Resources>>: piston_window::character::CharacterCache` is not satisfied

the trait `piston_window::character::CharacterCache` is not implemented for `&mut piston_window::glyph_cache::rusttype::GlyphCache<'_, gfx_device_gl::factory::Factory, piston_window::Texture<gfx_device_gl::Resources>>`

Я пробовал много разных типов для glyphs, и это было самое дальнее, что я мог получить.

Каким должен быть тип? Любое руководство приветствуется.

1 Ответ

0 голосов
/ 17 сентября 2018

Проблема в том, что вы передаете изменяемую ссылку на изменяемую ссылку на GlyphCache на draw() (render_text получает изменяемую ссылку, а затем вы создаете изменяемую ссылку на что ).Просто измените &mut glyphs на glyphs в вызове на draw().

draw() ожидает изменяемой ссылки на тип, который реализует Graphics<Texture = <C as CharacterCache>::Texture>, а GlyphCache<GfxFactory, G2dTexture> реализует эту черту, но &mut GlyphCache<GfxFactory, G2dTexture> не.

Когда тип параметра функции является конкретным типом, компилятор автоматически разыменовывает ссылку, чтобы соответствовать ожидаемому типу ( Clippy имеет значение для идентификацииместа, где создаются ненужные ссылки).Однако, когда тип параметра функции является универсальным типом (как в данном случае), компилятор не будет пытаться это сделать.

...