ggezで画像を分割ロードする
今回読み込む素材
ぴぽや様からお借りしました。
本編
ソースコード
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();
}
実行結果
簡単な解説
画像ロード部分
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には
- src
- dest
- rotation
- scale
- offset
- shear
- color が渡せる。今回はこの内、src(画像のクロップ指定)とdest(画像の描画位置)を指定している。 srcの引数はクロップの開始 x座標、y座標、幅、高さの順。 ピクセル数で指定する方法が見当たらなかったのでそれぞれ比率で表現している(今回は320240の画像の左上から120120ピクセルをクロップしている)
蛇足
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);
}