From ac87e79f6b71f8e7277020581572e45918e45222 Mon Sep 17 00:00:00 2001 From: Matthew <logicprojectsforfpgas@gmail.com> Date: Thu, 9 Jun 2022 16:02:45 -0600 Subject: [PATCH] Added texture atlas example --- examples/texture_atlas.rs | 84 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 examples/texture_atlas.rs diff --git a/examples/texture_atlas.rs b/examples/texture_atlas.rs new file mode 100644 index 0000000..a5f4de0 --- /dev/null +++ b/examples/texture_atlas.rs @@ -0,0 +1,84 @@ +use bevy::{ + prelude::{App as BevyApp, AssetServer, Commands, Handle, Res, ResMut}, + window::WindowDescriptor, + DefaultPlugins, +}; +use kayak_core::styles::PositionType; +use kayak_ui::bevy::{BevyContext, BevyKayakUIPlugin, ImageManager, UICameraBundle}; +use kayak_ui::core::{ + render, + styles::{Style, StyleProp, Units}, + Index, +}; +use kayak_ui::widgets::{App, TextureAtlas}; + +fn startup( + mut commands: Commands, + asset_server: Res<AssetServer>, + mut image_manager: ResMut<ImageManager>, +) { + commands.spawn_bundle(UICameraBundle::new()); + + let image_handle: Handle<bevy::render::texture::Image> = asset_server.load("texture_atlas.png"); + let ui_image_handle = image_manager.get(&image_handle); + + //texture_atlas.png uses 16 pixel sprites and is 272x128 pixels + let tile_size = 16; + let columns = 272 / tile_size; + let rows = 128 / tile_size; + let atlas = bevy::sprite::TextureAtlas::from_grid(image_handle, bevy::prelude::Vec2::splat(tile_size as f32), columns, rows); + + //The sign in the top right of the image would be index 16 + let sign_index = 16; + //The flower is in the 6(-1) row and 15 collumn + let flower_index = columns * 5 + 15; + + let context = BevyContext::new(|context| { + let atlas_styles = Style { + position_type: StyleProp::Value(PositionType::ParentDirected), + width: StyleProp::Value(Units::Pixels(200.0)), + height: StyleProp::Value(Units::Pixels(200.0)), + ..Style::default() + }; + + let rect = atlas.textures[sign_index]; + let sign_position = rect.min; + let sign_size = rect.max - rect.min; + + let rect = atlas.textures[flower_index]; + let flower_position = rect.min; + let flower_size = rect.max - rect.min; + + render! { + <App> + <TextureAtlas styles={Some(atlas_styles)} + handle={ui_image_handle} + position={(sign_position.x, sign_position.y)} + tile_size={(sign_size.x, sign_size.y)} + /> + <TextureAtlas styles={Some(atlas_styles)} + handle={ui_image_handle} + position={(flower_position.x, flower_position.y)} + tile_size={(flower_size.x, flower_size.y)} + /> + </App> + } + }); + + commands.insert_resource(context); +} + +fn main() { + BevyApp::new() + .insert_resource(WindowDescriptor { + width: 1270.0, + height: 720.0, + title: String::from("UI Example"), + ..Default::default() + }) + .add_plugins(DefaultPlugins) + .add_plugin(BevyKayakUIPlugin) + .add_startup_system(startup) + .run(); +} + -- GitLab