ggezで画像を分割ロードする

今回読み込む素材

3x3shiro.png
ぴぽや様からお借りしました。

本編

ソースコード

ggez公式リポジトリのサンプルをもとに構成する。

extern crate ggez;

use ggez::conf;
use ggez::event;
use ggez::graphics;
use ggez::{Context, GameResult};

struct MainState {
    image: graphics::Image,
}

impl MainState {
    fn new(ctx: &mut Context) -> GameResult<MainState> {
        let image = graphics::Image::new(ctx, "/shiro.png")?;
        let s = MainState {
            image,
        };
        Ok(s)
    }
}

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);
        graphics::draw_ex(
            ctx,
            &self.image,
            graphics::DrawParam {
                src: graphics::Rect::new(0., 0., 120. / 320., 120. / 240.),
                dest: graphics::Point2::new(0.0, 0.0),
                .. Default::default()
            },
        ).expect("cannot draw tile");
        graphics::present(ctx);
        Ok(())
    }
}

pub fn main() {
    let c = conf::Conf::new();
    let ctx = &mut Context::load_from_conf("super_simple", "ggez", c).unwrap();
    let state = &mut MainState::new(ctx).unwrap();
    event::run(ctx, state).unwrap();
}

実行結果

shiroexe.jpg

簡単な解説

画像ロード部分

let image = graphics::Image::new(ctx, "/shiro.png")?;

実際の描画

graphics::draw_ex(
    ctx,
    &self.image,
    graphics::DrawParam {
        src: graphics::Rect::new(0., 0., 120. / 320., 120. / 240.),
        dest: graphics::Point2::new(0.0, 0.0),
        .. Default::default()
    },
).expect("cannot draw tile");

DrawParamでパラメータを渡すためにdraw_exを使用している。 DrawParamには

蛇足

ggez本家サンプルに毎回書かれている、resourcesディレクトリを読み込み対象に追加する処理(下記)を書かなくてもresourcesディレクトリから画像がロード出来てしまったのだが、どこかしらでそういう仕様に修正されたのだろうか…? 環境依存のようです。記述しておいた方が良さそうです。

if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") {
    let mut path = path::PathBuf::from(manifest_dir);
    path.push("resources");
    ctx.filesystem.mount(&path, true);
}