Skip to content
Snippets Groups Projects
basic.rs 2.31 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 {
Louis's avatar
Louis committed
	atlas: Handle<TextureAtlasLayout>,
	sprites: Handle<Image>,
	animations: Handle<AnimationSet>,
}

fn load_assets(
	mut commands: Commands,
	assets: Res<AssetServer>,
Louis's avatar
Louis committed
	mut atlas: ResMut<Assets<TextureAtlasLayout>>,
Louis's avatar
Louis committed
	let sprites = assets.load("character.png");
	let atlas = atlas.add(TextureAtlasLayout::from_grid(
Louis's avatar
Louis committed
		UVec2::new(48, 48),
		10,
		6,
		None,
		None,
	));
	let anim_handle = assets.load("character.anim.json");

	commands.insert_resource(ExampleAssets {
Louis's avatar
Louis committed
		sprites,
		atlas,
		animations: anim_handle,
	});
}

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

	commands.spawn((
Louis's avatar
Louis committed
		TextureAtlas {
			layout: assets.atlas.clone_weak(),
			index: 0,
		},
		SpriteBundle {
Louis's avatar
Louis committed
			texture: assets.sprites.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(
Louis's avatar
Louis committed
	input: Res<ButtonInput<KeyCode>>,
	mut status_query: Query<(&mut AnimationStatus, &mut Directionality)>,
) {
	for (mut status, mut direction) in &mut status_query {
Louis's avatar
Louis committed
		if input.just_released(KeyCode::ArrowLeft) {
			direction.with_horizontal(Horizontal::Left);
		}

Louis's avatar
Louis committed
		if input.just_released(KeyCode::ArrowRight) {
			direction.with_horizontal(Horizontal::Right);
		}

Louis's avatar
Louis committed
		if input.just_released(KeyCode::Digit1) {
Louis's avatar
Louis committed
		if input.just_released(KeyCode::Digit2) {