Фон, недоступный в графике ggez

Вопрос или проблема

Как установить шрифт для текста?

Нужно отобразить простой текст на экране с помощью движка ggez. Но возникают следующие ошибки:

error[E0433]: не удалось разрешить: не удалось найти `Font` в `graphics`
  --> src/main.rs:11:30
   |
11 |         let font = graphics::Font::default();
   |                              ^^^^ не удалось найти `Font` в `graphics`

Код:

use ggez::{event, graphics, input, Context, GameResult};
use std::env;
use std::path;

struct MainState {
    font: graphics::Font,
}

impl MainState {
    fn new(ctx: &mut Context) -> GameResult<MainState> {
        let font = graphics::Font::new(ctx, "/path/to/font.ttf")?; // скажем, Font.Default();
        Ok(MainState { font })
    }
}

impl event::EventHandler for MainState {
    fn update(&mut self, _ctx: &mut Context) -> GameResult {
        Ok(())
    }

    fn draw(&mut self, ctx: &mut Context) -> GameResult {
        graphics::clear(ctx, [1.0, 1.0, 1.0, 1.0].into());

        let text = "Hello World!";
        let text_fragment = graphics::Text::new((text, self.font, 24.0));
        let text_dimensions = graphics::dimensions(ctx, &text_fragment)?;
        let text_position = graphics::Point2::new(
            (graphics::screen_width(ctx) - text_dimensions.w) / 2.0,
            (graphics::screen_height(ctx) - text_dimensions.h) / 2.0,
        );
        graphics::draw(ctx, &text_fragment, (text_position,))?;

        graphics::present(ctx)?;

        Ok(())
    }
}

fn main() -> GameResult {
    let resource_dir = if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") {
        let mut path = path::PathBuf::from(manifest_dir);
        path.push("resources");
        path
    } else {
        path::PathBuf::from("./resources")
    };

    let (mut ctx, mut event_loop) = ggez::ContextBuilder::new("hello_world", "ggez")
        .add_resource_path(resource_dir)
        .build()
        .expect("aieee, не удалось создать контекст ggez!");

    let state = MainState::new(&mut ctx)?;
    event::run(ctx, event_loop, state)
}

Ответ или решение

Чтобы решить проблему с ошибкой "could not find Font in graphics" в вашем коде на Rust с использованием ggez, необходимо убедиться, что вы используете корректный метод создания шрифта, так как по состоянию на текущую версию библиотеки (по состоянию на 2023 год), класс Font был изменен.

Ваш код можно исправить следующим образом:

  1. Используйте метод graphics::Font::new правильно, чтобы загружать шрифт из файла.
  2. Имейте в виду, что если вы хотите загрузить шрифт, то он должен находиться в папке resources, которую вы указали в вашем проекте.

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

use ggez::{event, graphics, input, Context, GameResult};
use std::env;
use std::path;

struct MainState {
    font: graphics::Font,
}

impl MainState {
    fn new(ctx: &mut Context) -> GameResult<MainState> {
        // Заменяем на правильный путь к файлу шрифта 
        let font = graphics::Font::new(ctx, "/path/to/font.ttf")?; 
        Ok(MainState { font })
    }
}

impl event::EventHandler for MainState {
    fn update(&mut self, _ctx: &mut Context) -> GameResult {
        Ok(())
    }

    fn draw(&mut self, ctx: &mut Context) -> GameResult {
        graphics::clear(ctx, [1.0, 1.0, 1.0, 1.0].into());

        let text = "Hello World!";
        // Создаем текстовый фрагмент с шрифтом
        let text_fragment = graphics::Text::new((text, &self.font, 24.0));
        let text_dimensions = text_fragment.dimensions(ctx); // обрабатываем размеры текста
        let text_position = graphics::Point2::new(
            (graphics::screen_width(ctx) - text_dimensions.w) / 2.0,
            (graphics::screen_height(ctx) - text_dimensions.h) / 2.0,
        );
        graphics::draw(ctx, &text_fragment, (text_position,))?;

        graphics::present(ctx)?;

        Ok(())
    }
}

fn main() -> GameResult {
    let resource_dir = if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") {
        let mut path = path::PathBuf::from(manifest_dir);
        path.push("resources");
        path
    } else {
        path::PathBuf::from("./resources")
    };

    let (mut ctx, mut event_loop) = ggez::ContextBuilder::new("hello_world", "ggez")
        .add_resource_path(resource_dir)
        .build()
        .expect("aieee, could not create ggez context!");

    let state = MainState::new(&mut ctx)?;
    event::run(ctx, event_loop, state)
}

Обратите внимание на следующие ключевые моменты:

  • Убедитесь, что ваш файл шрифта (например, font.ttf) находится по указанному в коде пути. Лучше переместите шрифт в папку resources вашего проекта и укажите путь относительно этой папки.
  • Используйте корректную загрузку шрифта, как показано выше.
  • У вас может возникнуть необходимость добавить/изменить зависимости в вашем Cargo.toml, если используете другие версии библиотек.

Эти изменения должны помочь вам устранить возникшую проблему и позволить корректно отображать текст с использованием заданного шрифта.

Оцените материал
Добавить комментарий

Капча загружается...