Skip to content
Snippets Groups Projects
basic.rs 2.2 KiB
Newer Older
use bevy::prelude::*;
use bevy::render::camera::ScalingMode;

use micro_banimate::definitions::{AnimationSet, AnimationStatus, DirectionalAnimationBundle};
use micro_banimate::directionality::{Directionality, Horizontal};

fn main() {
	App::new()
		.add_plugins(DefaultPlugins)
		.add_plugins(micro_banimate::BanimatePluginGroup)
		.add_systems(Startup, load_assets)
		.add_systems(PostStartup, spawn_assets)
		.add_systems(Update, process_input)
		.run();
}

#[derive(Default, Resource)]
struct ExampleAssets {
	spritesheet: Handle<TextureAtlas>,
	animations: Handle<AnimationSet>,
}

fn load_assets(
	mut commands: Commands,
	assets: Res<AssetServer>,
	mut atlas: ResMut<Assets<TextureAtlas>>,
) {
	let atlas_handle = atlas.add(TextureAtlas::from_grid(
		assets.load("character.png"),
		Vec2::new(48., 48.),
		10,
		6,
		None,
		None,
	));
	let anim_handle = assets.load("character.anim.json");

	commands.insert_resource(ExampleAssets {
		spritesheet: atlas_handle,
		animations: anim_handle,
	});
}

fn spawn_assets(mut commands: Commands, assets: Res<ExampleAssets>) {
	const WIDTH: f32 = 480.0;
	const HEIGHT: f32 = 320.0;

	commands.spawn((
		SpriteSheetBundle {
			texture_atlas: assets.spritesheet.clone_weak(),
			..Default::default()
		},
		DirectionalAnimationBundle::with_direction(
			"idle",
			assets.animations.clone_weak(),
			Directionality::Right,
		),
	));

	commands.spawn(Camera2dBundle {
		projection: OrthographicProjection {
			area: Rect::new(-(WIDTH / 2.0), -(HEIGHT / 2.0), WIDTH / 2.0, HEIGHT / 2.0),
			scaling_mode: ScalingMode::AutoMin {
				min_height: HEIGHT,
				min_width: WIDTH,
			},
			far: 1000.,
			near: -1000.,
			..Default::default()
		},
		..Default::default()
	});
}

fn process_input(
	input: Res<Input<KeyCode>>,
	mut status_query: Query<(&mut AnimationStatus, &mut Directionality)>,
) {
	for (mut status, mut direction) in &mut status_query {
		if input.just_released(KeyCode::Left) {
			direction.with_horizontal(Horizontal::Left);
		}

		if input.just_released(KeyCode::Right) {
			direction.with_horizontal(Horizontal::Right);
		}

		if input.just_released(KeyCode::Key1) {
			status.start_or_continue("idle");
		}

		if input.just_released(KeyCode::Key2) {
			status.start_or_continue("run");
		}
	}
}